我的意思是 gcc 是否可以将一些源代码版本信息作为部分或类似的东西插入 ELF 二进制文件。我不想更改我的源文件,但在 Makefile 中使用 gcc 选项添加一些信息。
4 回答
如果您不介意只更改一次源文件,请添加如下内容:
const volatile static char version[] = VERSION;
并编译:
gcc -c -DVERSION='"1.2.3"'
volatile
阻止 gcc 在更高的优化级别删除字符串。
如所写,如果您忘记了该-D
选项,这将无法编译,这取决于您的要求,这可能是好是坏。
您可以将版本信息发送到文本文件中,然后将该文本文件转换为目标文件,然后将其静态链接到可执行文件中。
第一步很简单,但您必须编写一些代码:脚本或其他东西,以您喜欢的任何格式将版本信息写入纯文本文件。然后使用objcopy编写一个 makefile 规则以从 version.txt 生成说 version.o 。现在您将拥有一个目标文件,其中定义了两个有用的符号:文本版本信息的开头和结尾。将生成的对象添加到您的可执行文件中,您将能够通过两种方式访问版本:strings
在二进制文件上运行,或在应用程序中编写代码以打印版本字符串(您需要声明开始和结束符号作为某些头文件中的变量)。
即使您不再有权访问您的源,您也可以使用此选项链接对象:
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
使用 GNU 链接器 ld 你可以使用
--version-script=version-scriptfile
阅读更多关于命令行选项的信息: Using LD, the GNU linker - Options
阅读更多关于创建版本脚本的信息: 使用 LD,GNU 链接器 - 版本脚本
不过让我警告你,它不适合弱者!