На OSX (не уверен насчет других) я обнаружил следующее.
Как упомянул Максим, использование -fvisibility=hidden
или __attribute__((visibility("hidden")))
все еще помещает символ в таблицу символов, он просто помечается как неэкспортированный. Самый простой способ увидеть это с помощью nm
, например:
$ nm libfoo.dylib
...
0000000000001fa0 t __Z10a_functionv
0000000000002140 T __Z17a_public_functionv
...
Если буква после адреса строчная, это означает, что она не экспортируется. Здесь a_function()
скрыт, а a_public_function
имеет видимость по умолчанию.
Чтобы убрать неэкспортированные символы из таблицы символов, вы можете использовать strip -x
, что в соответствии с man-страницей:
-x Удалить все локальные символы (сохраняя только глобальные символы).
$ strip -x libfoo.dylib
$ nm libfoo.dylib
...
0000000000002140 T __Z17a_public_functionv
...
Я считаю (но не уверен на 100%), что использование hidden
не просто означает изменение флага, и «скрытие» символов не будет тривиальным.