Incrustar blobs binarios usando gcc mingw

Estoy tratando de incrustar blobs binarios en un archivo exe. Estoy usando mingw gcc.

Hago el archivo objeto así:

ld -r -b binary -o binary.o input.txt 

Luego busco salida objdump para obtener los símbolos:

 objdump -x binary.o 

Y da símbolos llamados:

 _binary_input_txt_start _binary_input_txt_end _binary_input_txt_size 

Luego trato de acceder a ellos en mi progtwig C:

 #include  #include  extern char _binary_input_txt_start[]; int main (int argc, char *argv[]) { char *p; p = _binary_input_txt_start; return 0; } 

Luego compilo así:

 gcc -o test.exe test.c binary.o 

Pero siempre me sale:

 undefined reference to _binary_input_txt_start 

¿Alguien sabe lo que estoy haciendo mal?

En su progtwig C, elimine el guion bajo inicial:

 #include  #include  extern char binary_input_txt_start[]; int main (int argc, char *argv[]) { char *p; p = binary_input_txt_start; return 0; } 

Los comstackdores de C a menudo (¿siempre?) Parecen anteponer un guion bajo a los nombres extern . No estoy del todo seguro de por qué es eso. Supongo que hay algo de verdad en el artículo de esta wikipedia que dice que

Era una práctica común para los comstackdores de C anteponer un subrayado inicial a todos los identificadores de progtwigs de scope externo para evitar conflictos con las contribuciones del soporte de lenguaje de tiempo de ejecución.

Pero me sorprende que si los caracteres de subrayado se antepusieron a todos los externos, entonces realmente no estás compartiendo mucho el espacio de nombres. De todos modos, esa es una pregunta para otro día, y el hecho es que los guiones bajos se agregan.

Lo probé en Linux (Ubuntu 10.10).

  1. Archivo Resouce:
    input.txt

  2. gcc (Ubuntu / Linaro 4.4.4-14ubuntu5) 4.4.5 [genera el ejecutable ELF, para Linux]
    Genera el símbolo _binary__input_txt_start .
    Acepta el símbolo _binary__input_txt_start (con subrayado).

  3. i586-mingw32msvc-gcc (GCC) 4.2.1-sjlj (mingw32-2) [genera el ejecutable de PE, para Windows]
    Genera el símbolo _binary__input_txt_start .
    Acepta el símbolo binary__input_txt_start (sin subrayado).

De la página ld man :

–leading-underscore

–no-leading-underscore

Para la mayoría de los objectives, el prefijo de símbolo predeterminado es un guión bajo y se define en la descripción del objective. Con esta opción, es posible desactivar / habilitar el prefijo de subrayado predeterminado.

asi que

 ld -r -b binary -o binary.o input.txt --leading-underscore 

debería ser una solución.

Aparentemente esta característica no está presente en la ld de OSX, por lo que debe hacerlo de manera totalmente diferente con un indicador de gcc personalizado que agregaron, y no puede hacer referencia directamente a los datos, pero debe hacer alguna inicialización de tiempo de ejecución para obtener la dirección.

Por lo tanto, podría ser más portátil crear un archivo fuente ensamblador que incluya el binario en tiempo de comstackción, a la la respuesta .