例如,我有objdump
获得的以下汇编代码。 f()
的地址为080001d4
。但printf("%x", f)
输出080001d5
。 f()
可以(*((int (*)())080001d5))()
(*((int (*)())080001d4))()
完成080001d4 <f>:
80001d4: 2000 movs r0, #0
80001d6: 4770 bx lr
。
为什么函数地址中有一个字节偏移?
{{1}}
答案 0 :(得分:3)
ARM有两种指令模式,地址的最低有效位用于指示给定函数使用的模式。 Thumb模式的奇数地址,甚至是ARM模式的地址。
即使您使用-marm
开关重新编译它,地址仍然是。