Voglio dire se gcc può inserire qualche informazione sulla versione del codice sorgente in binario ELF come sezione o qualcosa di simile. Non voglio modificare il mio file sorgente, ma aggiungere alcune informazioni con l'opzione gcc in Makefile.gcc ha qualche opzione per aggiungere informazioni sulla versione nel file binario ELF?
risposta
È possibile immettere le informazioni sulla versione in un file di testo, quindi trasformare quel file di testo in un file oggetto che viene quindi collegato staticamente al file eseguibile.
Il primo passaggio è semplice ma è necessario scrivere del codice: uno script o qualcosa di simile per scrivere le informazioni sulla versione in qualsiasi formato desiderato come file di testo. Quindi scrivi una regola makefile per produrre say version.o da version.txt, usando objcopy. Ora avrai un file oggetto con due simboli utili definiti in esso: l'inizio e la fine delle informazioni sulla versione testuale. Aggiungi quell'oggetto generato al tuo eseguibile e sarai in grado di accedere alla versione in due modi: eseguendo strings
sul binario, o scrivendo il codice nell'applicazione per stampare la stringa di versione (dovrai dichiarare l'inizio e fine simboli come variabili in alcuni file di intestazione).
Se non ti dispiace cambiare il vostro file sorgente solo una volta, aggiungere qualcosa di simile:
const volatile static char version[] = VERSION;
e compilare con:
gcc -c -DVERSION='"1.2.3"'
Il volatile
mantiene gcc di rimuovere la stringa a più alto livelli di ottimizzazione
Come scritto, questo non verrà compilato se si dimentica l'opzione -D
, che può essere buona o cattiva a seconda delle esigenze.
Con il linker ld GNU È possibile utilizzare
--version-script=version-scriptfile
Per saperne di più sulle opzioni della riga di comando a: Using LD, the GNU linker - Options
Per saperne di più sulla creazione di script di versione in: Using LD, the GNU linker - Version Script
Let tuttavia ti avverto che non è per i deboli di cuore!
Gli script di versione sono destinati a scopi diversi dalla semplice registrazione delle impostazioni del compilatore. – o11c
Anche se non si ha accesso al sorgente di più, è possibile collegare l'oggetto con questa opzione:
gcc -Wl,--defsym,VERSION_1_2_3=0 prog.o -o prog
si può controllare con hexdump -C prog | less
e potete trovare VERSION
Aggiungi questo al tuo makefile
e assicurati di sapere sempre quando è stato compilato un programma:
BUILD = $(shell date +"%Y%m%d_%H%M%S")
LDLIBS = -Wl,--defsym,BUILD_$(BUILD)=0
- 1. Importare nomi nel binario ELF
- 2. Linux: come incorporare le informazioni sulla versione nella libreria condivisa e nel binario?
- 3. disponibili informazioni sulla versione
- 4. Linux, GNU GCC, ld, script di versione e formato binario ELF - Come funziona?
- 5. Strano binario ELF
- 6. Opzione di collegamento gcc per capire perché alcuni file oggetto sono collegati in binario
- 7. AssemblyInfo informazioni sulla versione asterischi
- 8. - opzione statica per gcc?
- 9. Libreria per leggere il file ELF Informazioni di debug DWARF
- 10. scrivi git commit informazioni sulla versione nel footer dell'app
- 11. Come recuperare la versione GCC utilizzata per compilare un dato eseguibile ELF?
- 12. Modifica file elf
- 13. Compilazione della DLL con informazioni sulla versione
- 14. Come includere le informazioni sulla versione nel nome file dell'output di installazione?
- 15. Come ordinare le informazioni sulla versione
- 16. Strumento per modificare la sezione dinamica di un binario ELF
- 17. Utilizzando XmlUpdate per impostare informazioni sulla versione da un'Assemblea
- 18. Autotools GNU: ricostruzione senza informazioni sulla versione
- 19. Generazione delle informazioni sulla versione in Matlab (Compilatore Matlab)
- 20. Opzione gcc -l e file libreria .la
- 21. Come posso rendere GCC compilare la sezione .text come scrivibile in un binario ELF?
- 22. C'è qualche opzione per la disinstallazione silenziosa?
- 23. Windows: riga di comando per leggere le informazioni sulla versione di un file eseguibile?
- 24. La parola chiave final ha qualche impatto sulla JVM?
- 25. Dov'è il codice per il gestore di segnali predefinito nel binario ELF?
- 26. Perché Python stampa informazioni sulla versione su stderr?
- 27. Come aggiungere qualche azione nel costruttore?
- 28. SchemaSpyGUI: Impossibile interrogare le informazioni sulla versione di Graphviz
- 29. Come aggiungere dati a un file binario?
- 30. Sandcastle/SHFB. Aggiungi le icone della piattaforma e le informazioni sulla versione per aiutare le pagine del file
Grazie. Trovo che ci sia un metodo migliore con objcopy: objcopy --add-section versection = version_text main_version main. E con "objdump -s -j versection main_version", la versione può essere recuperata. – Lane
Ciao John, vedo che sei un membro attivo, anche se questa risposta è vecchia. Ti interessa aggiornarlo con qualche semplice esempio di come compilare un file di testo su un oggetto? Dì "versione 1.1.1" o qualcosa del genere. Questa è esattamente la domanda che avrei dovuto fare e, beh, sarebbe un (più o meno) "duplicato" ... –
@DrBeco: su Linux è possibile utilizzare 'objcopy' con i formati' --input binary' e '--output' specificati in modo esplicito. C'è un tutorial completo su questo qui: http://www.linuxjournal.com/content/embedding-file-executable-aka-hello-world-version-5967. Puoi anche usare 'ld' con alcune opzioni, penso' -b' per fare la stessa cosa, forse anche più semplice a seconda del tuo scenario esatto. –