当我使用-g选项运行g c c时,这使我能够在使用objdump运行可执行文件时看到一些c代码。
我有一个程序在if块中有一段代码。当我用-g运行g c c并运行objdump时,它会显示不应该包含的ifs中的c代码。
例如,使用以下c代码:

#define ENABLED 0

#if ENABLED
    startSomething();
#endif

使用gcc -g编译时,对startSomething函数的调用包含在objdump输出中。
objdump输出部分:
    261c:       1c19            adds    r1, r3, #0
    261e:       f7fe f9a1       bl      964 <init>
    }

    startSomething();
#else

这是预期的行为吗?我会想,如果对startSomething()的调用和startSomething的实际函数定义被包装在#if ENABLED中,那么就不应该包含它,gcc应该把它去掉。
gcc/objdump有没有办法更加关注预处理器ifs,这样我就不会在objdump中得到永远无法执行的代码?
谢谢你的帮助。
编辑:另外,我知道这个函数在实际运行代码时不会被执行。所以我知道我还没有在别的地方启用。
编辑2:一个好的观察结果是,objdump实际上并没有输出任何与函数调用相关的asm指令。所以它似乎只是错误地包含了与函数调用相关的函数调用c块。

最佳答案

Objdump对C、gcc或预处理器一无所知。它有“地址范围S-E处的指令来自L行的语句”形式的信息。给定对应于行L1和L2的两个相邻指令块,它可能会显示L1和L2之间的所有行。
这就像调试器可以工作一样。在清单中,您不希望gdb跳过注释、代码的ifdef部分或空行。

关于c - 使用objdump查看时,GCC调试选项不遵守预处理程序#if,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42372902/

10-11 12:21