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

Assembly ELF格式的可重定位符号(汇编语言),assembly,gnu,elf,Assembly,Gnu,Elf,我们正在为客户机架构开发GNU汇编程序端口。 现在面临的问题是: 如果指令的立即数操作数是包含多个可重定位符号的表达式,则如何在elf格式的输出文件中处理它。在这种情况下,会产生哪些搬迁信息 例如: j label1 + label2 如果label1和label2是在可重新定位的部分中定义的,那么它们可能是相同的部分,也可能是不同的可重新定位的部分。我对jack了解ELF,对链接只了解一点,但是 我希望每个操作数的处理方式与只有一个操作数时相同 问题可能是j的格式根据标签的位置而改变?如果是

我们正在为客户机架构开发GNU汇编程序端口。 现在面临的问题是:

如果指令的立即数操作数是包含多个可重定位符号的表达式,则如何在elf格式的输出文件中处理它。在这种情况下,会产生哪些搬迁信息

例如:

j label1 + label2

如果label1和label2是在可重新定位的部分中定义的,那么它们可能是相同的部分,也可能是不同的可重新定位的部分。

我对jack了解ELF,对链接只了解一点,但是

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


问题可能是
j
的格式根据标签的位置而改变?如果是这样的话,我认为你是沉沦了,因为链接器不够聪明,不能做那种事情(ADA构建系统IIRC可能比大多数系统更聪明,所以你可以看看它。)

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

ELF重定位类型完全依赖于CPU(或者更准确地说,依赖于ISA),因此您可以自由定义新体系结构所需的任何重定位


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

我希望每个需要重新定位的指令的每个地址都有一个条目

Objdump可能能够显示可执行文件或对象文件的重新定位表,但我现在还不知道这些标志

我的建议是尝试挖掘一条x86(或其他CISC)指令,该指令执行类似于您的客户机arch的操作,并查看在组装/链接它时生成了哪些重定位