我正在查看我刚刚构建的可执行文件的反汇编,我对此行可能意味着什么感到困惑:
00000000 <func_foo>:
0: e1a0100d mov r1, sp
4: e59fd090 ldr sp, [pc, #144]
8: e92d4002 push {r1, lr}
c: eafffffe b c <func_foo+0xc> ;;; <<----- HERE
分支指令有一个进位(c)设置,但它只是分支到它自己。它看起来像一个无限循环,但我没有插入这个代码;它完全由编译器生成(GCC 4.6.3)。
有人可以对此有所了解吗?
答案 0 :(得分:2)
指令不是“bc”,而是“b 0xc”。 (带有第一个十六进制数字“E”的ARM指令是无条件指令)。
“&lt; func_foo + 0xc&gt;”是一些信息,表示在函数func_foo启动后地址0xc(跳转目标)为0xc字节。这在具有多种功能的程序中是有意义的,因为它不容易看到。
答案 1 :(得分:1)
如果是分支,如果进行或分支,如果进行清除,您会看到 bcs 或 bcc >,您将看到 b 0xC ,这是当前地址。
从技术上讲,它是一个自我指令的分支,编码不是特定的或硬编码到0xC它只是pc-2指令的一个分支,因为pc是2指令,它是自我的分支。 (分支到instruction_address + 2 - 2 =分支到instruction_address)
这看起来像你基于0x00000的地址和自己的分支反汇编了一个对象,未链接的代码。当您与其他内容链接时,地址应该更改,并且分支到self将更改为分支到您在源中指定的任何功能。