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?
Antwort
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.
+1: Ich würde nie vorher auf ident stoßen, am nützlichsten. –
'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
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.
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.
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.
- 1. Gemeinsam genutzte Bibliothek Name Kollisionen
- 2. Eine dynamisch verknüpfte gemeinsam genutzte Bibliothek erweitern?
- 3. Gemeinsam genutzte Bibliothek für MonoDroid und MonoTouch
- 4. Können konkurrierende Prozesse in eine gemeinsam genutzte Datenbank schreiben?
- 5. Linux, Mono, gemeinsam genutzte Bibliotheken und unaufgelöste Symbole
- 6. Wie Sie eine gemeinsam genutzte Bibliothek in C++ einbinden? libORB_SLAM
- 7. Wie bette ich Versionsinformationen in eine Windows-Binärdatei ein?
- 8. Gemeinsam genutzte Einstellungen lesen
- 9. gemeinsam genutzte Bibliothek kompiliert, hat aber Symbole undefined
- 10. Libtool erstellt nur statische Bibliothek - ich brauche gemeinsam genutzte Objekte
- 11. Gemeinsam genutzte Vektoren in OpenMP
- 12. Linux: Wie werden .pc-Dateien verwendet, wenn sie mit einer gemeinsam genutzten Bibliothek verlinkt werden?
- 13. Wie Laufzeit gemeinsam genutzte Bibliotheken debuggen?
- 14. Verhindern, dass Funktionen aus einer statischen Bibliothek entfernt werden, wenn sie in eine gemeinsam genutzte Bibliothek eingebunden werden?
- 15. CMake erhalten, um gemeinsam genutzte Bibliothek für MSVC zu erstellen
- 16. linux dlopen: Kann eine Bibliothek beim Laden "benachrichtigt" werden?
- 17. Gemeinsam genutzte Bibliothek für verschiedene Versionen von Ubuntu verwalten
- 18. Crystal Reports, Unterberichte, und gemeinsam genutzte Variablen
- 19. Können Sie gemeinsam genutzte Zeiger mit Nicht-Zeiger-Datenelementen mischen?
- 20. Warum eine statische Bibliothek zu Ausrichtungsproblemen führt, wenn die gleiche gemeinsam genutzte Bibliothek in Ordnung ist?
- 21. speichern Hashzuordnung Gemeinsam genutzte Einstellungen
- 22. Dwarf Verschiebungen und gemeinsam genutzte Objekte vs Executables
- 23. Gemeinsam genutzte Festplatten mit COMPS
- 24. Dilemma über gemeinsam genutzte Bibliotheken unter Unix
- 25. ALLGEMEINEN Block gemeinsam genutzte Variablen
- 26. Möglich, eine gemeinsam genutzte Bibliothek mit statisch verknüpfter Bibliothek zu erstellen?
- 27. Erstelle gemeinsam genutzte Bibliothek aus cpp-Dateien und statische Bibliothek mit g ++
- 28. Eclipse-: JVM gemeinsam genutzte Bibliothek nicht das JNI_CreateJavaVM Symbol
- 29. Wie wird eine gemeinsam genutzte Bibliotheksdatei von zwei verschiedenen Prozessen in Linux aufgerufen?
- 30. Wie hakt man eine Funktion für eine bestimmte gemeinsam genutzte ELF-Bibliothek?
möglich duplicate von [Informationen zur Dateiversion] (http://stackoverflow.com/questions/2296101/file-version-information) –