Segfault na C ++ Plugin Library z Duplicate Symbols

Mam wieloplatformową aplikację C ++, która jest podzielona na kilka współdzielonych bibliotek i ładuje dodatkowe funkcje z bibliotek współdzielonych wtyczek. Biblioteki wtyczek powinny być samodzielne i funkcjonować samodzielnie, bez znajomości lub zależności od aplikacji wywołującej.

Jedna z wtyczek zawiera skopiowany kod z głównej aplikacji, więc zawiera nazwy symboli, które są duplikowane do tych w silniku. (Tak, wiem, że generalnie jest to nie-nie, ale w momencie pisania wtyczki silnik był monolitycznym programem binarnym i nie mógł udostępniać bibliotek.) W systemie Windows wszystko działa dobrze. W Linuksie dochodziło do segregacji. Patrząc na ślad stosu błędu, występował on w wtyczce podczas wywoływania funkcji w zduplikowanej nazwie klasy. Wyglądało na to, że silnik i wtyczka mają nieco inne wersje współdzielonego kodu (niektóre funkcje klasy zostały skomentowane w wtyczce). Wyglądało to tak, jakby wtyczka otrzymywała symbole uruchomieniowe powiązane z silnikiem, a nie z własnym. „Naprawiliśmy” problem, zmieniającdlopenparametry mają byćdlopen(pFilepath, RTLD_LAZY | RTLD_LOCAL).

Ale kiedy przepisaliśmy silnik, aby podzielić go na biblioteki współdzielone (w celu ewentualnego ponownego użycia w wtyczkach), ponownie otrzymujemy błąd segfault. I patrząc na ślad stosu, idzie od silnika -> wtyczka -> silnik.

Czy istnieje sposób na określenie, aby linker wykonawczy nie mapował symboli wtyczki do silnika (zwłaszcza jeśli są zdefiniowane w wtyczce)?

Dzięki! Matt

Edytowane 2009-12-3

Po raz pierwszy próbowałem zawinąć kod wtyczki w jego własną przestrzeń nazw. To nie zadziałało, ponieważ jest statycznie połączone z biblioteką, która jest również połączona z silnikiem. Wersje biblioteki statycznej są różne, więc segfault!

Następnie zmieniłem konstrukcję silnika i jego biblioteki zostały połączone statycznie. A kiedy go uruchomię, nie mam już problemu. Wygląda więc na to, że eksportowane symbole współdzielonej biblioteki były dynamicznie przenoszone do wtyczki po jej otwarciu. Ale gdy cały kod silnika znajduje się w pojedynczym pliku wykonywalnym, nie eksportuje on swoich symboli (więc nie próbuje przenieść symboli wtyczki do silnika).

Nadal jednak mam problem, ponieważ istnieje równoległa wersja programu (przy użyciu Open-MPI), która nadal pobiera błąd segfault. Wygląda na to, że nadal eksportuje symbole silnika i przenosi wtyczki. Może to mieć związek z tym, jak Open-MPI wykonuje aplikację.

Czy są jakieś flagi łączników, które mogłyby zostać użyte w bibliotece współużytkowanej wtyczki, która kazałaby jej nie dynamicznie przenosić symboli w czasie wykonywania? Lub ukryć jego symbole, aby nie zostały przeniesione? próbowałem-s („Pomiń wszystkie informacje o symbolu”), ale najwyraźniej nie zmieniło to dynamicznych symboli (zaznaczone przy użyciunm -D <plugin>).

questionAnswers(3)

yourAnswerToTheQuestion