2010-07-23 10 views
7

En Linux, ¿hay alguna manera de insertar información de versión en un binario ELF? Me gustaría insertar esta información en tiempo de compilación para que luego pueda extraerla usando un script más adelante. Una forma peligrosa sería plantar algo que pueda extraerse usando el comando strings. ¿Hay un método más convencional, similar a cómo la información de la versión de la planta de Visual Studio para las DLL de Windows (observe la pestaña de la versión en las propiedades de la DLL)?Linux: ¿Cómo incrustar información de versión en una biblioteca compartida y en un archivo binario?

+0

posible duplicado de [Información de la versión del archivo] (http://stackoverflow.com/questions/2296101/file-version-information) –

Respuesta

9

Una forma de hacerlo si usa cvs o subversion es tener una cadena de identificación especial formateada especialmente en su archivo fuente. A continuación, agregue un enlace precompromiso a cvs o svn que actualice esa variable especial con la nueva versión del archivo cuando se confirma un cambio. Luego, cuando se construye el binario, puede usar ident para extraer esa información. Por ejemplo:

añadir algo como esto a su archivo CPP:

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

Y corriendo ident (que se puede encontrar mediante la instalación de RCS) en el programa debe mostrar la información sobre los archivos que tienen una cadena de ID en ellos.

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

Nota Como ya se ha mencionado en los comentarios de esta técnica es arcaico. Tener el sistema de control de fuente cambiar automáticamente su código fuente es feo y el hecho de que el control de fuente ha mejorado desde los días en que cvs era la única opción significa que puede encontrar una mejor manera de lograr los mismos objetivos.

+0

+1: Nunca me había encontrado ident antes, lo más útil. –

+2

'ident' alguna vez fue muy útil, pero la incrustación de las cadenas' $ Id $ 'se ha vuelto imprudente en el mundo de los Sistemas de Control de Versión distribuidos. Confunde diffs y se funde. – cdunn2001

1

Los compiladores Intel Fortran y C++ pueden hacer esto, use la opción -sox. Entonces, sí, hay una manera. No conozco ninguna convención generalizada para incluir dicha información en un binario y generalmente uso Emacs en modo hexl para leer la información incrustada, lo que es bastante hackish.

'-sox' también incorpora las opciones del compilador usadas para construir un archivo ejecutable, lo cual es muy útil.

1

Si declara una variable llamada program_version o similar, puede averiguar en qué dirección se almacena la variable y luego proceder a extraer su valor. P.ej.

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

me dice que reside en la dirección program_version0000000000600a24 y es de tamaño 4. A continuación, sólo leer el valor en esa dirección en el archivo.

O simplemente podría escribir un programa simple que vincule la biblioteca en preguntas e imprima la versión, definida como una variable exportada o una función.

3

Para extender la respuesta @sashang, evitando al mismo tiempo el "$ Id: $" cuestiones mencionadas por @ cdunn2001, ...

Se puede añadir un archivo "version_info.h" a su proyecto que sólo tiene:

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

Y en su archivo main.c tienen la línea:

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

(o como le quieran utilizar estos valores en su programa)

Luego configure un paso de preconstrucción que lea el archivo version_info.h, supere los números apropiadamente y lo vuelva a escribir.Una compilación diaria simplemente superaría el número de VERSION_BUILD, mientras que una versión más seria afectaría a otros números.

Si su archivo MAKE lista esto en la lista de requisitos previos de su objeto, la compilación recompilará lo que necesita.

Cuestiones relacionadas