Вопрос

Я использую ассемблер 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?

Другие советы

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

Два способа разобраться с этим:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top