我的意思是gcc是否可以将一些源代码版本infor插入到ELF二进制文件中作为section或类似的东西。我不想更改我的源文件,但在Makefile中添加gcc选项的一些信息。
答案 0 :(得分:7)
如果您不介意只更改一次源文件,请添加以下内容:
const volatile static char version[] = VERSION;
并编译:
gcc -c -DVERSION='"1.2.3"'
volatile
阻止gcc在更高的优化级别删除字符串。
如上所述,如果您忘记-D
选项,则无法编译,根据您的要求,这可能是好的也可能是坏的。
答案 1 :(得分:6)
您可以将版本信息发布到文本文件中,然后将该文本文件转换为目标文件,然后将其静态链接到可执行文件中。
第一步很简单,但你必须编写一些代码:一个脚本或者用你喜欢的任何格式的纯文本文件来编写你的版本信息。然后编写一个makefile规则,使用objcopy从version.txt生成say version.o。现在,您将拥有一个目标文件,其中定义了两个有用的符号:文本版本信息的开头和结尾。将生成的对象添加到可执行文件中,您将能够以两种方式访问版本:在二进制文件上运行strings
,或者在应用程序中编写代码以打印版本字符串(您需要将起始符号和结束符号声明为某些头文件中的变量。)
答案 2 :(得分:5)
即使您无法再访问源,也可以使用此选项链接对象:
gcc -Wl,--defsym,VERSION_1_2_3=0 prog.o -o prog
您可以使用hexdump -C prog | less
进行检查,然后查找VERSION
将此添加到您的makefile
,并确保始终知道编译程序的时间:
BUILD = $(shell date +"%Y%m%d_%H%M%S")
LDLIBS = -Wl,--defsym,BUILD_$(BUILD)=0
答案 3 :(得分:0)
使用GNU链接器ld您可以使用
--version-script=version-scriptfile
在以下位置阅读有关命令行选项的更多信息: Using LD, the GNU linker - Options
详细了解如何在以下位置创建版本脚本: Using LD, the GNU linker - Version Script
让我警告你,这不是为了弱者!