16-битное связывание под linux

Я использую NASM Assembler под Linux, когда я использую команду «nasm -f elf -l hello.lst hello.asm», он работает нормально, но при связывании с gcc «gcc -o hello hello.o» выдает ошибку:

hello.asm :(. text + 0x4): перемещение усечено, чтобы соответствовать: R_386_16 против .data collect2: ld вернул 1 статус выхода

Я узнал, что это какая-то проблема с gcc и 16-битным

любые решения?


person Vanddel    schedule 04.12.2010    source источник
comment
Имеется ли в вашей установке gcc 16-разрядная библиотека времени выполнения по умолчанию?   -  person Peter G.    schedule 04.12.2010
comment
Похоже, вам не хватает частей вашей цепочки инструментов кросс-компилятора.   -  person Ben Voigt    schedule 05.12.2010


Ответы (2)


В Linux даже нет 16-битной подсистемы - даже если у вас есть gcc для ее связывания, вы все равно не сможете ее запустить! Почему бы тебе просто не использовать .bits 32?

person Fabian Giesen    schedule 04.12.2010
comment
Если вам нужно написать 16-битный код для домашнего задания, я рекомендую сделать это в DOSBox и использовать компоновщик DOS (у NASM в какой-то момент были регулярные выпуски DOS, не уверен, что все еще есть). Мне неизвестен какой-либо перенос GCC / binutils на 16-разрядную версию x86, независимо от ОС (ближайшая вещь - DJGPP, но она все еще 32-разрядная и требует расширителя DOS). - person Fabian Giesen; 06.12.2010

Я столкнулся с той же ситуацией несколько лет назад и снова в этом году.

Есть два способа справиться с этим:

  1. Напишите свой собственный 16-битный дружественный компоновщик (вам нужно как минимум разобрать секцию .rel.text).
  2. Используйте базовый символ (или символы) для вычисления абсолютных адресов вручную (разделы .rel все еще создаются, но их можно удалить). Однако этот метод очень подвержен ошибкам.

Я всегда заканчиваю тем, что делаю 2, но мне, вероятно, следует найти время, чтобы написать компоновщик (или исправить GNU ld ...).

person Ismael Luceno    schedule 03.07.2015