Поскольку .so
является общей библиотекой, которая будет загружаться динамически, ей необходимо иметь некоторое количество символов, доступных извне.Для просмотра используйте nm -D libMeow.so
.Strip не удалит их, или это сделает библиотеку непригодной для использования.
Поскольку некоторые функции необходимо загружать извне, вы не можете просто удалить все динамические символы, потому что тогда никто не сможет взаимодействовать с.so
.Если ваша .so
является библиотекой JNI, вам нужно, чтобы функции точки входа JNI были видны извне, в то время как если это общая библиотека, с которой связывается другая .so
, вам необходимо иметь по крайней мере открытый интерфейс вашей библиотеки..
Чтобы скрыть внутренние символы, вы можете прочитать https://gcc.gnu.org/wiki/Visibility для полной истории.Грубо говоря, у вас есть следующие варианты:
- Используйте
__attribute__ ((visibility ("hidden")))
на каждом символе, который вы не хотите видеть за пределами библиотеки.(Это, вероятно, довольно много, и много работы нужно отследить каждый из них.) - Сборка с
-fvisibility=hidden
, которая неявно устанавливает это на каждом внешнем символе, и добавляет __attribute__ ((visibility ("default")))
нате, которые вам действительно нужно экспортировать (вероятно, гораздо меньше) - Используйте «скрипт версии», чтобы ограничить, какие функции экспортировать в список выбора.При связывании передайте
-Wl,-version-script -Wl,mylib.ver
.
В случае сценария версии mylib.ver
должно выглядеть следующим образом:
{ global:
PublicFunction1;
PublicFunction2;
local: *; };