2010-07-23 2 views
7

Gibt es unter Linux eine Möglichkeit, Versionsinformationen in eine ELF-Binärdatei einzubetten? Ich möchte diese Informationen zur Kompilierzeit einbetten, damit sie später mit einem Skript extrahiert werden können. Ein hackischer Weg wäre, etwas zu pflanzen, das mit dem Befehl strings extrahiert werden kann. Gibt es eine konventionellere Methode, ähnlich wie Visual Studio-Anlagenversionsinfo für Windows-DLLs (Versionsregister in DLL-Eigenschaften beachten)?Linux: Wie können Versionsinformationen in eine gemeinsam genutzte Bibliothek und Binärdatei eingebettet werden?

+0

möglich duplicate von [Informationen zur Dateiversion] (http://stackoverflow.com/questions/2296101/file-version-information) –

Antwort

9

Eine Möglichkeit, dies zu tun, wenn Sie cvs oder subversion verwenden, ist eine spezielle ID-Zeichenfolge, die speziell in Ihrer Quelldatei formatiert ist. Fügen Sie dann cvs oder svn einen Pre-Commit-Hook hinzu, der diese spezielle Variable mit der neuen Version der Datei aktualisiert, wenn eine Änderung festgeschrieben wird. Wenn die Binärdatei dann erstellt wird, können Sie Ident verwenden, um diese Indformation zu extrahieren. Zum Beispiel:

so etwas zu Ihrer CPP-Datei hinzufügen:

static char fileid[] = "$Id: fname.cc,v 1.124 2010/07/21 06:38:45 author Exp $"; 

Und laufen ident auf dem Programm (die Sie durch die Installation von rcs finden) sollten die Informationen über die Dateien anzuzeigen, die einen ID-String haben in ihnen.

ident program 
program: 
    $Id: fname.cc,v 1.124 2010/07/21 06:38:45 author Exp $ 

Hinweis Da die Menschen in den Kommentaren erwähnt haben diese Technik ist veraltet. Das Quellcodeverwaltungssystem automatisch zu ändern, ist hässlich und die Tatsache, dass sich die Quellcodeverwaltung seit den Tagen verbessert hat, an denen cvs die einzige Option war, bedeutet, dass Sie einen besseren Weg finden können, dieselben Ziele zu erreichen.

+0

+1: Ich würde nie vorher auf ident stoßen, am nützlichsten. –

+2

'ident' war einmal sehr nützlich, aber die Einbettung von' $ Id $ '- Strings ist in der Welt der verteilten Versionskontrollsysteme unklug geworden. Es führt Diffs und Zusammenführungen aus. – cdunn2001

1

Die Intel Fortran und C++ Compiler können dies sicherlich tun, verwenden Sie die -sox Option. Also, ja, es gibt einen Weg. Ich kenne keine weitverbreitete Konvention für die Einbettung solcher Informationen in eine Binärdatei und ich benutze im Allgemeinen Emacs im Hexl-Modus zum Lesen der eingebetteten Informationen, die ziemlich hackish sind.

'-sox' bettet auch die Compiler-Optionen ein, die zum Erstellen einer ausführbaren Datei verwendet werden, was sehr nützlich ist.

1

Wenn Sie eine Variable mit dem Namen program_version oder ähnlich deklarieren, können Sie herausfinden, an welcher Adresse die Variable gespeichert ist, und dann fortfahren, um ihren Wert zu extrahieren. Z.B.

objdump -t --demangle /tmp/libtest.so | grep program_version 
0000000000600a24 g  O .data 0000000000000004    program_version 

mir sagt, dass program_version an der Adresse befindet 0000000000600a24 und ist die Größe 4. Dann lesen Sie einfach den Wert an dieser Adresse in der Datei.

Oder Sie könnten nur ein einfaches Programm schreiben, das die Bibliothek in Fragen und druckt die Version verbindet, entweder als exportierte Variable oder eine Funktion definiert.

3

die @sashang Antwort zu verlängern, während der Vermeidung von „$ Id: $“ Themen von @ erwähnt cdunn2001, ...

Sie können eine Datei „version_info.h“ zu Ihrem Projekt hinzufügen, die nur hat:

#define VERSION_MAJOR "1" 
#define VERSION_MINOR "0" 
#define VERSION_PATCH "0" 
#define VERSION_BUILD "0" 

und in Ihrer main.c Datei haben Sie die Zeile:

static char version[] = VERSION_MAJOR "." VERSION_MINOR "." VERSION_PATCH "." VERSION_BUILD; 
static char timestamp[] = __DATE__ " " __TIME__; 

(oder wie auch immer Sie wollen diese Werte in Ihrem Programm verwenden)

Richten Sie dann einen Pre-Build-Schritt ein, der die version_info.h-Datei liest, die Nummern entsprechend anstößt und sie wieder ausgibt.Ein täglicher Build würde nur die VERSION_BUILD-Nummer überschreiten, während eine ernsthaftere Version andere Nummern stürzen würde.

Wenn Ihr Makefile dies in der Liste der vorausgesetzten Objekte Ihres Objekts auflistet, kompiliert das Build das, was es benötigt.

Verwandte Themen