2013-02-19 12 views
7

Chciałbym napisać trochę kodu C (dobrze, jeśli działa tylko na Linuksie), aby dynamicznie ładować nową bibliotekę współdzieloną, a następnie wywołać z niej metodę (do ustalenia w czasie wykonywania). Wydaje się, że jest to już możliwe, ponieważ java może dynamicznie ładować biblioteki macierzyste, a następnie wywoływać z nich metody.Jak załadować własną bibliotekę dynamicznie i wywołać metodę w nim?

Na przykład, chciałbym zrobić coś takiego:

int main() { 
    libinfo_t * lib_details = load_shared_library("libfoo.so"); 
    run_method(lib_details, "bar", 7); 
} 

byłoby wywołać metodę 'bar' z argumentem 7 (bar to metoda opracowana w libfoo.so).

szczegóły przypadek użycia:

Chciałbym skompilować plik binarny, który ładuje wszystkie biblioteki współdzielone w katalogu i biegnie jakiś sposób od siebie, w kontekście pamięci oryginalnego programu. Chciałbym móc szybko włączyć lub wyłączyć współużytkowaną bibliotekę, dodając/usuwając ją z katalogu.

Dowód koncepcji:

Wydaje się to powinno być możliwe, w oparciu o sposób java udaje się połączyć z kodem dynamicznie JNI. Możesz użyć System.load() i załadować bibliotekę do wyboru. W połączeniu z kompilacją z pamięci wydaje się, że pozwoliłoby to uruchomić dowolną funkcję z dowolnej biblioteki. http://www.java2s.com/Code/Java/JDK-6/CompilingfromMemory.htm

Czego próbowałem:

  1. Szukałem na stronie podręcznika dla „uselib”, co wydaje się użyteczne, ale nie jestem pewien, co zrobić z biblioteki raz mam załadowałem to.

  2. Trochę googlowania zwróciło http://dyncall.org/, ale nie jest to dokładnie to, czego potrzebuję - ten projekt nadal wymaga wskaźnika funkcji, aby wywołać funkcję.

Byłbym wdzięczny za wskazówkę, gdzie szukać dalej, nawet bez konkretnej odpowiedzi. Dzięki!

+0

C nie mają metod, ale funkcje. –

Odpowiedz

9

Linux ma bardzo kompletne API do tego. Jest to interfejs API dlopen(3).

Po pierwsze, należy zadzwonić dlopen z nazwy pliku, aby uzyskać dostęp do wspólnej uchwyt Biblioteka:

void* lib = dlopen("./lib.so"); 

niż uzyskać wskaźnik funkcji dla funkcji w tej bibliotece:

int (*func)() = dlsym(lib, "thing"); 

użytkowania tego wskaźnika jak chcesz.

Wreszcie, kiedy skończysz:

dlclose(lib) 

Uwaga: Pamiętaj, aby zrobić sprawdzanie błędów!

+1

Wow, dzięki za szybką odpowiedź! Brzmi dokładnie tak, jak tego szukałem. – jstrom

+1

@jstrom: Pewnie! Miło, że mogłem pomóc. Przy okazji, witamy w SO! Dobre pierwsze pytanie. Mam nadzieję, że wrócisz! Wygląda też na to, że czytasz FAQ - tak! :). – Linuxios

+2

Możesz wstawić '/' w ścieżce, np. 'Dlopen (" ./ lib.więc ");' w przeciwnym razie używana jest 'LD_LIBRARY_PATH' lub jej wbudowany odpowiednik –

Powiązane problemy