我们正在为客户端架构开发GNU Assembler的端口。 现在面临的问题是:
如果指令的立即操作数是涉及多个可重定位符号的表达式,那么它是如何在elf格式的输出文件中处理的。在这种情况下产生的搬迁信息是什么?
例如:
j label1 + label2
其中label1和label2在可重定位部分中定义,它们可能是相同的部分或不同的可重定位部分。
答案 0 :(得分:7)
ELF本身并不了解说明。它知道指令中符号偏移的特定编码。在汇编程序中,您需要输出两个重定位记录,每个记录具有相应的[地址,类型,符号]三元组,以正确修补指令的该部分。链接器甚至不一定知道这两个记录指向同一条指令。
ELF重定位类型完全取决于CPU(或者更确切地说,取决于ISA),因此您可以自由定义新架构所需的任何重定位。
如果没有指令编码的细节,很难更具体。
答案 1 :(得分:0)
我知道关于ELF的杰克,还有关于链接的更多信息,但......
我希望每个操作数的处理方式与只有一个操作数的方式相同。
OTOH问题可能是j
的格式会根据标签的位置而改变吗?如果是这样的话,我认为你已经沉没,因为连接器不够聪明,无法做到这一点(ADA构建系统IIRC可能比大多数人更聪明,所以你可能会看到它。)
答案 2 :(得分:0)
对于每个需要重定位的指令,我希望每个地址有一个条目。
Objdump可能能够显示可执行文件或目标文件的重定位表,但我不知道这些标记。
我的建议是尝试挖掘x86(或其他CISC)指令,该指令执行类似于客户端arch的操作,并查看在汇编/链接时生成的重定位。