#makefile #ld
Вопрос:
Я пишу свою собственную операционную систему. Но в учебнике (https://github.com/AlgorithMan-de/wyoos/commit/7eb9f8a1d5089cf7587e553e601c42db34dc94a2) он пишет его для арки i386 с x86_32. Но теперь я хочу изменить его на x86_64.
Теперь мне нужно заменить несколько вещей в файле Makefile и в компоновщике (например, OUTPUT_ARCH ()), но сейчас я не знаю, что мне там писать вместо этого.
компоновщик.ld
ENTRY(loader)
OUTPUT_FORMAT(elf32-i386)
OUTPUT_ARCH(i386:i386)
SECTIONS
{
. = 0x0100000;
.text :
{
*(.multiboot)
*(.text*)
*(.rodata)
}
.data :
{
start_ctors = .;
KEEP(*( .init_array ));
KEEP(*(SORT_BY_INIT_PRIORITY( .init_array.* )));
end_ctors = .;
*(.data)
}
.bss :
{
*(.bss)
}
/DISCARD/ : { *(.fini_array*) *(.comment) }
}
Создать файл
GCCPARAMS = -m32 -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exceptions -fno-leading-underscore ASPARAMS = --32 LDPARAMS = -melf_i386 objects = loader.o kernel.o %.o: %.cpp gcc $(GCCPARAMS) -c -o $@
lt;
%.o: %.s
as $(ASPARAMS) -o $@lt;
mykernel.bin: linker.ld $(objects)
ld $(LDPARAMS) -Tlt; -o $@ $(objects)
install: mykernel.bin
sudo cplt; /boot/mykernel.bin
РедактироватьТеперь я отредактировал файл Makefile и компоновщик.ld
Создать файл
GCCPARAMS = -m64 -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exceptions -fno-leading-underscore ASPARAMS = --64 LDPARAMS = -melf_x86_64 objects = loader.o kernel.o %.o: %.cpp gcc $(GCCPARAMS) -c -o $@
lt;
%.o: %.s
as $(ASPARAMS) -o $@lt;
mykernel.bin: linker.ld $(objects)
ld $(LDPARAMS) -Tlt; -o $@ $(objects)
install: mykernel.bin
sudo cplt; /boot/mykernel.bin
компоновщик.ldENTRY(loader) OUTPUT_FORMAT(elf64-x86-64) OUTPUT_ARCH(i386:x86-64) SECTIONS { . = 0x0100000; .text : { *(.multiboot) *(.text*) *(.rodata) } .data : { start_ctors = .; KEEP(*( .init_array )); KEEP(*(SORT_BY_INIT_PRIORITY( .init_array.* ))); end_ctors = .; *(.data) } .bss : { *(.bss) } /DISCARD/ : { *(.fini_array*) *(.comment) } }
Но когда я пытаюсь скомпилировать его (
ld -melf_x86_64 -T linker.ld -o mykernel.bin loader.o kernel.o
), я получаю ошибку:ld: loader.o: in function 'loader': (.text 0x6): undefined reference to 'eax' ld: (.text 0xb): undefined reference to 'ebx' ld: (.text 0x20): undefined reference to 'kernelMain'
Я думаю, что мне нужно установить binutil, но я не знаю, какой именно.
Кто-нибудь может помочь мне найти правильный?
Комментарии:
1. Нужна ссылка на учебник, на который есть ссылка здесь.
2. github.com/AlgorithMan-de/wyoos/commit/… это код из учебника
3. Пожалуйста, отредактируйте вопрос, чтобы включить его затем.