2013-05-02 187 views

回答

6

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

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

+4

谢谢。我发现用objcopy有更好的方法:objcopy --add-section versection = version_text main main_version。通过“objdump -s -j versection main_version”,可以检索版本。 – Lane 2013-05-03 06:36:22

+1

嗨,约翰,我看到你是活跃的成员,即使这个答案是旧的。你是否想用一些非常基本的/简单的例子来更新它,如何将文本文件编译成对象?说“版本1.1.1”或什么的。这就是我要做的问题,而且,这将是一个(更多/更少)“重复”... – 2015-07-11 03:35:14

+1

@DrBeco:在Linux上,您可以使用'objcopy'和显式指定的'--input binary'和'--output'格式。这里有一个完整的教程:http://www.linuxjournal.com/content/embedding-file-executable-aka-hello-world-version-5967。你也可以使用'ld'来选择一些选项,我认为''-b'可以做同样的事情,或许更容易取决于你的确切场景。 – 2015-08-05 10:54:41

6

如果你不介意改变你的源文件只需一次,加上这样的事情:

const volatile static char version[] = VERSION; 

和编译:

gcc -c -DVERSION='"1.2.3"' 

volatile保持GCC从更高的去除串优化级别。

正如所写的,如果您忘记了-D选项,这将不会编译,根据您的要求,这可能是好的或坏的选项。

4

即使你没有访问源了,你可以用这个选项链接对象:

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 
相关问题