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