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

10
我们正在为一个客户端架构开发GNU汇编器的移植版本。 现在面临的问题是: 如果指令的立即操作数是涉及多个可重定位符号的表达式,它在ELF格式输出文件中会如何处理。在这种情况下将产生什么重新定位信息? 例如:
j label1 + label2

标签1和标签2被定义在可重定位部分,它们可以是相同的部分或不同的可重定位部分。

3个回答

7
ELF并不知道指令本身,它只知道指令内符号偏移量的特定编码方式。在汇编器中,您需要输出两个重定位记录,每个记录都带有相应的[地址、类型、符号]三元组,以正确修补该部分指令。链接器甚至可能不知道这两个记录指向同一条指令。
ELF重定位类型完全依赖于CPU(或者更准确地说是ISA),因此您可以自由定义新体系结构所需的任何重定位。
没有指令编码详细信息很难提供更具体的解释。

0

我对 ELF 一无所知,对链接也只知道一点点...

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

另一方面,问题可能是 j 的格式会根据标签的位置而改变。如果是这样,我认为你会失败,因为链接器没有足够聪明来做这种事情(如果我没记错的话,ADA 构建系统可能比大多数链接器更聪明,所以你可以看看它。)


0
我期望每个需要重定位的指令都会有一个地址条目。
Objdump 可能能够显示可执行文件或对象文件的重定位表,但我不知道标记是什么。
我的建议是尝试挖掘一个类似于您客户端架构所做的事情的 x86(或其他 CISC)指令,并查看在汇编/链接时生成了哪些重定位。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接