Supponiamo di avere un file C senza dipendenza esterna e solo una sezione di dati const. Vorrei compilare questo file, e poi ottenere un blob binario che posso caricare in un altro programma, dove la funzione verrebbe utilizzata attraverso un puntatore a funzione.File di oggetto in codice binario
Facciamo un esempio, ecco un modulo 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--;
}
}
Vorrei compilarlo a f1.o, poi f1.bin, e usarlo come questo in 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);
}
Suppongo che va da f1.c a f1.o comporta -fPIC per ottenere posizione di indipendenza. Quali sono i flag o lo script linker che posso usare per passare da f1.o a f1.bin?
Chiarimento:
so di collegamento dinamico. il collegamento dinamico non è possibile in questo caso. Il passo di collegamento deve essere puntatore funzione cast per i dati caricati, se possibile.
Si supponga di non disporre di supporto per il sistema operativo. Se potessi, vorrei ad esempio scrivere f1 in assembly con indirizzo relativo al PC.
fai a sapere che è possibile utilizzare i file oggetto condivisi? Si compila il file .c in un file .so, quindi lo si carica 'dlopen()' nel proprio programma e si ottiene il puntatore alla funzione 'dlsym()' alla funzione. Quindi puoi chiamarlo. –
Dimentichiamo libc e collegamento dinamico – shodanex
Vuoi che il thingie 'f1.bin' sia caricato in modo dinamico (cioè in runtime)? Quindi devi costruire una libreria condivisa e usare ldopen() + ldsym() o altro caricatore di moduli (come gmodule). È probabile che provare a farlo in un altro modo sia difficile e rifiutato a causa di potenziali minacce alla sicurezza (esecuzione di segmenti di dati e così via). –