【问题标题】:Which version of libstdc++.so.6 to use?使用哪个版本的 libstdc++.so.6?
【发布时间】:2015-12-04 17:36:46
【问题描述】:

我在 Solaris 上使用第三方共享库 (libsw_api.so),当我尝试加载时,会产生以下错误:

fatal: relocation error: file libsw_api.so:
symbol _ZNKSt9bad_alloc4whatEv: referenced symbol not found
The program exited with error code 1

当我在 libsw_api.so 上运行 ldd 时,所有引用似乎都已完成,特别是指向 libstdc++.so.6.0.3 的 C++ 标准库:

glispa02(fostopr)$ ldd libsw_api.so
...
libstdc++.so.6 =>        /usr/sfw/lib/libstdc++.so.6
...
glispa02(fostopr)$ ls -l /usr/sfw/lib/libstdc++.so.6
lrwxrwxrwx   1 root     root          18 Jun 21  2010 /usr/sfw/lib/libstdc++.so.6 -> libstdc++.so.6.0.3

但是该库不导出 _ZNKSt9bad_alloc4whatEv,

glispa02(fostopr)$ nm /usr/sfw/lib/libstdc++.so.6 | grep bad_alloc                          
[7592]  |    752340|      64|FUNC |GLOB |0    |2653   |_ZNSt9bad_allocD0Ev
[7324]  |    752284|      56|FUNC |GLOB |0    |2652   |_ZNSt9bad_allocD1Ev
[8077]  |    752228|      56|FUNC |GLOB |0    |2651   |_ZNSt9bad_allocD2Ev
[7519]  |    356736|      76|FUNC |GLOB |0    |473    |_ZSt17__throw_bad_allocv
[7341]  |    983588|      12|OBJT |WEAK |0    |3842   |_ZTISt9bad_alloc
[6569]  |    777008|      13|OBJT |WEAK |0    |3317   |_ZTSSt9bad_alloc
[7299]  |    983568|      20|OBJT |WEAK |0    |3841   |_ZTVSt9bad_alloc

可能是什么问题?版本不对?我不太擅长 Unix 上的 C++,所以我很感激任何帮助。

这种 SPARC32PLUS 与 SPARC 不匹配是否会导致问题?

glispa02(fostopr)$ file libsw_api.so        
libsw_api.so:   ELF 32-bit MSB dynamic lib SPARC32PLUS Version 1, V8+ Required,    dynamically linked, not stripped
glispa02(fostopr)$ file /usr/sfw/lib/libstdc++.so.6.0.3 
/usr/sfw/lib/libstdc++.so.6.0.3:        ELF 32-bit MSB dynamic lib SPARC Version 1, dynamically linked, not stripped, no debugging information available

我的系统:

glispa02(fostopr)$ cat /etc/release                    
                  Solaris 10 10/09 s10s_u8wos_08a SPARC
       Copyright 2009 Sun Microsystems, Inc.  All Rights Reserved.
                    Use is subject to license terms.
                       Assembled 16 September 2009
glispa02(fostopr)$ uname -a
SunOS glispa02 5.10 Generic_141444-09 sun4u sparc SUNW,SPARC-Enterprise

【问题讨论】:

  • 我想知道一个 libstdc++ 是否有 bad_alloc::what 从标头内联,而 libsw_api 已针对不同的 libstdc++ 编译。
  • 也许使用不同的优化设置,OP 的源代码将编译为 what() 内联?只是一个疯狂的猜测......

标签: c++ solaris libstdc++


【解决方案1】:

您好,我也在升级这些文件,我注意到我应该使用发行版附带的 libstdc++.so.6.0.9 文件,而不是 /usr/sfw/lib/ 中的文件

【讨论】:

    【解决方案2】:

    如果你在libstdc++.so.6文件上使用pvs,它会给你一堆匹配的条目:GLIBCXX,如果你没有匹配GLIBCXX_3.4.9的条目,那么符号bad_alloc::what不在该库即该库比依赖对象 libsw_api.so

    如果是这种情况,那么您可能需要更新版本的 libstdc++ - 它会附带更新版本的 g++

    【讨论】:

    • pvs 输出:libgcc_s.so.1 (GCC_3.3);libc.so.1 (SUNW_1.22, SUNWprivate_1.1);。我会尝试升级g++,谢谢!
    • 我想我现在更好地理解了您的评论,您想知道libstdc++.so.6 提供哪些接口,而不是它所依赖的,对吧?当我做pvs -d /usr/sfw/lib/libstdc++.so.6 时,我根本没有输出。为什么?
    【解决方案3】:

    我遇到了同样的问题。

    原因是我们导出了错误的 LD_LIBRARY_PATH 这样我们的共享库链接到原始 gcc 的库 (3.3) 而不是我们的编译器 (gcc 4.4)。

    修复链接器问题应该可以解决问题

    【讨论】:

      猜你喜欢
      • 2017-11-30
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多