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).
Archivo Resouce:
input.txtgcc (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).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ímbolobinary__input_txt_start
(sin subrayado).