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?
Linux: ¿Cómo incrustar información de versión en una biblioteca compartida y en un archivo binario?
Respuesta
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.
+1: Nunca me había encontrado ident antes, lo más útil. –
'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
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.
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_version
0000000000600a24
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.
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.
- 1. Incrustar un archivo binario dentro de una biblioteca de clases
- 2. Cómo inicializar una biblioteca compartida en Linux
- 3. Biblioteca compartida dinámica de C++ en Linux
- 4. Cómo enlazar a una versión específica de una biblioteca compartida en GCC
- 5. transformar una información hexadecimal a binario utilizando comandos de Linux
- 6. cómo vincular la biblioteca compartida con otra biblioteca compartida en Linux?
- 7. ¿cómo se llama un archivo de biblioteca compartida por dos procesos diferentes en Linux?
- 8. Exportación explícita de funciones de biblioteca compartida en Linux
- 9. ¿Cómo almacenar un número de versión en una biblioteca estática?
- 10. ¿Cómo crear una biblioteca compartida (.so) en un script automake?
- 11. Cómo exportar símbolos de una biblioteca compartida
- 12. valgrind - Buscar pérdida de memoria en una biblioteca compartida
- 13. Determine la arquitectura de destino del archivo binario en Linux (biblioteca o ejecutable)
- 14. ¿Cómo vincular una versión específica de una biblioteca compartida en makefile sin usar LD_LIBRARY_PATH?
- 15. Linking boost a la biblioteca compartida con CMake en Linux
- 16. ¿Existe un archivo .def equivalente en Linux para controlar nombres de funciones exportadas en una biblioteca compartida?
- 17. Incrustar un ejecutable binario en un script de shell
- 18. librería compartida de Linux que utiliza un símbolo indefinido biblioteca compartida
- 19. Linux: ejecutar un archivo binario en un script
- 20. Vinculación de una biblioteca compartida mediante gcc
- 21. Biblioteca compartida en Go?
- 22. ¿Cómo puedo vincular libc.a en una biblioteca compartida en arm-linux use arm-none-linux-gnueabi-gcc
- 23. ¿Cómo inicializar los recursos de Qt de una biblioteca compartida?
- 24. Estrategias de manejo de errores en una biblioteca compartida - C
- 25. Linux, GNU GCC, ld, scripts de versión y el formato binario ELF - ¿Cómo funciona?
- 26. Cargar copias múltiples de una biblioteca compartida
- 27. Es una variable global en una biblioteca/dll compartida, compartida en el proceso
- 28. Encontrar la dirección de carga de una biblioteca compartida en Linux
- 29. Uso de una variable global en una biblioteca compartida
- 30. ¿Cómo compilar una biblioteca estática en Linux?
posible duplicado de [Información de la versión del archivo] (http://stackoverflow.com/questions/2296101/file-version-information) –