При компиляции программы 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 будет использовать другой символ для пустой строки выше, чем остальная часть приложения? Я думаю, что я действительно спрашиваю, как работает привязка символов в контексте примера выше?
Спасибо!