在Linux下的16位链接

当我使用命令“nasm -f elf -l hello.lst hello.asm”时,我正在使用NASM汇编程序,但是当与gcc“gcc -o hello hello.o”链接时,它会生成一个错误:

hello.asm 🙁 .text + 0x4):重定位被截断为适合:R_386_16对`.data'collect2:ld返回1退出状态

我了解到,这是gcc和16位的一些问题

任何解决scheme

Linux甚至没有16位的子系统 – 即使你有gcc链接它,你仍然无法执行它! 你为什么不使用.bits 32

几年前和今年我都面临同样的情况。

处理这个问题的两种方法是:

  1. 编写你自己的16位友好的链接器(至少需要解析.rel.text部分)。
  2. 使用一个基本符号(或多个符号)来手动计算绝对地址(.rel部分仍然被创建,但可以被删除)。 但是,这种方法很容易出错。

我总是最终做2,但我应该花时间写一个链接器(或修补GNU IDD …)。