Linux 如何确定glibc(glibcxx)二进制文件的版本取决于什么?

Linux 如何确定glibc(glibcxx)二进制文件的版本取决于什么?,linux,glibc,libstdc++,Linux,Glibc,Libstdc++,众所周知,glibc(据我所知,glibstd++也使用符号版本控制机制)。(详情请参阅:) 问题是如何确定链接器将为libc和libstdc++中的名称选择GLIBC和GLIBCXX的确切版本?例如,如何获得以下内容: time -> time@GLIBC_2_5 ... gethostbyname -> gethostbyname@GLIBC_2_3 我们为什么需要这个?在我看来,如果您想最小化所需版本的glibc/libstdc++,它可能会很有用。您可以尝试的一件事是在二进

众所周知,glibc(据我所知,glibstd++也使用符号版本控制机制)。(详情请参阅:)

问题是如何确定链接器将为libc和libstdc++中的名称选择GLIBC和GLIBCXX的确切版本?例如,如何获得以下内容:

time -> time@GLIBC_2_5
...
gethostbyname -> gethostbyname@GLIBC_2_3

我们为什么需要这个?在我看来,如果您想最小化所需版本的glibc/libstdc++,它可能会很有用。

您可以尝试的一件事是在二进制文件上运行
objdump-T


如果您正在考虑链接到符号的旧版本,请注意,这些旧版本可能还依赖于旧的、不同的结构或其他定义。为了避免这种情况,请编译并链接旧的、匹配的头文件和库。

IIRC dso howto()有一节介绍了如何使用链接器脚本。谢谢,jilles。它起作用了。还有一个问题,如何获取调用动态符号的代码中的位置?我的意思是,例如,如果'objdump-T'返回一些条目,比如GLIBCXX_3.4.9 Insert_,如何理解源代码中的哪些函数使用这个符号?嗯,我真的不知道比在所有.o文件上运行objdump-T并检查哪些文件包含对函数的引用更好的解决方案。这似乎可以做得更好,因为链接器知道在哪里使用了未解析的符号。我只想补充一点,对于共享库,“objdump-T”不起作用,我使用的解决方案是“ldd-v somelibrary.so”(-v是重要的),如上所述