gcc是否有任何选项可以在ELF二进制文件中添加版本信息?

Lan*_*ane 20 linux gcc elf

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

Kei*_*son 9

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

const volatile static char version[] = VERSION;
Run Code Online (Sandbox Code Playgroud)

并编译:

gcc -c -DVERSION='"1.2.3"'
Run Code Online (Sandbox Code Playgroud)

volatile从更高优化级别上去除串保持GCC.

如上所述,如果您忘记了该-D选项,则无法编译,根据您的要求,该选项可能是好的也可能是坏的.


Joh*_*nck 6

您可以将版本信息发布到文本文件中,然后将该文本文件转换为目标文件,然后将该文件静态链接到可执行文件中.

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

  • 谢谢.我发现有更好的方法与objcopy:objcopy --add-section versection = version_text main main_version.使用"objdump -s -j versection main_version",可以检索版本. (4认同)
  • 嗨约翰,我看到你是活跃的成员,即使这个答案已经过时了.您是否关心如何使用一些非常基本/简单的示例来更新它如何将文本文件编译到对象?说"版本1.1.1"或其他东西.这正是我要提出的问题,而且,这将是一个(更多/更少)"重复"...... (2认同)

Dr *_*eco 5

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

gcc -Wl,--defsym,VERSION_1_2_3=0 prog.o -o prog
Run Code Online (Sandbox Code Playgroud)

您可以查看hexdump -C prog | less并查找VERSION


将此添加到您的makefile并确保始终知道编译程序的时间:

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