10

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

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

例如:

j label1 + label2

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

4

3 回答 3

7

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

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

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

于 2008-12-06T22:09:58.040 回答
0

我知道关于 ELF 的杰克,并且只知道一点关于链接的信息,但是......

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

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

于 2008-12-06T19:33:06.203 回答
0

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

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

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

于 2008-12-07T00:32:49.873 回答