Tôi có nghĩa là liệu gcc có thể chèn một số mã nguồn phiên bản infor vào ELF nhị phân như một phần hoặc một cái gì đó tương tự. Tôi không muốn thay đổi tệp nguồn của mình, nhưng thêm một số thông tin với tùy chọn gcc trong Makefile.Gcc có bất kỳ tùy chọn nào để thêm thông tin phiên bản vào tệp nhị phân ELF không?
Trả lời
Bạn có thể phát ra thông tin phiên bản của mình vào tệp văn bản, sau đó chuyển tệp văn bản đó thành tệp đối tượng mà sau đó bạn liên kết tĩnh vào tệp thi hành của mình.
Bước đầu tiên rất đơn giản nhưng bạn phải viết một số mã: một tập lệnh hoặc thứ gì đó để viết thông tin phiên bản của bạn theo bất kỳ định dạng nào bạn thích dưới dạng tệp văn bản thuần túy. Sau đó viết quy tắc makefile để tạo phiên bản nói.o từ version.txt, sử dụng objcopy. Bây giờ bạn sẽ có một tệp đối tượng với hai biểu tượng hữu ích được định nghĩa trong nó: phần đầu và cuối của thông tin phiên bản văn bản. Thêm đối tượng được tạo đó vào tệp thực thi của bạn và bạn có thể truy cập phiên bản hai cách: bằng cách chạy strings
trên nhị phân hoặc bằng cách viết mã trong ứng dụng để in chuỗi phiên bản (bạn cần phải khai báo bắt đầu và biểu tượng kết thúc dưới dạng biến trong một số tệp tiêu đề).
Nếu bạn không nhớ thay đổi file nguồn của bạn chỉ một lần, thêm một cái gì đó như thế này:
const volatile static char version[] = VERSION;
và biên dịch với:
gcc -c -DVERSION='"1.2.3"'
Các volatile
giữ gcc từ bỏ chuỗi tại cao mức tối ưu hóa.
Khi được viết, điều này sẽ không biên dịch nếu bạn quên tùy chọn -D
, có thể là tốt hay xấu tùy thuộc vào yêu cầu của bạn.
Với mối liên kết ld GNU Bạn có thể sử dụng
--version-script=version-scriptfile
Đọc thêm về các tùy chọn dòng lệnh tại địa chỉ: Using LD, the GNU linker - Options
Đọc thêm về việc tạo ra các kịch bản phiên bản tại địa chỉ: Using LD, the GNU linker - Version Script
Lết tôi cảnh báo bạn, mặc dù nó không dành cho những người yếu đuối!
Các tập lệnh phiên bản dành cho các mục đích khác nhau hơn là chỉ ghi các cài đặt trình biên dịch. – o11c
Thậm chí nếu bạn không có quyền truy cập vào mã nguồn của bạn nữa, bạn có thể liên kết các đối tượng với tùy chọn này:
gcc -Wl,--defsym,VERSION_1_2_3=0 prog.o -o prog
Bạn có thể kiểm tra xem nó với hexdump -C prog | less
và tìm kiếm VERSION
Thêm số này vào số makefile
của bạn và đảm bảo luôn biết khi nào một chương trình được biên soạn:
BUILD = $(shell date +"%Y%m%d_%H%M%S")
LDLIBS = -Wl,--defsym,BUILD_$(BUILD)=0
- 1. Linux: Cách nhúng thông tin phiên bản vào thư viện được chia sẻ và nhị phân?
- 2. Có phụ thêm dữ liệu tùy ý vào một tệp ELF vi phạm thông số ELF không?
- 3. Cấu hình không có bất kỳ thông tin phiên bản nào - giả định cấu hình dành cho phiên bản 1.5
- 4. Linux, GNU GCC, ld, tập lệnh phiên bản và định dạng nhị phân ELF - Cách thức hoạt động?
- 5. Thêm phần vào tập tin ELF
- 6. tạo các tệp nhị phân ELF độc quyền trên Linux
- 7. Tôi làm cách nào để thêm các tệp nhị phân hoàn chỉnh vào bản vá Mercurial?
- 8. Có bất kỳ khung công tác Java nào để phân tích cú pháp tệp nhị phân không?
- 9. Có cách nào để có nhiều tệp seed.rb không? Bất kỳ loại 'phiên bản' nào cho dữ liệu hạt giống?
- 10. Có cách nào để có được gcc để sản xuất nhị phân liệu?
- 11. Cách thêm thông tin bản quyền vào một tệp Nib?
- 12. ASP.NET MVC: DropDownListFor không chọn bất kỳ tùy chọn
- 13. Nhập tên trong mã nhị phân ELF
- 14. tùy chọn liên kết gcc để xem tại sao một số tệp đối tượng được liên kết thành nhị phân
- 15. Cách truy xuất phiên bản GCC được sử dụng để biên dịch một tệp ELF đã cho?
- 16. không có phiên bản thông tin có sẵn
- 17. Phiên bản nhị phân của iostream
- 18. Mac OS X: thêm trường dữ liệu meta tùy chỉnh vào bất kỳ tệp nào
- 19. arm-linux-gcc vs arm-elf-gcc
- 20. Sửa đổi tập tin elf
- 21. C ghi ở giữa tệp nhị phân mà không ghi đè bất kỳ nội dung hiện có nào
- 22. Bất kỳ cách nào trong CMake yêu cầu phiên bản GCC 4+?
- 23. Thêm tệp không được phiên bản vào phiên bản lật đổ
- 24. Tùy chọn hệ thống của Android mà không có bất kỳ ngữ cảnh nào
- 25. Làm cách nào để thêm thông báo vào ngoại lệ mà không làm mất bất kỳ thông tin nào trong C#?
- 26. Trình xây dựng gỡ lỗi Visual Studio có chứa bất kỳ thông tin cá nhân nào không?
- 27. Không thể tải thêm bất kỳ đối tượng nào có TLS tĩnh
- 28. Có thể đọc thông tin SSL bằng PHP từ bất kỳ trang web nào không?
- 29. Có bất kỳ tùy chọn tích hợp liên tục Clojure mạnh mẽ nào không?
- 30. Các phiên PHP có đặt bất kỳ cookie nào không?
Cảm ơn. Tôi thấy rằng có phương pháp tốt hơn wiith objcopy: objcopy --add-section versection = version_text main_version chính. Và với "objdump -s -j versection main_version", phiên bản có thể được lấy ra. – Lane
Xin chào John, tôi thấy bạn là thành viên tích cực, ngay cả khi câu trả lời này là cũ. Bạn có quan tâm để cập nhật nó với một số ví dụ rất cơ bản/đơn giản về cách biên dịch một tệp văn bản thành một đối tượng không? Nói "phiên bản 1.1.1" hoặc một cái gì đó. Đây chính xác là câu hỏi tôi định làm, và, ừm, nó sẽ là một "nhiều hơn/ít hơn" trùng lặp "... –
@DrBeco: trên Linux, bạn có thể sử dụng 'objcopy' với các định dạng' --input binary' và '--output' được chỉ định rõ ràng. Có một hướng dẫn đầy đủ về điều này ở đây: http://www.linuxjournal.com/content/embedding-file-executable-aka-hello-world-version-5967. Bạn cũng có thể sử dụng 'ld' với một số tùy chọn, tôi nghĩ' -b' để làm điều tương tự, thậm chí có thể dễ dàng hơn tùy thuộc vào kịch bản chính xác của bạn. –