GCC правильная видимость для общего объекта, написанного на C ++ - PullRequest
2 голосов
/ 29 сентября 2011

У меня огромный проект, написанный на C ++.Все это разбито на несколько статических библиотек, которые в конечном итоге объединяются в одну итоговую разделяемую библиотеку, которая должна экспортировать только несколько простых функций.

Если я выполняю objdump этого финального файла, поэтому я вижу все свои внутренние имена и т.д.он использует длинные имена классов и пространства имен, эти строки становятся чрезмерно длинными, и в результате конечный двоичный файл становится большим.

Итак, мой вопрос: как мне сделать это правильно с GCC, чтобы убедиться, что все эти внутренние функции непоказать в окончательном бинарном файле?

Мне известны все эти специфичные для GCC модификаторы видимости, я использую -fvisibility = hidden -fvisibility-inlines-hidden, я использую -Wl, - no-whole-архив.Я отключаю исключения c ++ и rtti (-fno-exceptions -fno-rtti), но я все еще не могу заставить GCC сгенерировать мой окончательный .so, который не содержит имен моих пространств имен и классов, которых не должно быть ввсе!

Я пытался использовать -Wl, - version-script = для управления тем, какие функции должны быть видны, но все же я вижу множество внутренних имен в окончательно очищенном разделяемом объекте.Я читаю несколько похожих записей на SO, но не вижу ничего, что делает эту работу.Примечание: я компилирую для нескольких платформ (Linux, Windows, iPhone и т. Д.), И только на Windows в VS у меня нет проблем.

спасибо

1 Ответ

4 голосов
/ 29 сентября 2011

Возможно, вы захотите использовать опцию компоновщика --retain-symbols-file при компоновке окончательного файла .so (-Wl,--retain-symbols-file=filename), чтобы указать ПРОСТО символы, которые вы хотите сохранить (экспортировать), и удалить все остальное.Файл представляет собой просто текстовый файл с символами (по одному в строке) для хранения.

...