libstdc++.so.6 重定位错误
Relocation error with libstdc++.so.6
我的任务是使用 gcc 将一组闭源库从 Windows/MSVC2013 移植到 Ubuntu Linux 12.04/64。我已经编译并安装了 gcc5.2(需要 "official" C++11 支持),它还将 libstdc++ 库替换为 libstdc++.so.6.0.21。
我的图书馆使用 - 其中 - 伟大的 log4cplus 日志记录框架。这是我要移植的第一部分,我已经成功了:
- 构建 log4cplus 共享库
- 将 log4cplus 共享库部署到 /usr/local/lib 和 运行 sudo ldconfig
- 构建依赖于 log4cplus 的静态库(这基本上在 log4cplus 周围添加了一些语法糖)
- 构建测试应用程序并link它到静态库
当我使用 g++ 的 -static-libstdc++ 编译器选项编译 log4cplus 时,我的测试应用程序启动并运行良好。然而,这不是最终的解决方案(闭源)。当我省略 log4cplus makefile 中的选项时,我收到以下错误 运行ning 我的应用程序:
BasicsTests: relocation error: /usr/local/lib/liblog4cplusU.so.0: symbol _ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev, version GLIBCXX_3.4.21 not defined in file libstdc++.so.6 with link time reference
我已经使用 readelf 工具查明这个符号是否真的丢失/版本错误,但显然情况并非如此:
$ readelf -s --wide /usr/local/lib64/libstdc++.so.6 | grep _ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev
4858: 000000000010cd10 108 FUNC WEAK DEFAULT 11 _ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4.21
6042: 000000000010cd10 108 FUNC WEAK DEFAULT 11 _ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev
我的测试应用程序是一个 64 位可执行文件,所以我希望它 link 到那个库:
$ file BasicsTests
BasicsTests: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, not stripped
我不确定重定位针对的是哪个特定的 so 库(我的系统上有其他 libstdc++ 版本,但是 none 其中的版本早于 6.0.19,而且它们位于我的目录中怀疑是特定于应用程序的)。
echo $LD_LIBRARY_PATH
什么也没给我,所以除了标准之外,没有其他路径可以应用
除了我无法解释的错误之外,令我困惑的是没有(link to)libstdc++.so位于/usr/lib或/usr/local/lib,但是,该库似乎已找到(当找不到该库时,我会看到不同的错误)。
如果我问了愚蠢的问题/犯了愚蠢的错误,我深表歉意,但我是 Linux 下的开发新手,这项调查是我最近几天开始进入该领域的令人沮丧的结果。
任何帮助将不胜感激!
编辑 - Oleksandr Kravchuk 的问题
/etc/ld.so.conf.d/libc.conf 内容:
# libc default configuration
/usr/local/lib
看来问题是你 link 你的二进制文件有一个 libstdc++ 而 Linux 的动态 linker 使用另一个。这就是静态 linking 使您的程序运行的原因。
您可以通过在 /etc/ld.so.conf.d/libc.conf 和 运行 ldconfig afterwords.[=10= 中注释掉不必要的库副本来修复它]
我的任务是使用 gcc 将一组闭源库从 Windows/MSVC2013 移植到 Ubuntu Linux 12.04/64。我已经编译并安装了 gcc5.2(需要 "official" C++11 支持),它还将 libstdc++ 库替换为 libstdc++.so.6.0.21。
我的图书馆使用 - 其中 - 伟大的 log4cplus 日志记录框架。这是我要移植的第一部分,我已经成功了:
- 构建 log4cplus 共享库
- 将 log4cplus 共享库部署到 /usr/local/lib 和 运行 sudo ldconfig
- 构建依赖于 log4cplus 的静态库(这基本上在 log4cplus 周围添加了一些语法糖)
- 构建测试应用程序并link它到静态库
当我使用 g++ 的 -static-libstdc++ 编译器选项编译 log4cplus 时,我的测试应用程序启动并运行良好。然而,这不是最终的解决方案(闭源)。当我省略 log4cplus makefile 中的选项时,我收到以下错误 运行ning 我的应用程序:
BasicsTests: relocation error: /usr/local/lib/liblog4cplusU.so.0: symbol _ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev, version GLIBCXX_3.4.21 not defined in file libstdc++.so.6 with link time reference
我已经使用 readelf 工具查明这个符号是否真的丢失/版本错误,但显然情况并非如此:
$ readelf -s --wide /usr/local/lib64/libstdc++.so.6 | grep _ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev
4858: 000000000010cd10 108 FUNC WEAK DEFAULT 11 _ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev@@GLIBCXX_3.4.21
6042: 000000000010cd10 108 FUNC WEAK DEFAULT 11 _ZNSt7__cxx1119basic_ostringstreamIwSt11char_traitsIwESaIwEED1Ev
我的测试应用程序是一个 64 位可执行文件,所以我希望它 link 到那个库:
$ file BasicsTests
BasicsTests: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, not stripped
我不确定重定位针对的是哪个特定的 so 库(我的系统上有其他 libstdc++ 版本,但是 none 其中的版本早于 6.0.19,而且它们位于我的目录中怀疑是特定于应用程序的)。
echo $LD_LIBRARY_PATH
什么也没给我,所以除了标准之外,没有其他路径可以应用
除了我无法解释的错误之外,令我困惑的是没有(link to)libstdc++.so位于/usr/lib或/usr/local/lib,但是,该库似乎已找到(当找不到该库时,我会看到不同的错误)。
如果我问了愚蠢的问题/犯了愚蠢的错误,我深表歉意,但我是 Linux 下的开发新手,这项调查是我最近几天开始进入该领域的令人沮丧的结果。
任何帮助将不胜感激!
编辑 - Oleksandr Kravchuk 的问题
/etc/ld.so.conf.d/libc.conf 内容:
# libc default configuration
/usr/local/lib
看来问题是你 link 你的二进制文件有一个 libstdc++ 而 Linux 的动态 linker 使用另一个。这就是静态 linking 使您的程序运行的原因。
您可以通过在 /etc/ld.so.conf.d/libc.conf 和 运行 ldconfig afterwords.[=10= 中注释掉不必要的库副本来修复它]