16-битная линковка под linux - PullRequest
       36

16-битная линковка под linux

3 голосов
/ 04 декабря 2010

Я использую 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-битной

какие решения?

Ответы [ 2 ]

3 голосов
/ 04 декабря 2010

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

0 голосов
/ 04 июля 2015

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

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

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

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

...