.word 的地址在我的可执行目标文件的 objdump 中意味着什么?
what does .word's address mean in objdump of my executable object file?
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
。
看起来that指的是一些单词的地址,但是在我的可执行目标文件中没有像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 }
objdump
无法将您正在反汇编的二进制内容的那部分识别为一条指令,它只是将其显示为 32 位数据块:
00097568 .word 0x00097568
这就是.word
的意思。可以看到右边的值(显示为.word
的)和左边的值(二进制编码)是一样的:0x00097568
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
。
看起来that指的是一些单词的地址,但是在我的可执行目标文件中没有像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 }
objdump
无法将您正在反汇编的二进制内容的那部分识别为一条指令,它只是将其显示为 32 位数据块:
00097568 .word 0x00097568
这就是.word
的意思。可以看到右边的值(显示为.word
的)和左边的值(二进制编码)是一样的:0x00097568