【问题标题】:what does .word's address mean in objdump of my executable object file?.word 的地址在我的可执行目标文件的 objdump 中是什么意思?
【发布时间】:2017-08-06 06:23:37
【问题描述】:
793 00010cfc <main>:
    794    10cfc:       e92d4800        push    {fp, lr}
    795    10d00:       e28db004        add     fp, sp, #4
    796    10d04:       e24dd008        sub     sp, sp, #8
    797    10d08:       e3a03000        mov     r3, #0
    798    10d0c:       e50b3008        str     r3, [fp, #-8]
    799    10d10:       e51b3008        ldr     r3, [fp, #-8]
    800    10d14:       e2833001        add     r3, r3, #1
    801    10d18:       e50b3008        str     r3, [fp, #-8]
    802    10d1c:       e59f3040        ldr     r3, [pc, #64]   ; 10d64 
    <main+0x68>
    803    10d20:       e5933000        ldr     r3, [r3]
    804    10d24:       e51b2008        ldr     r2, [fp, #-8]
    805    10d28:       e0823003        add     r3, r2, r3
    806    10d2c:       e50b3008        str     r3, [fp, #-8]
    807    10d30:       e59f3030        ldr     r3, [pc, #48]   ; 10d68 
    <main+0x6c>
    808    10d34:       e3a02014        mov     r2, #20
    809    10d38:       e5832000        str     r2, [r3]
    810    10d3c:       e59f3028        ldr     r3, [pc, #40]   ; 10d6c 
    <main+0x70>
    811    10d40:       e3a0201e        mov     r2, #30
    812    10d44:       e5832000        str     r2, [r3]
    813    10d48:       e59f0020        ldr     r0, [pc, #32]   ; 10d70 
    <main+0x74>
    814    10d4c:       e51b1008        ldr     r1, [fp, #-8]
    815    10d50:       eb001917        bl      171b4 <_IO_printf>
    816    10d54:       e3a03000        mov     r3, #0
    817    10d58:       e1a00003        mov     r0, r3
    818    10d5c:       e24bd004        sub     sp, fp, #4
    819    10d60:       e8bd8800        pop     {fp, pc}
    820    10d64:       00097568        .word   0x00097568
    821    10d68:       000991b0        .word   0x000991b0
    822    10d6c:       000983f4        .word   0x000983f4
    823    10d70:       00070944        .word   0x00070944

我想重点关注第 802 行和第 820 行。 当我objdump -d ./program 时,有.word。 看起来那是指某些单词的地址,但在我的可执行目标文件中没有像0x00097568 这样的地址。 当我使用gdb 时,它会执行如下操作

0x00010d64 <+104>:   andeq   r7, r9, r8, ror #10

所以,我猜0x00097568 来自那个操作,但0x00097568 是什么意思?

请注意,我在制作可执行目标文件时提供了-static 选项。

这是我的 program.c 代码

 1 #include <stdio.h>
 2 int val1=10;
 3 int val2;
 4 static val3;
 5
 6 int main() {
 7   int a=0;
 8   a=a+1;
 9   a=a+val1;
10
11   val2=20;
12   val3=30;
13
14   printf("a : %d\n",a);
15   return 0;
16
17 }

【问题讨论】:

    标签: assembly arm objdump


    【解决方案1】:

    objdump 不会将您正在反汇编的那部分二进制内容识别为指令,它只是将其显示为 32 位数据块:

    00097568        .word   0x00097568
    

    这就是.word 的意思。可以看到右边的值(用.word显示的那个)和左边的一样(二进制编码):0x00097568

    【讨论】:

    • 感谢您的回答!我通过'objdump -Dslx'检查了'address 00097568'包含的内容。现在我知道 00097568 是 .data 部分中的地址。但我仍然不知道他们为什么要'andeq r7, r9, r8, ror #10'来获得00097568。gcc编译器是否通过andeq选择全局变量地址?它是一种机制吗?
    • @doosol-Lee 不,计算机中的值以位(0 和 1)编码。一个“字”是 32 位,它是 ARM CPU 中值的基本工作大小。指令也以 32 位值的形式存储在内存中(单条指令 = 1 个字,因为 ARM 类似于具有固定指令大小架构的 RISC)。所以你可以在内存中定义任何随机的 32 位值,如果你将强制反汇编器反汇编它,它很可能会产生一些有效的指令,就像在这种情况下 gcc 确实需要值 00097568 指向 @987654329 @段,计算为地址,不知道andeq产生。
    • @doosol-Lee 你也可以在这里查看即将被删除的文档machine code,也许它会更有意义。顺便说一句,您可能会问为什么 gcc 确实需要内存中的该值作为单词,并且它与上面的评论令人惊讶地相关。由于您只有 32 位用于指令编码,因此您无法将 registerX = 32bit value; 编码为单个字(该值将占用所有位,指令操作码没有剩余位)。在 ARM 上,编译器通常会从内存中加载值。
    • 并不是 objdump “无法识别”这个。据我所知,ARM 的 ELF 变体有一个特殊的调试部分,告诉反汇编程序哪些词是指令,哪些是文字池的一部分。您可以通过用.word 0xe92d4800 组装一个文件来验证这一点,该文件对应于push {fp, lr},但由于这个特殊的调试数据,它仍然打印为.word e92d4800
    • @jeremfg 不要在别人的问题下发布 cmets 来问自己的问题。相反,请提出一个新问题。
    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2020-05-19
    • 2012-12-11
    • 2011-10-03
    相关资源
    最近更新 更多