gpt4 book ai didi

assembly - 目标文件中的符号表和重定位表

转载 作者:行者123 更新时间:2023-12-02 21:40:02 26 4
gpt4 key购买 nike

据我了解,目标文件中的指令和数据都有地址。第一个数据项从地址 0 开始,第一条指令也从地址 0 开始。

重定位表包含有关在文件中的地址发生更改时需要更新的指令的信息,例如,如果文件与另一个文件链接在一起。在下面的示例中,A 行将位于重定位表中。我认为 B 不会出现在重定位表中,因为标签“equal”的地址是相对于 B 的。这些假设正确吗?

我知道符号表显示文件具有的标签以及尚未解析的标签。但是符号表还包含哪些其他信息?

此外,当汇编器将指令翻译为二进制时,那些具有未解析引用的指令中会放置什么?本例中为 B。

.data
TEXT: .asciiz "Foo"

.text
.global main
main:
li t0, 1
beq t0, 1, equal #B

equal:
la a0, TEXT
jal printf #A

最佳答案

是的,您的假设是正确的。重定位有多种类型,汇编器发出的指令取决于类型。一般来说,它是要添加的偏移量。您可以使用objdump -dr查看搬迁。为了更好地说明,我对您的代码做了一些更改:

.data
.int 0
TEXT: .asciiz "Foo"
.text
.global main
main:
li $t0, 1
beq $t0, 1, equal #B
bne $t0, 42, foo #C

equal:
la $a0, TEXT
jal printf #A

objdump 的输出:

00000000 <main>:
0: 24080001 li t0,1
4: 24010001 li at,1
8: 11010004 beq t0,at,1c <equal>
c: 00000000 nop
10: 2401002a li at,42
14: 1501ffff bne t0,at,14 <main+0x14>
14: R_MIPS_PC16 foo
18: 00000000 nop

0000001c <equal>:
1c: 3c040000 lui a0,0x0
1c: R_MIPS_HI16 .data
20: 0c000000 jal 0 <main>
20: R_MIPS_26 printf
24: 24840004 addiu a0,a0,4
24: R_MIPS_LO16 .data

正如您所说,beq 没有重新定位因为这是该目标文件中的相对地址。

bne我添加了(标有 C 的行)引用外部符号,因此即使地址是相对的,也需要重定位条目。其类型为 R_MIPS_PC16生成符号 foo 的 16 位有符号字偏移量。由于指令编码需要从下一个字开始的偏移量,而不是当前的 PC重定位使用的 1必须相减,编码为 2 的补码 ffff进入指令本身。

la伪指令已被汇编器翻译成 lui/addiu对(后者位于 jal 的延迟槽中)。对于lui一个R_MIPS_HI16重定位是根据 .data 创建的部分将填充前 16 位。由于符号TEXT位于地址4.data部分,偏移量的前 16 位为 0 。这意味着指令包含 0抵消。同样,对于低 16 位,除了指令包含偏移量 4 之外。 .

最后,jal printf正在使用另一种重定位,该重定位是针对指令所需的编码而定制的。偏移量为零,因为跳转直接到引用的符号。请注意,objdump 试图通过解码来提供帮助,但它不处理重定位,因此 <main>它输出的当然是废话。

关于assembly - 目标文件中的符号表和重定位表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16749522/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com