在Linux上,我在同一台机器上构建了两个二进制文件A和B.我将它们带到另一台安装了稍微旧的libstdc ++的机器上。当我在二进制A上运行ldd -v时,我得到了这个:
libstdc++.so.6 (CXXABI_1.3) => /usr/lib64/libstdc++.so.6
libstdc++.so.6 (GLIBCXX_3.4) => /usr/lib64/libstdc++.so.6
当我在二进制B上运行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?更重要的是,如何确定导致此依赖性的代码?
答案 0 :(得分:2)
如果你在可执行文件上运行nm
,你会看到大量的符号,其中一些是未定义的(你可以告诉它们,因为它们在第一列中是空白的并且有一个{{1}在U
的默认输出的第二列中。)
其中一些符号会有nm
个后缀。这些后缀是这些符号的版本依赖性,如果您在二进制B中查找@@whatever
,那么应该告诉您哪些特定符号导致您具有该版本依赖性。