Как работает привязка символов для разделяемых библиотек в linux - PullRequest
3 голосов
/ 24 февраля 2010

При компиляции программы cpp с g ++ -O0 я заметил, что мой двоичный файл не содержит символ для пустой строки (basic_string): _S_empty_rep_storage Когда я компилирую эту же программу с -O2, я замечаю, что вышеупомянутый символ действительно содержится в двоичном файле следующим образом (с использованием nm в мусорном ведре):

00000000006029a0 V _ZNSs4_Rep20_S_empty_rep_storageE @@ GLIBCXX_3.4

Мое приложение использует несколько .so (динамических библиотек), и при загрузке приложения я замечаю, что некоторые из этих .so файлов связываются следующим образом (я установил LD_DEBUG = all и запустил свою программу):

 28596: binding file /home/bbazso/usr/local/lib/mydynamiclib.so [0] to /usr/lib64/libstdc++.so.6 [0]: normal symbol `_ZNSs4_Rep20_S_empty_rep_storageE' [GLIBCXX_3.4]
 28596: binding file /home/bbazso/usr/local/lib/mydynamiclib.so [0] to /home/bbazso/workspace/mytestapplication [0]: normal symbol `_ZNSs4_Rep20_S_empty_rep_storageE' [GLIBCXX_3.4]
 28596: binding file /home/bbazso/workspace/mytestapplication [0] to /usr/lib64/libstdc++.so.6 [0]: normal symbol `_ZNSs4_Rep20_S_empty_rep_storageE' [GLIBCXX_3.4]**

Но я также заметил, что один из моих .so связывается только следующим образом:

  28087:    binding file /home/bbazso/usr/local/lib/anotherdynamiclib.so [0] to /usr/lib64/libstdc++.so.6 [0]: normal symbol `_ZNSs4_Rep20_S_empty_rep_storageE' [GLIBCXX_3.4]

, но никогда не связывается с двоичным файлом (mytestapplication), как показано выше для mydynamiclib.so.

Так что мне было интересно, что это на самом деле означает? Означает ли это, что anotherdynamiclib.so будет использовать другой символ для пустой строки выше, чем остальная часть приложения? Я думаю, что я действительно спрашиваю, как работает привязка символов в контексте примера выше?

Спасибо!

Ответы [ 2 ]

1 голос
/ 28 февраля 2010

Боюсь, я не до конца понимаю ваш вопрос, но вы можете найти ответ в статье Ульриха Дреппера под названием Как писать общие библиотеки . Это лучшее, что я знаю относительно символов с исполняемыми файлами elf в Linux.

0 голосов
/ 26 декабря 2010

Мне трудно разобрать ваш вопрос. Если вы включили небольшой фрагмент примера кода, который вы компилируете, это может помочь.

Я заметил, что вышеупомянутый символ действительно содержится в двоичном виде следующим образом Это зависит от того, что вы подразумеваете под «содержится в». В таблице символов есть запись для этого символа, но это внешний символ, а не символ, который ваше приложение «экспортирует». Обратите внимание на @@ GLIBCXX_3.4 в названии. Фактическое местоположение символа находится в GLIBCXX (который выглядит так, как будто он фактически разрешается в libstdc ++).

Исходя из вашего вывода, nm не отображает информацию ST_BIND (часть поля st_info в структурах El32_Sym / Elf64_Sym) Это информация, которая определяет, как компоновщик обрабатывает привязку символа. Ты можешь бежать readelf -s ВАШЕ ИМЯ Это покажет привязки.

...