2013-05-02 23 views

Trả lời

6

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 đề).

+4

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

+1

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 "... –

+1

@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. –

6

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.

-1

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!

+1

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

4

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 
Các vấn đề liên quan