Supongamos que tengo un archivo C sin dependencia externa, y solo la sección de datos const. Me gustaría compilar este archivo, y luego obtener un blob binario que puedo cargar en otro programa, donde la función se utilizaría a través de un puntero de función.Archivo de objeto a código binario
Tomemos un ejemplo, aquí es un módulo binario fictionnal, f1.c
static const unsigned char mylut[256] = {
[0 ... 127] = 0,
[128 ... 255] = 1,
};
void f1(unsigned char * src, unsigned char * dst, int len)
{
while(len) {
*dst++ = mylut[*src++];
len--;
}
}
me gustaría compilarlo a f1.o, entonces f1.bin, y utilizar de esta manera en Prog .c
int somefunc() {
unsigned char * codedata;
f1_type_ptr f1_ptr;
/* open f1.bin, and read it into codedata */
/* set function pointer to beginning of loaded data */
f1_ptr =(f1_type_ptr)codedata;
/* call !*/
f1_ptr(src, dst, len);
}
Supongo que pasar de f1.c a f1.o implica -fPIC para obtener la independencia de posición. ¿Cuáles son las banderas o la secuencia de comandos del enlazador que puedo usar para pasar de f1.o a f1.bin?
Aclaración:
Sé acerca de la vinculación dinámica. el enlace dinámico no es posible en este caso. El paso de enlace debe ser puntero func de conversión a datos cargados, si es posible.
Supongamos que no hay compatibilidad con el sistema operativo. Si pudiera, me gustaría, por ejemplo, escribir f1 en el ensamblaje con la dirección relacionada con PC.
¿Conoce que puede utilizar archivos de objetos compartidos? Usted compila su archivo .c en .so, luego lo carga 'dlopen()' en su programa, y obtiene el puntero de función 'dlsym()' para la función. Entonces puedes llamarlo. –
Olvidémonos de la vinculación libc y dinámica – shodanex
¿Desea que la thingie 'f1.bin' se cargue dinámicamente (es decir, en tiempo de ejecución)? Luego, debe compilar una biblioteca compartida y usar ldopen() + ldsym() u otro cargador de módulos (como gmodule). Tratar de hacerlo de otra forma es probable que sea difícil y se rechace debido a posibles amenazas a la seguridad (ejecutar segmento de datos, etc.). –