c++ - ¿Puedo vincular un archivo simple en mi ejecutable?
gcc linker (2)
En su forma más básica, el equivalente es una matriz de caracteres llena de bytes.
En Linux puede usar xxd -i <file>
para "compilar" archivos en arreglos de caracteres, luego enlazar los arreglos en su binario y usar los bytes constituyentes como lo desee.
Aquí hay un ejemplo del makefile
de mi propio código, que crea un "archivo de recursos" llamado templates.h
contiene un conjunto de matrices de caracteres que representan plantillas HTML:
templates.h:
@echo "#ifndef REDACTED_TEMPLATES_H" > templates.h
@echo "#define REDACTED_TEMPLATES_H" >> templates.h
@echo "// Auto-generated file! Do not modify!" >> templates.h
@echo "// NB: arrays are not null-terminated" >> templates.h
@echo "// (anonymous namespace used to force internal linkage)" >> templates.h
@echo "namespace {" >> templates.h
@echo "namespace templates {" >> templates.h
@cd templates;/
for i in * ;/
do /
echo "Compiling $$i...";/
xxd -i $$i | sed -e ''s/ =/ __attribute__((unused)) =/'' >> ../templates.h;/
done;/
cd ..
@echo "}" >> templates.h
@echo "}" >> templates.h
@echo "#endif" >> templates.h
( ver también: ¿Cuál es la mejor forma de aplicar programáticamente `__attribute__ ((no utilizado))` a estos objetos autogenerados? )
El resultado se parece un poco a:
#ifndef REDACTED_TEMPLATES_H
#define REDACTED_TEMPLATES_H
// Auto-generated file! Do not modify!
// NB: arrays are not null-terminated
// (anonymous namespace used to force internal linkage)
namespace {
namespace templates {
unsigned char alert_email_finished_events_html[] __attribute__((unused)) = {
0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
0x3d, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x2d,
[..]
0x7d, 0x7d, 0x0d, 0x0a, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e,
0x0d, 0x0a
};
unsigned int alert_email_finished_events_html_len __attribute__((unused)) = 290;
unsigned char alert_email_finished_events_list_html[] __attribute__((unused)) = {
0x3c, 0x74, 0x72, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x73,
0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x2d, 0x70, 0x72, 0x65, 0x76,
[..]
0x73, 0x74, 0x7d, 0x7d, 0x0d, 0x0a
};
unsigned int alert_email_finished_events_list_html_len __attribute__((unused)) = 42;
}
}
#endif
Tenga en cuenta que este ejemplo particular es óptimo cuando se utiliza el recurso en una sola Unidad de Traducción, pero el enfoque general se puede adaptar a sus necesidades.
Esta pregunta ya tiene una respuesta aquí:
Algunos frameworks (Qt, Windows, Gtk ...) ofrecen funcionalidad para agregar recursos a sus binarios. Me pregunto si sería posible lograr esto sin el marco, ya que todo lo que realmente se necesita es
- un símbolo para contener la dirección del recurso dentro del binario (segmento de datos)
- un símbolo para representar la longitud del recurso
- el recurso en sí
¿Cómo se puede lograr esto con la cadena de herramientas gcc?
Podrías hacer esto:
objcopy --input binary /
--output elf32-i386 /
--binary-architecture i386 my_file.xml myfile.o
Esto produce un archivo objeto que puede vincular a su ejecutable. Este archivo contendrá estos símbolos que deberá declarar en su código C para poder usarlos
00000550 D _binary_my_file_xml_end
00000550 A _binary_my_file_xml_size
00000000 D _binary_my_file_xml_start