2017-02-21 29 views
0

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

+2

如您的示例所示,gcc不会编译'startSomething()'的调用。 (当然不是。)然而,你可能在objdump中看到的是这个函数的原型或实现(与它的调用相反)。为了证明这一点,一个完整的样本将是必要的。 – Scheff

+0

@Scheff感谢您的回复。如果另外它是我在objdump中可以看到的调用,那么实现也被包装在一个散列中。 –

+0

我对objdump一无所知。但是,如果您想查看编译器如何在宏调用后编译您的代码,请使用“-E”进行“编译”。这将显示宏调用后的C源代码。 – Scheff

回答

4

Objdump对C或gcc或预处理器没有丝毫的想法。它具有格式“地址范围S-E处的指令来自线L上的语句”的信息。给定与L1和L2线相对应的两个相邻指令块,它可能会显示L1和L2之间的所有线。

这就像调试器将工作。您不希望gdb跳过评论,或者如果在代码中删除了部分代码或空行,

+0

嗯,也许这是我如何使用objdump。对于我来说,看到代码不是可执行文件的一部分,这非常令人困惑。感谢您的解释,虽然:) –