Błąd "undefined symbol" podczas ładowania biblioteki za pomocą dlopen

Piszę kod, który używa dynamicznych bibliotek współdzielonych jako wtyczek.

Mój wiersz poleceń do budowania bibliotek współdzielonych wygląda następująco:

cc -shared -fPIC -o module.so -g -Wall module.c

Wewnątrz modułu mogę wywoływać funkcje, które znajdują się w każdej innej współdzielonej bibliotece, która została załadowana w głównym pliku wykonywalnym.

Jednakże nie mogę uzyskać dostępu do (wyeksportowanych) funkcji znajdujących się w samym pliku wykonywalnym (dostaję undefined symbol błędy).

Moje wezwanie do dlopen wygląda tak:

void *handle = dlopen(plugin, RTLD_NOW);
Czy ktoś może doradzić jak mój moduł może oddzwaniać do mojego programu wykonywalnego, bez konieczności umieszczania wszystkich funkcji użytkowych programu wykonywalnego w innej bibliotece współdzielonej?
Author: Cœur, 2009-01-26

3 answers

Poprawnym rozwiązaniem jest dodanie -rdynamic do komendy link głównego pliku wykonywalnego. Spowoduje to dodanie odpowiedniej opcji do ld (która przy użyciu GNU ld okazuje się być --export-dynamic).

Bezpośrednie dodanie --export-dynamic jest technicznie niepoprawne: jest to opcja linkera, więc powinna być dodana jako -Wl,--export-dynamic lub -Wl,-E. Jest to również mniej przenośne niż -rdynamic (Inne linkery mają odpowiedniki, ale sama opcja jest inna).

 30
Author: Employed Russian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-27 07:31:38

Sam znalazłem odpowiedź.

Musiałem dodać znaczniki --export-dynamic do opcji łącza dla głównego pliku wykonywalnego.

Podczas tworzenia dynamicznie połączonego wykonywalny, dodaj wszystkie symbole do dynamiczna tabela symboli. The dynamic tabela symboli to zbiór symboli które są widoczne z obiektów dynamicznych w czasie biegu.

Jeśli nie skorzystasz z tej opcji, dynamiczna tabela symboli będzie normalnie zawierają tylko te symbole, które są / align = "left" / jakiś dynamiczny obiekt wymienione w linku.

Jeśli używasz "dlopen" do ładowania dynamicznego obiekt, który musi odnosić się do symbole zdefiniowane przez program, zamiast jakiegoś innego dynamicznego obiektu, wtedy prawdopodobnie będziesz musiał użyć ta opcja podczas łączenia programu siebie.

 5
Author: Alnitak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-26 17:40:38

Kiedy napotkałem ten sam problem, użyłem następującego rozwiązania. Przed załadowaniem dowolnej wtyczki wystarczy załadować sam program, przenosząc jego symbole do tabel dynamicznych:

dlopen(NULL,RTLD_NOW|RTLD_GLOBAL);
Myślę, że rozwiązanie jest lepsze. Powodem jest to, że również rozwiązuje ten sam problem, Jeśli

A) twój program (lub moduł TRÓJSTRONNY) jest połączony (Nie w trybie runtime) z biblioteką współdzieloną, której symbole muszą znajdować się w dynamicznej tabeli;

B) nie można przekompilować tego modułu za pomocą-rdynamic flaga.

 4
Author: P Shved,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-16 16:10:26