gcc 是不是有任何选项可以在 ELF 二进制文件中添加版本信息?
Posted
技术标签:
【中文标题】gcc 是不是有任何选项可以在 ELF 二进制文件中添加版本信息?【英文标题】:Does gcc have any options to add version info in ELF binary file?gcc 是否有任何选项可以在 ELF 二进制文件中添加版本信息? 【发布时间】:2013-04-27 07:19:09 【问题描述】:我的意思是 gcc 是否可以将一些源代码版本信息作为部分或类似的东西插入 ELF 二进制文件。我不想更改我的源文件,但在 Makefile 中使用 gcc 选项添加一些信息。
【问题讨论】:
【参考方案1】:即使您不再有权访问您的源,您也可以使用此选项链接对象:
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
【讨论】:
【参考方案2】:使用 GNU 链接器 ld 你可以使用
--version-script=version-scriptfile
在以下位置阅读有关命令行选项的更多信息: Using LD, the GNU linker - Options
阅读更多关于创建版本脚本的信息: Using LD, the GNU linker - Version Script
但我要警告你,它不适合弱者!
【讨论】:
版本脚本的目的与记录编译器设置不同。【参考方案3】:如果您不介意只更改一次源文件,请添加如下内容:
const volatile static char version[] = VERSION;
并编译:
gcc -c -DVERSION='"1.2.3"'
volatile
阻止 gcc 在更高优化级别删除字符串。
正如所写,如果您忘记了 -D
选项,这将无法编译,这取决于您的要求可能是好是坏。
【讨论】:
如何从 Linux 命令行或 bash 脚本读取此版本代码?谢谢 @George 没有直接的方法可以做到这一点。version
字符串应该在可执行文件中的somewhere,但你不知道在哪里。一种可能性是添加一些可以搜索的唯一字符串(但假设该字符串不会碰巧出现在其他地方)。【参考方案4】:
您可以将版本信息发送到文本文件中,然后将该文本文件转换为目标文件,然后将其静态链接到可执行文件中。
第一步很简单,但您必须编写一些代码:脚本或其他东西,以您喜欢的任何格式将版本信息写入纯文本文件。然后使用objcopy 编写一个makefile 规则以从version.txt 生成说version.o。现在您将拥有一个目标文件,其中定义了两个有用的符号:文本版本信息的开头和结尾。将生成的对象添加到您的可执行文件中,您将能够通过两种方式访问版本:通过在二进制文件上运行 strings
,或者在应用程序中编写代码以打印版本字符串(您需要声明开始和结束符号作为一些头文件中的变量)。
【讨论】:
谢谢。我发现 objcopy 有更好的方法:objcopy --add-section versection=version_text main main_version。并且使用“objdump -s -j versection main_version”可以检索版本。 嗨约翰,我看到你是活跃的成员,即使这个答案是旧的。您是否愿意使用一些非常基本/简单的示例来更新它,以说明如何将文本文件编译为对象?说“版本 1.1.1”之类的。这正是我要提出的问题,而且,这将是一个(或多/少)“重复”...... @DrBeco:在 Linux 上,您可以使用objcopy
和明确指定的 --input binary
和 --output
格式。这里有一个完整的教程:linuxjournal.com/content/…。您也可以将ld
与一些选项一起使用,我认为-b
可以做同样的事情,根据您的具体情况可能更容易。以上是关于gcc 是不是有任何选项可以在 ELF 二进制文件中添加版本信息?的主要内容,如果未能解决你的问题,请参考以下文章