reconoce para interno instalar externo descargar compilador como comando c gcc binary mingw

c - para - mingw download



Incrustar blobs binarios usando gcc mingw (4)

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 compilación, a la la respuesta .

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 programa C:

#include <stdlib.h> #include <stdio.h> 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?


De la página ld man :

--leading-underscore

--no-leading-underscore

Para la mayoría de los objetivos, el prefijo de símbolo predeterminado es un guión bajo y se define en la descripción del objetivo. 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.


En su programa C, elimine el guion bajo inicial:

#include <stdlib.h> #include <stdio.h> extern char binary_input_txt_start[]; int main (int argc, char *argv[]) { char *p; p = binary_input_txt_start; return 0; }

Los compiladores 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 compiladores de C anteponer un subrayado inicial a todos los identificadores de programas de alcance 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).