gpt4 book ai didi

c - 使用 objdump 查看时,GCC 调试选项不考虑预处理器 #if

转载 作者:太空宇宙 更新时间:2023-11-04 06:17:28 24 4
gpt4 key购买 nike

当我使用 -g 选项运行 gcc 时,这使我能够在使用 objdump 运行可执行文件时看到一些 c 代码。

我有一个程序,在#if block 中有一段代码。当我使用 -g 运行 gcc 并运行 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 中得到永远不会执行的代码?

感谢您的帮助。

编辑:另外我知道这个函数在实际运行代码时没有被执行。所以我知道我没有在其他地方设置 ENABLED。

编辑 2:一个很好的观察是 objdump 实际上并没有输出任何与函数调用相关的 asm 指令。所以它似乎只是错误地包含了与函数调用相关的函数调用 c block 。

最佳答案

Objdump 对 C 或 gcc 或预处理器一无所知。它具有“地址范围 S-E 的指令来自行 L 上的语句”形式的信息。给定对应于行 L1 和 L2 的两个相邻指令 block ,它可能会显示 L1 和 L2 之间的所有行。

这就像调试器一样工作。您不希望 gdb 跳过 list 中的注释或代码的 ifdef 部分,或与此相关的空行。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com