我是指gcc是否可以将一些源代码版本信息插入ELF二进制文件中,例如作为一个段(section)或类似的方式。 我不想改变我的源文件,而是想在Makefile中使用gcc选项来添加一些信息。
如果您不介意更改源文件一次,可以添加类似以下内容:
const volatile static char version[] = VERSION;
使用以下命令编译:
gcc -c -DVERSION='"1.2.3"'
volatile
关键字可以防止gcc在高优化级别下删除字符串。
按照现有的写法,如果你忘记使用-D
选项,代码将无法编译。这取决于你的需求,可能是好事也可能是坏事。
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
strings
,或通过在应用程序中编写代码来打印版本字符串(您需要在某个头文件中声明开始和结束符号作为变量)。objcopy
并显式指定--input binary
和--output
格式。这里有一个完整的教程:http://www.linuxjournal.com/content/embedding-file-executable-aka-hello-world-version-5967。您还可以使用`ld`和一些选项,我认为是`-b`来完成相同的事情,根据您的具体情况可能更容易。 - John Zwinck--version-script=version-scriptfile
了解命令行选项的更多信息,请访问: 使用GNU链接器LD - 选项
了解创建版本脚本的更多信息,请访问: 使用GNU链接器LD - 版本脚本
但要提醒您,这不是给心脏脆弱的人看的!
version
字符串应该在可执行文件中的某个地方,但你不知道在哪里。一个可能的方法是添加一些可以搜索的唯一字符串(但这假设该字符串不会出现在其他地方)。 - Keith Thompson