2012-01-09 20 views
5

Tutaj jest problem:W GCC, jak mogę wyeksportować wszystkie symbole typeinfo dla biblioteki współużytkowanej bez eksportowania wszystkich symboli?

Mam wspólną bibliotekę, która domyślnie ukrywa symbole. W rzeczywistości używa opcji -Xlinker --version-script = do eksportowania niektórych symboli w określonym pliku, ale ukrywa całą resztę. Problem polega na tym, że jeśli spróbujemy wychwycić wyjątki zdefiniowane w innych bibliotekach współdzielonych, pojawią się problemy, ponieważ typinfo jest ukryte w tej bibliotece współdzielonej. Nie mogę jawnie uczynić klas wyjątków widocznymi, ponieważ są one zdefiniowane w bibliotece open source, która jest poza moją kontrolą. Nie chcę również jawnie wymieniać zniekształconych nazw dla informacji o klasach wyjątków w pliku symbolu skryptu wersji, ponieważ jest wielu programistów pracujących nad tą biblioteką i są oni zobowiązani zapomnieć o tym dla pewnej klasy wyjątków w przyszłość.

Próbowałem użyć push widoczności #pragma GCC (domyślnie) przed otwartymi plikami .hpp, ale nie działało - symbole nie były widoczne.

Próbowałem również użyć -fvisibility-ms-compat, która wyeksportowała symbole typeinfo, ale także wyeksportowała tony innych symboli, których nie chcę eksportować. Biblioteka zawiera zarówno kod C jak i C++, więc nie jestem pewien, jak ma działać z tą opcją, która dotyczy tylko C++.

To, czego naprawdę potrzebuję, to opcja, która uczyni wszystkie symbole typeinfo widocznymi, pozostawiając inne symbole ukryte (chyba że są wyraźnie widoczne). Czy istnieje taka opcja?

+0

Być może dynamicznie generuj skrypt linkera, przetwarzając wynik nm' czy coś w tym stylu? Tylko zgadnij. –

+0

To może być dobra droga. Myślałem o tym i chociaż nie podoba mi się dodatkowa praca skryptowa, mogłaby to być najlepsza odpowiedź. Dzięki za Twoją sugestię! –

Odpowiedz

2

Najbardziej bezpośrednią odpowiedzią na twoje pytanie jest wypróbowanie opcji ld --dynamic-list-cpp-typeinfo. Nie miałem szczęścia z tą opcją, ale YMMV.

Nie mówisz, na której platformie budujesz. Rzekomo używasz mingw, ponieważ próbujesz -fvisibility-ms-compat; ale w sytuacji, gdy jesteś na celie ELF jak Linux, spróbuj wyeksportować symbole wieloznaczne _ZTI* i _ZTN* ze swojego skryptu wersji. (Prawdopodobnie możesz zrobić coś podobnego w systemie Windows, ale o ile nie udokumentowane jest wymyślanie nazwy Visual C++, nie jestem świadomy jakichkolwiek symboli w puszkach, których możesz użyć.)