Как определяются зависимости libstdc ++? - PullRequest
2 голосов
/ 29 февраля 2012

В Linux я построил два бинарных файла, A и B, на одной машине.Я переношу их на другую машину с чуть более старой установленной libstdc ++.Когда я запускаю ldd -v в двоичном ИИ, получим следующее:

libstdc++.so.6 (CXXABI_1.3) => /usr/lib64/libstdc++.so.6
libstdc++.so.6 (GLIBCXX_3.4) => /usr/lib64/libstdc++.so.6

Когда я запусту ldd -v в двоичном БИ, получим следующее:

libstdc++.so.6 (CXXABI_1.3) => /usr/lib64/libstdc++.so.6
libstdc++.so.6 (GLIBCXX_3.4.15) => not found
libstdc++.so.6 (GLIBCXX_3.4) => /usr/lib64/libstdc++.so.6

Обратите внимание на зависимость для GLIBCXX_3.4.15:не найдено.Это имеет смысл, потому что установленный libstdc ++ имеет поддержку только до GLIBCXX_3.4.10.

Вопрос в следующем: каким механизмом ldd определяет, что двоичный файл B зависит от GLIBCXX_3.4.15?Что еще более важно, как мне определить, какой код вызывает эту зависимость?

1 Ответ

2 голосов
/ 29 февраля 2012

Если вы запустите nm на своих исполняемых файлах, вы увидите большое количество символов, некоторые из которых не определены (вы можете сказать это, поскольку они пустые в первом столбце и имеют U во второмстолбец вывода nm по умолчанию.)

Некоторые из этих символов будут иметь суффиксы @@whatever.Эти суффиксы являются зависимостями версий этих символов, и если вы ищите @@GLIBCXX_3.4.15 в вашем двоичном B, это должно сказать вам, какие конкретные символы вызывают у вас эту версию зависимости.

...