Ответ 1
Вполне возможно, что если ваш символ не экспортируется из вашей общей библиотеки, он окажется в normal symbol table
вместо dynamic symbol table
.
В файлах ELF существует много типов символов.
-
обозначает часть
normal symbol table
. Это результат простогоnm libabc.so
илиobjdump --syms libabc.so
. Эти символы используются только при статической привязке. -
обозначает часть
dynamic symbol table
. Это результат отnm --dynamic libabc.so
илиobjdump --dynamic-syms libabc.so
. Таблица динамических символов - это та, которая используется компоновщиком/загрузчиком времени выполнения, который связывает символы между ELF файлом, который ссылается на них, и файл ELF, который их определяет. Он также используетсяstatic linker
при связывании разделяемой библиотеки с приложением, которое ее требует. Это компонент, который помогает показывать всеundefined symbol errors
во время компоновки. -
Hidden symbols
- это символы, отмеченные с помощью_attribute_ ((visibility("hidden")))
. Эти символы не экспортируются за пределы и могут использоваться только в библиотеке. Видимость проверяется на этапе связывания и, следовательно, применяется только для разделяемых библиотек. Видимость по умолчаниюpublic
, то есть символы экспортируются, если не указано иное. Поведение может быть изменено с помощью-fvisibility=default|internal|hidden|protected
.
Установите видимость символа изображения ELF по умолчанию для указанного option - все символы будут отмечены этим, если не переопределены внутри код. Использование этой функции может существенно улучшить связь и времени загрузки библиотек общих объектов, обеспечивают более оптимизированный кода, обеспечивают почти идеальный экспорт API и предотвращают конфликты символов. Это настоятельно рекомендуется использовать это в любых общих объектах, которые вы распространять. Несмотря на номенклатуру, дефолт всегда означает публичный, т.е. доступный для связи с внешним объектом. защищенные и внутренние - бесполезны в реальном использовании, поэтому только другие обычно используемые опции будут скрыты. Значение по умолчанию if -fvisibility не указывается по умолчанию, т.е. делает каждый символ общедоступным - это вызывает то же поведение, что и предыдущие версии GCC.
Обзор этих методов, их преимуществ и способов их использования на http://gcc.gnu.org/wiki/Visibility.
Чтобы ответить на вопрос, когда вы используете опцию --dynamic
nm
, вам нужно будет отобразить все символы, экспортированные вашей общей библиотекой, и единственные, которые доступны для изображений ELF, которые ссылайтесь на них.