ELF格式的可重定位符号(汇编语言)

时间:2008-12-06 18:26:59

标签: assembly gnu elf

我们正在为客户端架构开发GNU Assembler的端口。 现在面临的问题是:

如果指令的立即操作数是涉及多个可重定位符号的表达式,那么它是如何在elf格式的输出文件中处理的。在这种情况下产生的搬迁信息是什么?

例如:

j label1 + label2

其中label1和label2在可重定位部分中定义,它们可能是相同的部分或不同的可重定位部分。

3 个答案:

答案 0 :(得分:7)

ELF本身并不了解说明。它知道指令中符号偏移的特定编码。在汇编程序中,您需要输出两个重定位记录,每个记录具有相应的[地址,类型,符号]三元组,以正确修补指令的该部分。链接器甚至不一定知道这两个记录指向同一条指令。

ELF重定位类型完全取决于CPU(或者更确切地说,取决于ISA),因此您可以自由定义新架构所需的任何重定位。

如果没有指令编码的细节,很难更具体。

答案 1 :(得分:0)

我知道关于ELF的杰克,还有关于链接的更多信息,但......

我希望每个操作数的处理方式与只有一个操作数的方式相同。

OTOH问题可能是j的格式会根据标签的位置而改变吗?如果是这样的话,我认为你已经沉没,因为连接器不够聪明,无法做到这一点(ADA构建系统IIRC可能比大多数人更聪明,所以你可能会看到它。)

答案 2 :(得分:0)

对于每个需要重定位的指令,我希望每个地址有一个条目。

Objdump可能能够显示可执行文件或目标文件的重定位表,但我不知道这些标记。

我的建议是尝试挖掘x86(或其他CISC)指令,该指令执行类似于客户端arch的操作,并查看在汇编/链接时生成的重定位。