Intereting Posts
Обнаружение протокола TLS с помощью приветствия клиента Строковые литералы против массива символов при инициализации указателя Сумма всех кратных 3 или 5 ниже 1000 дает неправильный ответ в C Как я могу объявить переменную по абсолютному адресу с GCC? Должен ли я считать, что объявление всех статических функций C является хорошей оценкой? C Вопрос: почему char фактически занимает 4 байта в памяти? многомерные массивы и переносные буферы установить самый старший бит в C Сгенерированный код Tiny C Compiler генерирует дополнительные (ненужные?) NOP и JMP константы и указатели на указатели GDB предотвращает ошибки Как удалить текст, относящийся к выполнению, из выходного windows Code :: Blocks Каковы различия между if, else и else if? измерение времени выполнения кода в C с помощью команды RDTSC C – простое выражение для подсчета комбинаций в диапазоне чисел?

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

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

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

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

Вот содержимое test.c

 __asm__(".code16\n"); __asm__("jmpl $0x0000, $main\n"); void main() { } 

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

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

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

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

РЕДАКТИРОВАТЬ:

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

 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 

И из-за этого я не пробовал окончательную линию компиляции.

Вот код для файла test.ld.

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

Любые предложения по устранению этого?

Поставка -m32 вместо -march=i686 .

на самом деле add -m32 вы можете сохранить -march = 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 

терпит неудачу;

test.c: 1: 0: ошибка: выбранный вами CPU не поддерживает набор команд x86-64 asm (“.code16 \ n”);

 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