Измените собственную ОС с 32-битной на 64-битную

#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) -T


lt; -o $@ $(objects)

install: mykernel.bin
sudo cp


lt; /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) -T


lt; -o $@ $(objects)

install: mykernel.bin
sudo cp


lt; /boot/mykernel.bin

компоновщик.ld

 ENTRY(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. Пожалуйста, отредактируйте вопрос, чтобы включить его затем.