我的意思是,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. 我有一個沒有使用gcc構建調試信息的版本二進制文件,它有源代碼
- 5. 如何擴展ELF二進制文件
- 6. 在.Net中讀取文本和二進制信息的文件
- 7. 如何將版本信息嵌入到Windows二進制文件中?
- 8. 是否有任何支持GCC插件的mingw-w64版本?
- 9. ELF文件版本
- 10. 是否有任何二進制索引文件訪問技術?
- 11. 在ELF或二進制文件中有特定ABI的簽名?
- 12. 如何檢索二進制文件的二進制版本號
- 13. Linux,GNU GCC,ld,版本腳本和ELF二進制格式 - 它是如何工作的?
- 14. 更新二進制文件信息
- 15. 烏龜SVN中是否有任何選項刪除版本
- 16. Linux:如何將版本信息嵌入共享庫和二進制文件?
- 17. 在任意初始化的內存塊周圍加載ELF二進制文件
- 18. 如何讓GCC編譯.text段作爲ELF二進制文件可寫?
- 19. 在Maven中附加二進制文件的內部版本號
- 20. 向項目文件夾添加框架是否會增加二進制大小?
- 21. 將版本信息添加到Qt中的.rc文件中
- 22. 獲取二進制文件和文本信息
- 23. 比較從不同版本的工具鏈生成的ELF /二進制文件
- 24. 如何檢查linux二進制文件是否有新添加的代碼
- 25. 是否有任何方法可以在選項實現之前的版本中複製cURL中的--post302選項?
- 26. 管理二進制文件版本
- 27. 是GCC-3的二進制文件用gcc-4
- 28. Visual Studio調試版本是否包含任何個人信息?
- 29. 在ELF二進制文件中修改asm指令
- 30. 將版權信息添加到網站上的複製文本?
謝謝。我發現用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