2013-05-02 8 views

Odpowiedz

6

Możesz wyświetlić informacje o wersji w pliku tekstowym, a następnie przekształcić ten plik tekstowy w plik obiektowy, który następnie statycznie łączy się z plikiem wykonywalnym.

Pierwszy krok jest prosty, ale musisz napisać jakiś kod: skrypt lub coś, co można zapisać w informacjach o wersji w dowolnym formacie, który chcesz, jako plik tekstowy. Następnie napisz regułę makefile, aby utworzyć wersję say.o z wersji.txt, używając objcopy. Teraz będziesz miał plik obiektowy z dwoma użytecznymi symbolami zdefiniowanymi w nim: początkiem i końcem informacji o wersji tekstowej. Dodaj ten wygenerowany obiekt do pliku wykonywalnego, a będziesz mógł uzyskać dostęp do dwóch wersji: uruchamiając strings na pliku binarnym lub wpisując kod w aplikacji, aby wydrukować ciąg wersji (musisz zadeklarować początek i symbole końca jako zmienne w niektórych plikach nagłówkowych).

+4

Dzięki. Uważam, że istnieje lepsza metoda z objcopy: objcopy --add-section versection = version_text main_version. Z "objdump -s -j werset main_version" można pobrać wersję. – Lane

+1

Cześć John, widzę, że jesteś aktywnym członkiem, nawet jeśli ta odpowiedź jest stara. Czy chcesz zaktualizować go o bardzo prosty/prosty przykład jak skompilować plik tekstowy do obiektu? Powiedz "wersja 1.1.1" lub coś w tym stylu. Dokładnie to pytanie miałem zamiar zrobić, i, cóż, byłoby to (więcej/mniej) "duplikat" ... –

+1

@DrBeco: w systemie Linux można użyć 'objcopy' z jawnie określonymi formatami' --input binary' i '--output'. Pełny tutorial znajduje się tutaj: http://www.linuxjournal.com/content/embedding-file-executable-aka-hello-world-version-5967. Możesz też użyć 'ld' z niektórymi opcjami, myślę, że' -b' robi to samo, być może nawet łatwiejsze w zależności od twojego scenariusza. –

6

Jeśli nie przeszkadza zmiana pliku źródłowego tylko raz, dodać coś takiego:

const volatile static char version[] = VERSION; 

i skompilować z:

gcc -c -DVERSION='"1.2.3"' 

volatile utrzymuje gcc z wyjęciem ciąg na wyższy poziomy optymalizacji.

Jak napisano, nie skompiluje się, jeśli zapomnisz opcji -D, która może być dobra lub zła w zależności od Twoich wymagań.

-1

z łącznikiem LD GNU Można użyć

--version-script=version-scriptfile 

Więcej informacji na temat opcji wiersza polecenia w: Using LD, the GNU linker - Options

Czytaj więcej o tworzeniu skryptów wersja pod adresem: Using LD, the GNU linker - Version Script

Let ostrzegam cię jednak, że nie dla słabych!

+1

Skrypty wersji są przeznaczone do różnych celów niż tylko nagrywanie ustawień kompilatora. – o11c

4

Nawet jeśli nie masz dostępu do źródła więcej, można połączyć obiekt z tej opcji:

gcc -Wl,--defsym,VERSION_1_2_3=0 prog.o -o prog 

Można to sprawdzić z hexdump -C prog | less i szukać VERSION


Dodaj to do swojej makefile i pamiętaj, aby zawsze wiedzieć, kiedy program został skompilowany:

BUILD = $(shell date +"%Y%m%d_%H%M%S") 
LDLIBS = -Wl,--defsym,BUILD_$(BUILD)=0 
Powiązane problemy