Неподдерживаемая ошибка набора инструкций x86-64 при компиляции файла C

Я пытаюсь следовать учебник в этой ссылка.

когда я подошел к той части, где я начинаю делать тест.файл c, я пытаюсь запустить первую строку компиляции.

gcc -c -g -Os -march=i686 -ffreestanding -Wall -Werror test.c -o test.o

вот содержание test.c

__asm__(".code16n");
__asm__("jmpl x0000, $mainn");

void main() {
}

когда я вызываю первую строку компиляции, она показывает мне эту ошибку.

test.c:1:0: error: CPU you selected does not support x86-64 instruction set
 __asm__(".code16n");
 ^

может кто-нибудь сказать мне, почему это происходит? И если возможно, как это исправить?

Я запускаю Ubuntu Desktop x64, заранее спасибо за вашу помощь.

EDIT:

Я изменил первую строку компиляции:

gcc -c -g -Os -m32 -ffreestanding -Wall -Werror test.c -o test.o

и, кажется, работает нормально. Однако есть еще две строчки, которые меня беспокоят.

ld -static -Ttest.ld -nostdlib --nmagic -o test.elf test.o

и

objcopy -O binary test.elf test.bin

первый бросает мне ошибку.

ld: i386 architecture of input file `test.o' is incompatible with i386:x86-64 output

и из-за этого, я не пробовал последнюю строку компиляции.

вот код для тест.файл ЛД.

ENTRY(main);
SECTIONS
{
    . = 0x7C00;
    .text : AT(0x7C00)
    {
        *(.text);
    }
    .sig : AT(0x7DFE)
    {
        SHORT(0xaa55);
    }
} 

любые предложения о том, как это исправить?

3 ответов


источник -m32 вместо -march=i686.


в самом деле добавить -m32 вы можете сохранить-март=i686 ...

gcc -c -g -Os -march=i686 -m32 -ffreestanding -Wall -Werror test.c -o test.o

работает

gcc -c -g -Os -march=i686 -m16 -ffreestanding -Wall -Werror test.c -o test.o

работает

gcc -c -g -Os -march=i686 -m64 -ffreestanding -Wall -Werror test.c -o test.o

завершается с ;


gcc -std=c99 -c -g -Os -march=i686 -m32 -ffreestanding -Wall -Werror test.c -o test.o
ld -static -T test.ld -m elf_i386 -nostdlib --nmagic -o test.elf test.o