当我使用-g选项运行gcc时,这使我能够在使用objdump运行可执行文件时看到一些c代码。GCC调试选项不尊重预处理器#if使用objdump查看时
我有一个程序在#if块中有一段代码。当我使用-g运行gcc并运行objdump时,它会显示不应包含在#if中的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中得到永远不会执行的代码?
感谢您的帮助。
编辑:另外我知道这个函数没有得到执行时,实际运行的代码。所以我知道我还没有在其他地方设置ENABLED。
编辑2:一个很好的观察是objdump实际上并没有输出任何与函数调用相关的asm指令。所以它似乎只是不正确地包含函数调用相关的函数调用c块。
如您的示例所示,gcc不会编译'startSomething()'的调用。 (当然不是。)然而,你可能在objdump中看到的是这个函数的原型或实现(与它的调用相反)。为了证明这一点,一个完整的样本将是必要的。 – Scheff
@Scheff感谢您的回复。如果另外它是我在objdump中可以看到的调用,那么实现也被包装在一个散列中。 –
我对objdump一无所知。但是,如果您想查看编译器如何在宏调用后编译您的代码,请使用“-E”进行“编译”。这将显示宏调用后的C源代码。 – Scheff