Załóżmy, że mam plik C bez zewnętrznej zależności i tylko sekcję danych stałych. Chciałbym skompilować ten plik, a następnie uzyskać binarny obiekt blob, który można załadować w innym programie, gdzie funkcja ta będzie używana przez wskaźnik funkcji.Plik obiektowy na kod binarny
Weźmy przykład, tutaj jest fictionnal moduł binarny, 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--;
}
}
Chciałbym skompilować go f1.o, następnie f1.bin i używać go jak ten w 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);
}
Przypuszczam, że przejście z f1.c do f1.o wymaga -fPIC do uzyskania niezależności pozycji. Jakie są flagi lub skrypt linkera, które mogę użyć , aby przejść z f1.o do f1.bin?
Wyjaśnienie:
wiem o dynamicznego łączenia. dynamiczne łączenie nie jest możliwe w tym przypadku. Etap łączenia musi być rzutowany wskaźnik funkcyjny na załadowane dane, jeśli jest to możliwe.
Należy założyć, że nie ma obsługi systemu operacyjnego. Gdybym mógł, chciałbym na przykład napisać f1 w zestawie z przypisaniem do komputera.
Czy wiesz, że można korzystać z udostępnionych plików obiektu? Kompilujesz plik .c do pliku .so, a następnie ładujesz go do programu 'dlopen()' i otrzymujesz funkcję function 'dlsym()' do funkcji. Potem możesz to nazwać. –
Zapomnijmy o libc i dynamicznym łączeniu – shodanex
Chcesz, aby stuff 'f1.bin' był ładowany dynamicznie (czyli w czasie wykonywania)? Następnie musisz zbudować wspólną bibliotekę i użyć ldopen() + ldsym() lub innego modułu ładującego (jak gmodule). Próba zrobienia tego w inny sposób może być trudna i odrzucona z powodu potencjalnych zagrożeń bezpieczeństwa (wykonanie segmentu danych i tak dalej). –