scripts script programas programa para español ejemplos ejecutar como comandos comando basicos c++ linux embedded-resource

c++ - script - ¿Hay alguna forma estándar de incrustar recursos en la imagen ejecutable de Linux?



scripts linux (4)

Esta pregunta ya tiene una respuesta aquí:

Es bastante fácil incrustar recursos binarios en imágenes PE (EXE, DLL) mediante la API de Windows (consulte http://msdn.microsoft.com/en-us/library/ms648008(v=VS.85).aspx ).

¿Hay alguna API estándar similar en Linux?

¿O tal vez algún tipo de enfoque de facto para la incorporación de recursos?

El objetivo es incrustar algunos datos estáticos binarios y / o textuales en el ejecutable, por ejemplo, imágenes, HTML, etc., para que la distribución binaria del programa sea tan simple como hacer una copia de un archivo. ( asumiendo que todas las dependencias de la biblioteca están bien )

Actualizar:

siguiendo la sugerencia de bdk , probé la solución descrita en Incrustar blobs binarios usando gcc mingw y funcionó para mí. Sin embargo, hubo algunos problemas que vale la pena mencionar: mi proyecto (en Code :: Blocks) consiste en una serie de archivos C ++ y agregar datos binarios en cualquiera de los archivos de objetos correspondientes los hace inútiles al romper la compilación: objdump -x mostraría que la mayoría de los símbolos se han ido después de la incrustación (y no encontré cómo solucionarlo). Para solucionar este problema, agregué un archivo .cpp ficticio vacío en el proyecto con el único propósito de proporcionar un archivo de objeto para jugar y escribí el siguiente paso de compilación personalizado para ese archivo que hizo el trabajo muy bien (el ejemplo utiliza macros de Code :: Blocks ):

$compiler $options $includes -c $file -o $object ld -Ur -b binary -o $object <binary payload path>


¿ makeself

creará un archivo tar desde un directorio donde todos sus programas, recursos, archivos en un archivo de shell ejecutable. Y cuando el usuario ejecuta el archivo ejecutable, extraerá los archivos y ejecutará un comando arbitrario (podría ser el ejecutable principal del programa). Hay un inconveniente, que cada vez que el usuario ejecuta el ejecutable, lleva tiempo cargar / extraer los archivos primero, antes de iniciar el programa real.


Hazte un archivo ensamblador, blob.S:

.global blob .global blob_size .section .rodata blob: .incbin "blob.bin" 1: blob_size: .int 1b - blob

Compile con gcc -c blob.S -o blob.o Ahora puede acceder al blob desde su programa C con:

extern uint8_t blob[]; extern int blob_size;

El uso de un convertidor bin2c generalmente funciona bien, pero si el blob es grande, la solución incbin es mucho más rápida y usa menos memoria (tiempo de compilación)


Por supuesto. Intente algo como el convertidor Bin2Hex . Convierta los datos binarios en una matriz de caracteres de C ++ y luego insértelos en su código como una variable constante.


objcopy --add-section le permite agregar un archivo arbitrario como una sección en un ejecutable ELF. (objcopy man page). Sin embargo, esto es solo la mitad de una solución, ya que aún no he encontrado una manera de acceder a estos datos desde dentro de un Programa en C, aparte de cargar y analizar el Binario ELF utilizando una Biblioteca ELF.

Editar información adicional:

Si tiene un programa compilado llamado MyProgram y un archivo de recursos MyResource.dat que desea incrustar en MyProgram, puede usar el comando objcopy como este:

objcopy MyProgram --add-section MyResource=MyResource.dat

Ahora si mira su programa usando el comando objdump -x MyProgram

Verá una sección llamada MyResource que contiene los contenidos de MyResource.dat. El archivo ahora está incrustado dentro de su ejecutable.

El truco ahora es cómo acceder a los datos desde el interior de su programa. Mi instinto me dice que el cargador debe colocar el archivo en la memoria en algún lugar y usted debería poder apuntarlo, pero no estoy seguro de cómo hacerlo. Idealmente, me gustaría poder abrir mi sección ejecutable y dlsym, pero eso no funciona porque es una sección y no un símbolo.

La única alternativa que conozco para acceder a la sección desde dentro del programa es usar la biblioteca libelf o algo similar, que es un poco como usar un martillo para tocar un clavo. Puede usarlo en su aplicación para cargarse como un recurso ELF y recuperar las secciones. La documentación es escasa, pero aquí hay un ejemplo.

http://em386.blogspot.com/2007/03/quick-libelf-guide.html

Me encantaría que alguien pudiera participar con una forma más fácil de acceder a los datos desde --add-section.

Edit 2 En mi investigación encontré esta pregunta: Incrustar blobs binarios usando gcc mingw

Lo que debería funcionar tanto para gcc como para mingw y muestra una forma de usar ld en lugar de objcopy para agregar los datos y poder acceder a ellos como un símbolo. Parece prometedor