Скрытие символов статической библиотеки в динамической библиотеке в MAC OS X? - PullRequest
8 голосов
/ 18 июля 2011

Я использую статическую библиотеку (например, boost.a) и некоторые файлы * .o для создания динамической библиотеки (например, libdynamic.dylib) в MAC OS X.

Я могу скрыть символы из файлов * .o, так как я создал их с помощью -fvisibility = hidden flag. Но я не могу скрыть символы из библиотеки boost.a, так как они уже скомпилированы.

Есть ли способ скрыть символы (функции) статической библиотеки в динамической библиотеке?
т.е. если у меня есть функция (скрытая) в файле myfuncs.o, которая вызывает функции (видимые) в файле boost.a, функции boost.a будут видны, когда я использую «инструмент nm».

Пожалуйста, предложите мне решение.

1 Ответ

5 голосов
/ 17 октября 2011

Сначала необходимо убедиться, что вы объявляете все символы, которые хотите сохранить, как внешние "C" атрибут ((видимость ("по умолчанию"))) и отмечаете "символы, скрытые по умолчанию" ввкладка генерации кода вашего проекта XCode (я думаю, что это проверено по умолчанию).

Затем вам нужно создать файл экспортированных символов, который содержит все символы, которые вы хотите экспортировать (сохранить).

Вам нужно указать Xcode на этот файл, добавив «symbols.exp» в качестве записи «файла экспортированных символов» в настройках компоновщика проекта Xcode.

Убедитесь, что символы в этом файленачать с подчеркивания.Вы можете создать экспортированный файл символов из вашей статической библиотеки (или необработанного dylib), используя скрипт сборки:

nm -g $BUILT_PRODUCTS_DIR/lib$PRODUCT_NAME.dylib | ruby -ne 'if /^[0-9a-f]+.*\s(\S+)$/.match($_) then print $1,"\n" end' > symbols.exp

Вы также можете сделать это из командной строки (замените $ BUILT_PRODUCTS_DIR / lib $ PRODUCT_NAME.dylibв данном случае именем вашей библиотеки).

Это создаст файл экспортированных символов "symbols.exp" в каталоге вашего проекта.Затем вы можете использовать этот файл символов, чтобы убрать все несущественные символы из вашего dylib, например:

strip -u -r -s symbols.exp libXYZ.dylib 

Возможно, было бы неплохо также поместить это в конец сценария выполнения в вашем проекте., например, так:

strip -u -r -s symbols.exp $BUILT_PRODUCTS_DIR/lib$PRODUCT_NAME.dylib 

Если вы используете этот скрипт в своем проекте dylib, убедитесь, что вы также добавили в файл symbol.exp и отключили его (установите флажок рядом с его именем), поэтомуXCode может найти файл.


В XCode 5 команда strip будет выдавать жалобу, как показано ниже, хотя команда, кажется, работает правильно:

/ Applications / Xcode.app/Contents/Developer/Toolchains/OSX10.9.xctoolchain/usr/bin/strip: удаление глобальных символов из окончательной ссылки больше не поддерживается.Используйте -exported_symbols_list во время компоновки при сборке: /path/to/libYourlib.dylib

В качестве состояния предупреждения, используя опцию -exported_symbols_list (или настройку Xcode Exported Symbols File), вы можете точно контролироватькакие символы будут экспортированы, исключив что-либо, отсутствующее в указанном вами файле.

...