Mam na myśli to, czy gcc może wstawić informacje o wersji kodu źródłowego do binarnego ELF jako sekcji lub czegoś podobnego. Nie chcę zmieniać pliku źródłowego, ale dodam trochę informacji z opcją gcc w Makefile.Czy gcc ma jakieś opcje dodawania informacji o wersji w pliku binarnym ELF?
Odpowiedz
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).
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ń.
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!
Skrypty wersji są przeznaczone do różnych celów niż tylko nagrywanie ustawień kompilatora. – o11c
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
- 1. Czy opcje łącznika gcc mogą zmienić instrukcje asemblera w skompilowanym pliku binarnym?
- 2. Skąd wiadomo, jaki typ informacji o debugowaniu znajduje się w pliku obiektów ELF?
- 3. Autouzyby GNU: przebuduj bez informacji o wersji
- 4. Czy mogę zmienić "rpath" w już skompilowanym pliku binarnym?
- 5. Czy dołączanie dowolnych danych do pliku ELF narusza specyfikację ELF?
- 6. Gdzie jest kod dla domyślnej obsługi sygnału w binarnym ELF?
- 7. Czy GCC ma GUI?
- 8. Jak odzyskać wersję GCC używaną do kompilowania danego pliku wykonywalnego ELF?
- 9. Czy JMockit ma jakieś wady?
- 10. Sposób wypełniania informacji o proxy w pliku konfiguracyjnym cntlm
- 11. Generowanie informacji o wersji w programie Matlab (Matlab Compiler)
- 12. gcc 4.3.3 opcje kompilatora włączone domyślnie
- 13. MinGW - Zaktualizuj GCC w wersji 3.4.5 do wersji 4.4
- 14. Czy ktokolwiek ma jakieś doświadczenie z Hobo?
- 15. Dodawanie sekcji do pliku ELF
- 16. Czy są jakieś opcje kompilatora, aby upuszczenie zrzutu z wersji x64 było bardziej użyteczne?
- 17. Instalacja starszej wersji gcc
- 18. LD_PRELOAD z setuidem binarnym
- 19. Czy LIMIT 1 ma jakieś zwiększenie wydajności?
- 20. Czy List.Insert ma jakieś kary za wydajność?
- 21. Gdzie jest tabela importu w pliku ELF?
- 22. co jest wykorzystanie "-wa, opcje" w gcc
- 23. Opcje gcc -I i -L nie działają.
- 24. Dlaczego wbudowany asembler GCC wymaga informacji o przenikaniu, ale MSVC nie jest
- 25. Czy istnieje sposób uzyskania informacji o GPU?
- 26. połączyć dwa pliki skumulowane GCC .o w trzeci plik .o
- 27. Czy są jakieś książki o Lucene.NET
- 28. Czy są jakieś podcasty o Delphi?
- 29. Jak dołączyć informacje o wersji do pliku wynikowego instalacji?
- 30. DIV nie ma informacji o zmianie rozmiaru ekranu
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
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" ... –
@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. –