我的意思是gcc是否可以将一些源代码版本infor插入到ELF二进制文件中作为部分或类似的东西.我不想更改我的源文件,但在Makefile中添加gcc选项的一些信息.
如果您不介意只更改一次源文件,请添加如下内容:
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
选项,则无法编译,根据您的要求,该选项可能是好的也可能是坏的.
您可以将版本信息发布到文本文件中,然后将该文本文件转换为目标文件,然后将该文件静态链接到可执行文件中.
第一步很简单,但你必须编写一些代码:一个脚本或者用你喜欢的任何格式的纯文本文件来编写你的版本信息.然后编写一个makefile规则,使用objcopy从version.txt生成say version.o .现在,您将拥有一个目标文件,其中定义了两个有用的符号:文本版本信息的开头和结尾.将生成的对象添加到可执行文件中,您将能够以两种方式访问版本:通过运行strings
二进制文件,或通过在应用程序中编写代码来打印版本字符串(您需要声明开始和结束)符号作为某些头文件中的变量).
即使您无法再访问源,也可以使用此选项链接对象:
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)
归档时间: |
|
查看次数: |
10161 次 |
最近记录: |