Linux: Comment intégrer des informations de version dans une bibliothèque partagée et des fichiers binarys?

Sous Linux, existe-t-il un moyen d’intégrer des informations de version dans un binary ELF? Je voudrais intégrer cette information au moment de la compilation pour pouvoir l’extraire ultérieurement à l’aide d’un script. Un moyen hacker serait de planter quelque chose qui peut être extrait en utilisant la commande ssortingngs . Existe-t-il une méthode plus conventionnelle, similaire à la façon dont les informations de version de Visual Studio pour les DLL Windows (onglet de version de note dans les propriétés de la DLL)?

Une façon de le faire si vous utilisez cvs ou subversion consiste à avoir une chaîne d’identification spéciale formatée spécialement dans votre fichier source. Ajoutez ensuite un hook pre-commit à cvs ou svn qui met à jour cette variable spéciale avec la nouvelle version du fichier quand une modification est validée. Ensuite, lorsque le fichier binary est créé, vous pouvez utiliser ident pour extraire cette information. Par exemple:

Ajoutez quelque chose comme ceci à votre fichier cpp:

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

Et exécuter ident (que vous pouvez trouver en installant des rcs) sur le programme devrait afficher les informations sur les fichiers qui ont une chaîne d’identifiant.

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

Note Comme les gens l’ont mentionné dans les commentaires, cette technique est archaïque. Avoir le système de contrôle de code source change automatiquement votre code source est moche et le fait que le contrôle de code source se soit amélioré depuis que cvs était la seule option signifie que vous pouvez trouver un meilleur moyen d’atteindre les mêmes objectives.

Pour étendre la réponse à @sashang, en évitant les problèmes “$ Id: $” mentionnés par @ cdunn2001, …

Vous pouvez append un fichier “version_info.h” à votre projet qui n’a que:

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

Et dans votre fichier main.c avoir la ligne:

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

(ou si vous voulez utiliser ces valeurs dans votre programme)

Ensuite, configurez une étape de pré-construction qui lit le fichier version_info.h, compense les nombres de manière appropriée et le réécrit. Une version quotidienne se contenterait de passer le numéro VERSION_BUILD, tandis qu’une version plus sérieuse se heurterait à d’autres numéros.

Si votre makefile le liste dans la liste de prérequirejs de votre object, la compilation recomstackra ce dont il a besoin.

Si vous déclarez une variable appelée program_version ou similaire, vous pouvez trouver à quelle adresse la variable est stockée et ensuite extraire sa valeur. Par exemple

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

me dit que program_version réside à l’adresse 0000000000600a24 et est de taille 4. Ensuite, il suffit de lire la valeur à cette adresse dans le fichier.

Ou vous pouvez simplement écrire un programme simple qui relie la bibliothèque aux questions et imprime la version, définie comme une variable exscope ou une fonction.

Les compilateurs Intel Fortran et C ++ peuvent certainement le faire, utilisez l’option -sox . Alors oui, il y a un moyen. Je ne connais pas de convention répandue pour intégrer de telles informations dans un fichier binary et j’utilise généralement Emacs en mode hexl pour lire les informations incorporées, ce qui est assez piraté.

‘-sox’ incorpore également les options du compilateur utilisées pour créer un exécutable, ce qui est très utile.