概述
其实很简单,让我们反着来推一下。
我们先看看一短源代码是如果编译的,
#include <iostream>
int main()
{
std::cout << "hello" << std::endl; return 0;
}
编译:
%g++ hello.cc -o hello.out
使用ldd查看它依赖的C++库:
%ldd hello.out
libstdc++.so.5 => /usr/lib/libstdc++.so.5 (0x00764000)
libm.so.6 => /lib/tls/libm.so.6 (0x004a8000)
libgcc_s.so.1 => /mnt/hd/bld/gcc/gcc/libgcc_s.so.1 (0x40016000)
libc.so.6 => /lib/tls/libc.so.6 (0x0036d000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00355000)
使用nm可以看到这个程序是和那个版本的C++绑定到一起的( the executable is versioned),是和GLIBCXX_3.4 绑定的,它对应的gcc版本号是GCC 3.4.0
%nm hello.out
U _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4
和GCC一样,下面是我的一个程序的readelf输出,这个程序是和ABI_1.3绑定的,ABI_1.3对应的GCC版本可以在下面的链接中找到。
readelf -a xxx | grep CXX
20: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __cxa_end_catch@CXXABI_1.3 (2)
https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html
Use readelf -a and objdump -x to inspect ELF files in preference to
strings.Actually, all the GLIBCXX_* versions don’t apply to the entire
library, but to each symbol (symbol versioning, see DSO-howto). So you
can have e.g: std::char_traits::eq@@GLIBCXX_3.4.5 and
std::ios_base::Init::~Init()@@GLIBCXX_3.4 on the same library file.The fact that your program needs GLIBCXX_3.4.9 probably means that it
has been linked against a symbol that has been introduced/has changed
semantics on GLIBCXX_3.4.9.
https://stackoverflow.com/questions/4133674/glibcxx-versions
最后
以上就是昏睡哑铃为你收集整理的怎样知道你的应用程序依赖于那个版本的GCC和那个版本的ABI的全部内容,希望文章能够帮你解决怎样知道你的应用程序依赖于那个版本的GCC和那个版本的ABI所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复