我的意思是,gcc是否可以将一些源代码版本信息插入到ELF二进制文件中作为章节或类似内容。我不想更改我的源文件,但在Makefile中添加一些带有gcc选项的信息。gcc是否有任何选项在ELF二进制文件中添加版本信息?
回答
您可以将版本信息发送到文本文件中,然后将该文本文件转换为目标文件,然后将其静态链接到可执行文件中。
第一步很简单,但您必须编写一些代码:脚本或其他东西,以任何您喜欢的格式编写您的版本信息作为纯文本文件。然后编写一个makefile规则,使用objcopy从version.txt生成版本version.o。现在您将拥有一个包含两个有用符号的对象文件:文本版本信息的开始和结束。将生成的对象添加到可执行文件中,然后可以通过两种方式访问版本:通过在二进制文件上运行strings
,或者在应用程序中编写代码以打印版本字符串(您需要声明开始和结束符号作为某些头文件中的变量)。
如果你不介意改变你的源文件只需一次,加上这样的事情:
const volatile static char version[] = VERSION;
和编译:
gcc -c -DVERSION='"1.2.3"'
的volatile
保持GCC从更高的去除串优化级别。
正如所写的,如果您忘记了-D
选项,这将不会编译,根据您的要求,这可能是好的或坏的选项。
随着GNU连接器ld可以使用
--version-script=version-scriptfile
阅读在更多的命令行选项: Using LD, the GNU linker - Options
了解更多关于创建版本脚本: Using LD, the GNU linker - Version Script
设我虽然警告过你,那不是为了那些软弱的人!
版本脚本旨在用于不同的目的,而不仅仅是记录编译器设置。 – o11c 2015-06-13 07:27:02
即使你没有访问源了,你可以用这个选项链接对象:
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
- 1. 二进制文件中的GCC版本
- 2. 在构建的二进制文件中更改版本信息
- 3. 如何在链接档案文件和所有档案文件时向elf文件添加库版本信息的版本信息?
- 4. 在.Net中读取文本和二进制信息的文件
- 5. 如何将版本信息嵌入到Windows二进制文件中?
- 6. ELF文件版本
- 7. 在ELF或二进制文件中有特定ABI的签名?
- 8. 是否有任何二进制索引文件访问技术?
- 9. 如何检索二进制文件的二进制版本号
- 10. Linux,GNU GCC,ld,版本脚本和ELF二进制格式 - 它是如何工作的?
- 11. 更新二进制文件信息
- 12. Linux:如何将版本信息嵌入共享库和二进制文件?
- 13. 乌龟SVN中是否有任何选项删除版本
- 14. 如何让GCC编译.text段作为ELF二进制文件可写?
- 15. 获取二进制文件和文本信息
- 16. 是否有任何方法可以在选项实现之前的版本中复制cURL中的--post302选项?
- 17. 是GCC-3的二进制文件用gcc-4
- 18. 将版权信息添加到网站上的复制文本?
- 19. 在ELF二进制文件中修改asm指令
- 20. 专利ARM ELF二进制
- 21. 当包装是与特定于平台的二进制文件不同的版本时,gcc是否工作?
- 22. 可能将可执行节/段添加到ELF二进制文件?
- 23. llvm-gcc和clang二进制文件是否与gcc兼容? - 尤其是在Windows上的mingw gcc
- 24. 版本信息.EXE gcc和windres
- 25. 有没有关于ELF文件版本章节的任何文档?
- 26. 具有时间戳的二进制文件的版本控制
- 27. 涉及二进制和文本文件时的版本控制?
- 28. 任何读取和写入二进制文件格式(PE和ELF)的库?
- 29. NASM ORG指令是否有GCC版本?
- 30. 使用IntelliJ将版本信息添加到jar文件名称
谢谢。我发现用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”或什么的。这就是我要做的问题,而且,这将是一个(更多/更少)“重复”... – 2015-07-11 03:35:14
@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