Linux gcc是否有在ELF二进制文件中添加版本信息的选项?

Linux gcc是否有在ELF二进制文件中添加版本信息的选项?,linux,gcc,elf,Linux,Gcc,Elf,我的意思是gcc是否可以将一些源代码版本infor插入ELF二进制文件中作为部分或类似的内容。我不想更改源文件,但在Makefile中使用gcc选项添加一些信息。您可以将版本信息发送到文本文件中,然后将该文本文件转换为对象文件,然后静态链接到可执行文件中 第一步很简单,但您必须编写一些代码:一个脚本或其他东西,以您喜欢的任何格式将您的版本信息编写为纯文本文件。然后编写一个makefile规则,使用从version.txt生成比如version.o。现在您将拥有一个对象文件,其中定义了两个有用的符

我的意思是gcc是否可以将一些源代码版本infor插入ELF二进制文件中作为部分或类似的内容。我不想更改源文件,但在Makefile中使用gcc选项添加一些信息。

您可以将版本信息发送到文本文件中,然后将该文本文件转换为对象文件,然后静态链接到可执行文件中


第一步很简单,但您必须编写一些代码:一个脚本或其他东西,以您喜欢的任何格式将您的版本信息编写为纯文本文件。然后编写一个makefile规则,使用从version.txt生成比如version.o。现在您将拥有一个对象文件,其中定义了两个有用的符号:文本版本信息的开始和结束。将生成的对象添加到可执行文件中,您可以通过两种方式访问版本:在二进制文件上运行
strings
,或者在应用程序中编写代码以打印版本字符串(您需要在某些头文件中将开始和结束符号声明为变量).

如果您不介意只更改一次源文件,请添加以下内容:

const volatile static char version[] = VERSION;
并使用以下工具进行编译:

gcc -c -DVERSION='"1.2.3"'
volatile
使gcc无法在更高的优化级别删除字符串


如前所述,如果您忘记了
-D
选项,这将无法编译,这可能是好的,也可能是坏的,取决于您的需求。

使用GNU链接器ld,您可以使用

--version-script=version-scriptfile
有关命令行选项的详细信息,请访问:

有关创建版本脚本的详细信息,请访问:


不过,让我警告你,这不是为懦弱的人准备的

即使您不再有权访问源,也可以使用此选项链接对象:

gcc -Wl,--defsym,VERSION_1_2_3=0 prog.o -o prog
您可以使用
hextump-C prog|less检查它,并查找
VERSION


将其添加到您的
makefile
中,并确保始终知道程序是何时编译的:

BUILD = $(shell date +"%Y%m%d_%H%M%S")
LDLIBS = -Wl,--defsym,BUILD_$(BUILD)=0

谢谢我发现在objcopy中有更好的方法:objcopy——添加section verssection=version\u text main\u version。使用“objdump-s-j verssection main_version”,可以检索该版本。嗨,约翰,我看到你是活跃成员,即使这个答案是旧的。您是否想用一些非常基本/简单的例子来更新它,说明如何将文本文件编译为对象?说“1.1.1版”之类的。这正是我要提出的问题,而且,这将是一个(或多或少)“重复的”…@DrBeco:在Linux上,您可以使用
objcopy
,并明确指定
--input binary
--output
格式。这里有关于此的完整教程:。您还可以使用带有一些选项的
ld
,我认为
-b
也可以做同样的事情,根据具体的场景可能更容易。版本脚本的用途不同于仅记录编译器设置。