Подтвердить что ты не робот

Когда использовать - динамическую опцию в нм

Иногда, когда я делаю nm в файле .so(например, libstdС++. so.6), он не говорит о символах, и мне нужно использовать nm --dynamic. Но для некоторых других .so файлов я могу видеть символы без --dynamic.

Док говорит:

Отображение динамических символов, а не обычных символов. Это имеет смысл только для динамических объектов, таких как определенные типы разделяемых библиотек.

Но это сбивает с толку... что "типам" разделяемых библиотек нужно --dynamic? Как это определяется? Во время компиляции библиотеки? Я думал, что все разделяемые библиотеки являются динамическими (я имею в виду, их можно динамически загружать во время выполнения), но кажется, что мое понимание не совсем правильно.

4b9b3361

Ответ 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, которые ссылайтесь на них.