情况如下。我正在调查ARM二进制文件。使用objdump -T
查看动态符号表时,输出显示我(摘自实际案例):
DYNAMIC SYMBOL TABLE:
00000000 DF *UND* 00000000 __cxa_finalenter
....
00002055 g DF .text 00000060 SomeFunction
...
0000818c g DF .text 00000008 _Unwind_GetTextReleaseBase
....
并且符号的反汇编给出了以下(objdump -d
):
...
00002054 <SomeFunction>:
2054: b5f7 push {r0, r1, r2, r4, r5, r6, r7, lr}
2056: 1c04 adds r4, r0, #0
2058: 4815 ldr r0, [pc, #84]
...
0000818c <_Unwind_GetTextRelBase>:
818c: e92d4008 push {r3, lr}
8190: ebffe79c bl 2008 <abort@plt>
我的问题是,正如您所看到的,SomeFunction
的动态符号表中指定的值是0x2055,但实际的反汇编从0x2054开始。但是,对于_Unwind_GetTextRelBase
,程序集从符号表中指定的地址开始。这背后的逻辑是什么?如何以编程方式识别正确的起始地址?