libstdc++.so.6的重新定位错误

Relocation error with libstdc++.so.6

本文关键字:定位 错误 新定位 so libstdc++      更新时间:2023-10-16

我的任务是用gcc将一组封闭源代码库从Windows/MSVC2013移植到Ubuntu Linux 12.04/64。我已经编译并安装了gcc5.2("官方"C++11支持所需),它还用libstdc++.so.6.0.21替换了libstdc++库。

我的库使用了很棒的log4cplus日志框架。这是我想移植的第一部分,我已经成功地移植了:

  • 构建log4cplus共享库
  • 将log4cplus共享库部署到/usr/local/lib并运行sudo ldconfig
  • 构建依赖于log4cplus的静态库(这基本上为log4cplus添加了一些语法糖)
  • 构建测试应用程序并将其链接到静态库

当我为g++使用-static libstdc++编译器选项来编译log4cplus时,我的测试应用程序启动并运行良好。然而,这并不是最终解决方案(闭源)。当我省略log4cplus makefile中的选项时,运行我的应用程序时会出现以下错误:

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位的可执行文件,所以我希望它能链接到那个库:

$ 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++版本,但没有一个版本早于6.0.19,而且它们位于我怀疑是特定于应用程序的目录中)。

echo $LD_LIBRARY_PATH 

只是没有给我任何东西,所以除了标准之外,没有其他路径应该应用

除了我无法解释的错误之外,让我困惑的是,在/usr/lib或/usr/local/lib中没有(指向)libstdc++.so的链接,但是,似乎找到了库(当找不到库时,我会看到不同的错误)。

如果我问了愚蠢的问题/犯了愚蠢的错误,我很抱歉,但我是Linux下开发的新手,这次调查是我在过去几天里令人沮丧地进入该领域的结果。

任何帮助都将不胜感激!

编辑-Oleksandr Kravchuk 提问

/etc/ld.so.conf.d/libc.conf内容:

# libc default configuration
/usr/local/lib

问题似乎是您将二进制文件与一个libstdc++链接,而Linux的动态链接器使用另一个。这就是为什么静态链接可以使程序正常工作。

您可以通过在/etc/ld.so.conf.d/libc.conf中注释掉不必要的库副本并运行ldconfig afterwords来修复它。