16-битная ссылка под Linux
Вопрос
Я использую ассемблер NASM под Linux, когда я использую команду «NASM -F ELF -L Hello.lst Hello.asm», он работает нормально, но при связи с GCC "GCC -O Hello Hello.o" он генерирует ошибку:
Здравствуйте .asm :(. Text + 0x4): Переезд усечена, чтобы соответствовать: R_386_16 против `.data 'Collect2: LD Возврат 1 Состояние выхода
Я узнал, что это некоторая проблема с GCC и 16-битным
Любые решения?
Решение
Linux даже не имеет 16-битной подсистемы - даже если у вас есть GCC, чтобы связать это, вы все еще не могли его выполнить! Почему бы тебе не просто использовать .bits 32
?
Другие советы
Я столкнулся с той же ситуацией несколько лет назад и снова в этом году.
Два способа разобраться с этим:
- Напишите свой собственный 16-битный дружелюбный линкер (вам нужно по крайней мере, разбираться в раздел .rel.text).
- Используйте базовый символ (или символы) для расчета абсолютных адресов вручную (разделы .rel все еще созданы, но могут быть удалены). Тем не менее, этот метод очень подвержен ошибке.
Я всегда в конечном итоге делаю 2, но я должен надо иметь время, чтобы написать линкер (или исправить GNU LD ...).