当我使用-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/