que archivo linux gcc elf

linux - que - ¿Tiene gcc alguna opción para agregar información de versión en un archivo binario ELF?



que es un archivo elf (4)

Me refiero a si gcc puede insertar alguna versión del código fuente en el binario ELF como sección o algo similar. No quiero cambiar mi archivo fuente, pero agrego información con la opción gcc en Makefile.



Incluso si ya no tiene acceso a su fuente, puede vincular el objeto con esta opción:

gcc -Wl,--defsym,VERSION_1_2_3=0 prog.o -o prog

Puedes comprobarlo con hexdump -C prog | less hexdump -C prog | less y busca la VERSION

Agregue esto a su makefile y asegúrese de saber siempre cuando se compiló un programa:

BUILD = $(shell date +"%Y%m%d_%H%M%S") LDLIBS = -Wl,--defsym,BUILD_$(BUILD)=0


Puede emitir la información de su versión en un archivo de texto, luego convertir ese archivo de texto en un archivo de objeto que luego vinculará estáticamente en su archivo ejecutable.

El primer paso es simple, pero tiene que escribir un código: un script o algo para escribir la información de su versión en cualquier formato que desee como un archivo de texto plano. Luego escriba una regla de makefile para producir, por ejemplo, version.o de version.txt, usando objcopy . Ahora tendrá un archivo de objeto con dos símbolos útiles definidos: el principio y el final de la información de la versión textual. Agregue ese objeto generado a su archivo ejecutable, y podrá acceder a la versión de dos maneras: ejecutando strings en el binario, o escribiendo código en la aplicación para imprimir la cadena de versión (deberá declarar el inicio y símbolos finales como variables en algún archivo de cabecera).


Si no te importa cambiar el archivo fuente solo una vez, agrega algo como esto:

const volatile static char version[] = VERSION;

y compilar con:

gcc -c -DVERSION=''"1.2.3"''

La volatile evita que gcc elimine la cadena en niveles de optimización más altos.

Como está escrito, esto no se compilará si olvida la opción -D , que puede ser buena o mala según sus requisitos.