2013-05-02 11 views

risposta

6

È 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).

+4

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

+1

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

+1

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

6

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.

-1

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!

+1

Gli script di versione sono destinati a scopi diversi dalla semplice registrazione delle impostazioni del compilatore. – o11c

4

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 
Problemi correlati