2

在 Linux 上,我在同一台机器上构建了两个二进制文件 A 和 B。我将它们带到另一台安装了稍旧的 libstdc++ 的机器上。当我在二进制 AI 上运行 ldd -v 时,得到:

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

当我在二进制 BI 上运行 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?更重要的是,我如何确定是什么代码导致了这种依赖关系?

4

1 回答 1

2

如果你nm在你的可执行文件上运行,你会看到大量的符号,其中一些是未定义的(你可以告诉它们,因为它们在第一列是空白的,并且在's 默认输出U的第二列中有一个。)nm

其中一些符号上会有@@whatever后缀。这些后缀是这些符号的版本依赖关系,如果您@@GLIBCXX_3.4.15在二进制 B 中查找,应该会告诉您哪些特定符号导致您具有该版本依赖关系。

于 2012-02-29T01:15:36.317 回答