Как в GCC экспортировать все символы typeinfo для общей библиотеки без экспорта всех символов? - PullRequest
5 голосов
/ 09 января 2012

Вот проблема:

У меня есть общая библиотека, которая по умолчанию скрывает символы. На самом деле, он использует опцию -Xlinker --version-script =, чтобы экспортировать некоторые символы в определенный файл, но скрыть все остальные. Проблема в том, что если мы пытаемся перехватить исключения, которые были определены в других общих библиотеках, у нас возникают проблемы, потому что typeinfo скрыта этой общей библиотекой. Я не могу явно сделать классы исключений видимыми, потому что они определены в библиотеке с открытым исходным кодом, которая находится вне моего контроля. Я также не хочу явно перечислять искаженные имена для typeinfo классов исключений в файле символов сценария версии, поскольку над этой библиотекой работает много разработчиков, и они обязаны забыть сделать это для некоторого класса исключений в будущее.

Я пытался использовать #pragma GCC push visibility (по умолчанию) перед файлами с открытым исходным кодом .hpp, но это не сработало - символы не были видны.

Я также пытался использовать -fvisibility-ms-compat, который действительно экспортировал символы typeinfo, но также экспортировал тонны других символов, которые я не хотел экспортировать. В библиотеке есть как C, так и C ++ код, поэтому я не уверен, как она должна работать с этой опцией, которая предназначена только для C ++.

Что мне действительно нужно, так это опция, которая сделает все символы typeinfo видимыми, оставляя другие символы скрытыми (если они явно не видны). Есть ли такая опция?

1 Ответ

3 голосов
/ 08 февраля 2012

Самый прямой ответ на ваш вопрос - использовать опцию ld --dynamic-list-cpp-typeinfo.Мне не повезло с этим вариантом, но YMMV.

Вы не говорите, на какой платформе вы строите.Якобы вы используете mingw, поскольку вы пробовали -fvisibility-ms-compat;но в случае неявного совпадения, что вы на самом деле находитесь на цели ELF, такой как Linux, попробуйте экспортировать символы подстановки _ZTI* и _ZTN* из вашего скрипта версии.(Возможно, вы можете сделать что-то похожее в Windows, но поскольку искажение имен в Visual C ++ на самом деле не задокументировано, я не знаю ни о каких стандартных символах подстановки, которые вы можете использовать.)

...