gcc - 为什么常见的 C 编译器在输出中包含源文件名?

标签 gcc compilation clang compiler-optimization compiler-options

我是从this recent answer学到的即使未启用调试,gccclang 也将源文件名作为元数据包含在二进制文件中的某个位置。

我真的不明白为什么这应该是一个好主意。除了微小的隐私风险之外,当优化生成的二进制文件 (-Os) 的大小时也会发生这种情况,这看起来效率很低。

为什么编译器要包含这些信息?

最佳答案

GCC 包含文件名的原因主要是出于调试目的,因为它允许程序员识别给定符号来自哪个源文件,如 ELF spec p1-17 中(简洁地)概述的那样。并在 some Oracle docs on linking 中进一步扩展.

this SO question 给出了使用 STT_FILE 部分的示例。 .

我仍然很困惑,为什么即使您指定 -g0,GCC 和 Clang 仍然包含它,但您可以使用 - 阻止它包含 STT_FILE s。我找不到对此的任何解释,也找不到为什么 STT_FILE 包含在 ELF 规范中的“官方原因”(这是非常简洁的)。

关于gcc - 为什么常见的 C 编译器在输出中包含源文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32413176/

相关文章:

c++ - 为什么 gcc 允许 const 对象没有用户声明的默认构造函数但不允许 clang?

gcc - 编译静态库时设置较早的最低内核版本

c++ - gcc 版本 4 和 5 和 6 之间的区别

c++ - 将一段代码包装成一个编译时值

c# - 夏普在 ubuntu 中开发

iphone - AnalysisTool/Clang 结果 : ivar naming convention violation

c++ - 平台之间的类型不同

gcc - 在emacs中查看函数的汇编代码

用 clang 而不是 gcc 编译

linux - 手动在apue中编译代码但出现错误