23

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

4

4 回答 4

11

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

const volatile static char version[] = VERSION;

并编译:

gcc -c -DVERSION='"1.2.3"'

volatile阻止 gcc 在更高的优化级别删除字符串。

如所写,如果您忘记了该-D选项,这将无法编译,这取决于您的要求,这可能是好是坏。

于 2013-05-03T00:24:07.430 回答
7

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

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

于 2013-05-03T00:07:40.760 回答
6

即使您不再有权访问您的源,您也可以使用此选项链接对象:

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
于 2015-07-11T05:26:28.237 回答
2

使用 GNU 链接器 ld 你可以使用

--version-script=version-scriptfile

阅读更多关于命令行选项的信息: ​​Using LD, the GNU linker - Options

阅读更多关于创建版本脚本的信息: 使用 LD,GNU 链接器 - 版本脚本

不过让我警告你,它不适合弱者!

于 2015-06-13T06:49:04.643 回答