使用GCC创建的可执行文件是否包含可识别的元数据?

使用GCC创建的可执行文件是否包含可识别的元数据?,gcc,compilation,metadata,executable,Gcc,Compilation,Metadata,Executable,例如,PDF文件可以包含默认情况下由PDF创建/修改软件或由用户自己选择包含的元数据。除此之外,元数据可以显示所使用的PDF创建软件,以及创建PDF的用户的姓名 使用GCC创建可执行文件时,可执行文件是否包含任何元数据(使用的编译器、编译日期等) 如何将元数据故意插入到可执行文件中?(例如,作者姓名、创建日期、使用的编译器标志、VCS提交哈希等) 注意:我所说的元数据不必是“标准的”(如PDF)。无论以何种方式,它都必须对检查可执行文件的人员可见。 GCC在.comment部分记录其版本(至

例如,PDF文件可以包含默认情况下由PDF创建/修改软件或由用户自己选择包含的元数据。除此之外,元数据可以显示所使用的PDF创建软件,以及创建PDF的用户的姓名

  • 使用GCC创建可执行文件时,可执行文件是否包含任何元数据(使用的编译器、编译日期等)
  • 如何将元数据故意插入到可执行文件中?(例如,作者姓名、创建日期、使用的编译器标志、VCS提交哈希等)
注意:我所说的元数据不必是“标准的”(如PDF)。无论以何种方式,它都必须对检查可执行文件的人员可见。

  • GCC在
    .comment
    部分记录其版本(至少在支持它的目标上,例如ELF目标上)。您可以编译一些东西并使用
    objdump-s-j.comment a.out
    进行检查

  • -frecord gcc开关
    (参见手册和)

  • -grecord gcc交换机

  • 通常,当您要求编译器发出调试信息(选项的
    -g*
    系列)时,可能会发出大量的元信息。我知道
    DW\u AT_producer
    (关于编译器/汇编程序名称和版本以及命令行开关的信息)和
    DW\u AT_comp\u dir
    (编译目录)标记

还有
-fverbose asm
,但它只在程序集中发出注释;它们甚至连对象文件都无法通过,更不用说可执行文件了

还要记住,编译器不会生成可执行文件。它只生成汇编代码(gcc命令是调用编译器的编译器驱动程序,然后是汇编器,然后是链接器)。当将目标文件合并到可执行文件/库中时,链接器可以决定如何处理
.comment
节等。我认为,“正常”的行为是迎合它们,尽管在那个阶段或以后丢弃它们(例如,使用
strip
)应该不会让任何人感到惊讶

如何将元数据故意插入到可执行文件中

通常,
SHT\u NOTE
节用于它(如果我们说的是ELF)。在这里,连接和保存到最后是有保证的,因为它们不仅仅是评论;工具链使用它们来存储程序的某些属性(请参见
manelf
,grep表示“note”)

另一种方法是定义绝对符号。可以用符号的名称对信息进行编码。这可以在任何阶段完成。例如,在源程序中或在汇编中。或者在链接阶段使用
ld--defsym
。或者您可以使用
objcopy--add symbol
-oh修改生成的可执行文件,这也适用于节(
objcopy--add section