【发布时间】:2013-09-10 20:39:59
【问题描述】:
我正在查看我刚刚构建的可执行文件的反汇编,我对这行可能意味着什么感到困惑:
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)。
任何人都可以对此有所了解吗?
【问题讨论】:
-
进位设置?你怎么看?你能展示你的函数的 C 源代码吗?正如您所建议的那样,该指令显然是一个无限循环。
-
您是否正在反汇编动态链接的可执行文件,并因此查看尚未解决的库函数调用的占位符?
-
@unixsmurf 可能在正确的轨道上,尽管它不需要动态链接。如果您在
func_foo的末尾对来自不同翻译单元的函数进行了尾调用,则编译器可能会发出您所看到的内容。可以显示出处吗? -
@CarlNorum:嗯,MarkP 说的是“可执行文件”而不是“目标文件”:) 如果这是一个不正确的说法,你的建议当然也是一种可能的解释。
-
由于
func_foo位于0,它几乎肯定不是可执行文件。