我是从this recent answer学到的即使未启用调试,gcc
和 clang
也将源文件名作为元数据包含在二进制文件中的某个位置。
我真的不明白为什么这应该是一个好主意。除了微小的隐私风险之外,当优化生成的二进制文件 (-Os
) 的大小时也会发生这种情况,这看起来效率很低。
为什么编译器要包含这些信息?
最佳答案
GCC 包含文件名的原因主要是出于调试目的,因为它允许程序员识别给定符号来自哪个源文件,如 ELF spec p1-17 中(简洁地)概述的那样。并在 some Oracle docs on linking 中进一步扩展.
this SO question 给出了使用 STT_FILE
部分的示例。 .
我仍然很困惑,为什么即使您指定 -g0
,GCC 和 Clang 仍然包含它,但您可以使用 - 阻止它包含
。我找不到对此的任何解释,也找不到为什么 STT_FILE
sSTT_FILE
包含在 ELF 规范中的“官方原因”(这是非常简洁的)。
关于gcc - 为什么常见的 C 编译器在输出中包含源文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32413176/