首先说明
BL main 为相对跳转指令,与位置无关代码。
LDR PC,=main 为绝对跳转指令,与位置有关代码。
可能看到这的人都有疑问,如下图。链接地址为0x50000000。
两段代码main函数位置如下图:
左右图的第11行 左边是 bl main的反汇编为 “ bl 50000298 ”,右边是 ldr pc,=main的反汇编为 " ldr pc,[pc, #4] "
乍一看第一个 bl 50000298 不是直接跳转到 50000298么,那不就是绝对跳转? ,第二个使用 ldr pc,[pc, #4],使用的时pc偏移量不是相对跳转么?
那你就中记了。
arm-linux-objdump的反汇编太贴心了。
左边图:
反汇编软件在反汇编的时候把你的bl mian这条语句中的main的地址帮你计算了出来。但是,,它并不是按照你的实际运行地址计算的而是按照你的链接地址来的,
所以就出现了bl 50000298;正如左边图示的main函数位置。