【问题标题】:Exception across shared libraries issue on AIX 5.3AIX 5.3 上的共享库问题异常
【发布时间】:2011-11-20 08:17:04
【问题描述】:

我正在为 AIX 移植一个相当稳定的代码,该代码已经在 Windows、Linux(32 位和 64 位)以及 Solaris SPARC 和 x86 中运行。代码跨共享库抛出异常:

环境:IBM AIX 5.3 64 位 编译器:GCC 4.6.1

注意:问题发生在以 32 位或 64 位编译的代码

架构有点复杂,但基本上我们有: CoreModules.a:静态库,包含共享库使用的所有核心函数、对象和结构。异常类在此处定义,异常由此处定义的类引发。使用$(AR) 生成。

libConfig.so:包含配置信息的共享库。链接到CoreModules.a。此处定义的类会引发异常。

libHostServices.so:包含业务规则的共享库。链接到 CoreModules.alibConfig.so。此处定义的类会引发异常。

这是我的编译和链接选项:

export CXX=g++
export MODE=debug
if [ "$OBJECT_MODE" -eq 64 ]
then 
    export CXXFLAGS="-g -v -W -Wall -fPIC -O2 -mminimal-toc -fpermissive -fexceptions -Wmissing-field-initializers -Wwrite-strings -Wformat -maix64"
else 
    export CXXFLAGS="-g -v -W -Wall -fPIC -O2 -mminimal-toc -fpermissive -fexceptions -Wmissing-field-initializers -Wwrite-strings -Wformat"
export LDFLAGS=-Wl,-G -Wl,-bexpall
export AR=ar -q -X32_64

下面的例子是用OBJECT_MODE=64生成的

我的 GCC 生成选项是

使用内置规范。 COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/opt/freeware/libexec/gcc/powerpc-ibm-aix5.3.0.0/4.6.1/lto-wrapper 目标:powerpc-ibm-aix5.3.0.0 配置为:../gcc-4.6.1/configure --with-as=/usr/bin/as --with-ld=/usr/bin/ld --enable-languages=c,c++,fortran -- prefix=/opt/freeware --mandir=/opt/freeware/man --infodir=/opt/freeware/info --enable-threads --enable-version-specific-runtime-libs --disable-nls --enable -decimal-float=dpd --host=powerpc-ibm-aix5.3.0.0 螺纹型号:aix gcc 版本 4.6.1 (GCC) COLLECT_GCC_OPTIONS='-g' '-v' '-Wextra' '-Wall' '-fPIC' '-O2' '-mmminimal-toc' '-fpermissive' '-fexceptions' '-Wmissing-field-initializers' '- Wwrite-strings' '-Wformat' '-maix64' '-c' '-I' '.' '-I' '../../../src/HostServices' '-I' '../../../src/InterfaceCTest' '-D' '_LOG' '-D' '_LOGSTDOUT' '-D' '_DEBUG' '-shared-libgcc' /opt/freeware/libexec/gcc/powerpc-ibm-aix5.3.0.0/4.6.1/cc1plus -quiet -v -I 。 -I ../../../src/HostServices -I ../../../src/InterfaceCTest -imultilib ppc64 -D_ALL_SOURCE -D__64BIT__ -D _LOG -D _LOGSTDOUT -D _DEBUG ../../ ../src/InterfaceCTest/InterfaceCTest.c -quiet -dumpbase InterfaceCTest.c -mmminimal-toc -maix64 -auxbase InterfaceCTest -g -O2 -Wextra -Wall -Wmissing-field-initializers -Wwrite-strings -Wformat -version -fPIC -fpermissive -fexceptions -o /u01/ceibo/desen/tmp/ccQYtChL.s

我所有的模块都链接到共享 gcc(因为它们必须在共享库中抛出异常):


libConfig.so needs:
         /opt/freeware/lib/gcc/powerpc-ibm-aix5.3.0.0/4.6.1/ppc64/libstdc++.a(libstdc++.so.6)
         /opt/freeware/lib/gcc/powerpc-ibm-aix5.3.0.0/4.6.1/ppc64/libgcc_s.a(shr.o)
         /usr/lib/libc.a(shr_64.o)
         /unix
         /usr/lib/libcrypt.a(shr_64.o)

libHostServices.so needs:
         ../../../bin/aix/debug/libConfig.so
         /opt/freeware/lib/gcc/powerpc-ibm-aix5.3.0.0/4.6.1/ppc64/libstdc++.a(libstdc++.so.6)
         /opt/freeware/lib/gcc/powerpc-ibm-aix5.3.0.0/4.6.1/ppc64/libgcc_s.a(shr.o)
         /usr/lib/libc.a(shr_64.o)
         /unix
         /usr/lib/libcrypt.a(shr_64.o)

InterfaceCTest needs:
         /usr/lib/libc.a(shr_64.o)
         ../../../bin/aix/debug/libHostServices.so
         ../../../bin/aix/debug/libConfig.so
         /opt/freeware/lib/gcc/powerpc-ibm-aix5.3.0.0/4.6.1/ppc64/libgcc_s.a(shr.o)
         /unix
         /usr/lib/libcrypt.a(shr_64.o)
         /opt/freeware/lib/gcc/powerpc-ibm-aix5.3.0.0/4.6.1/ppc64/libstdc++.a(libstdc++.so.6)

当我执行可执行的 InterfaceCTest 时,我得到:


GNU gdb 6.0
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "powerpc-ibm-aix5.1.0.0"...
(gdb) run
...
Program received signal SIGABRT, Aborted.
0x090000000005ca8c in raise () from /usr/lib/libc.a(shr_64.o)
(gdb) where
#0  0x090000000005ca8c in raise () from /usr/lib/libc.a(shr_64.o)
#1  0x0900000000088008 in abort () from /usr/lib/libc.a(shr_64.o)
#2  0x090000000f16a704 in __gnu_cxx::__verbose_terminate_handler() () at  _start_ :95
#3  0x090000000f173b34 in __cxxabiv1::__terminate(void (*)()) (handler=
findvar.c:706: internal-error: value_from_register: Value not stored anywhere!
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Quit this debugging session? (y or n) findvar.c:706: internal-error: value_from_register: Value not stored anywhere!
IOT/Abort trap(coredump)
A problem internal to GDB has been detected,
further debugging may prove unreliable.
Create a core file of GDB? (y or n) 

过去三天我在谷歌上搜索了我可能做错的任何事情,但直到现在我什么也没得到。 AIX: Why does throwing an exception abort multithreaded code? 链接对我来说很好用,所以我确定问题是由于共享库引发的异常所致。

有人知道我可能做错了什么吗?

谢谢


我做了一个非常简单的测试,现在我很确定这与我的环境有关:

图书馆libCore.a:

标头Core.h:

#ifdef __cplusplus
extern "C" {
#endif

void ThrowException();

#ifdef __cplusplus
} //extern "C"
#endif

主体:

#include "Core.h"

void ThrowException()
{
    try
    {
    throw new int;
    }
    catch(int * e)
    {
       printf("Exception int caught\n");
    }
    catch(...)
    {
       printf("Exception ... caught\n");
    }   
}

可执行CoreCTest:

#include "Core.h"

int main()
{

    ThrowException();

    return 1;
}

当我执行我的可执行文件时,我得到:

./CoreCTest 在抛出“int*”的实例后调用终止 物联网/中止陷阱(coredump)

ldd 返回:

CoreCTest 需要: /usr/lib/libc.a(shr_64.o) /usr/lib/libpthreads.a(shr_xpg5_64.o) ../../../bin/aix/debug/libCore.a /opt/freeware/lib/gcc/powerpc-ibm-aix5.3.0.0/4.6.1/pthread/ppc64/libgcc_s.a(shr.o) /unix /usr/lib/libcrypt.a(shr_64.o) /opt/freeware/lib/gcc/powerpc-ibm-aix5.3.0.0/4.6.1/pthread/ppc64/libstdc++.a(libstdc++.so.6)

有人知道发生了什么吗?任何帮助将不胜感激!

谢谢

【问题讨论】:

  • 只是想知道,您的libCore.a 不是共享库吗?为什么是.a 后缀?
  • N.m.,IBM AIX 使用与其他 unix 系统不同的共享库概念。共享库有 .a 扩展名,运行时可链接二进制文件有 .so(一团糟,呵呵)。
  • 解决了!!!!!!处理同一问题的两个提示:1 - 使用 BASH 作为你的 shell - 其他 shell 会给你乱七八糟的重复符号(难以置信,我知道 - gcc.gnu.org/bugzilla/show_bug.cgi?id=13391) 2 - 在我的 LDFLAGS 上缺少 -shared; 3 - LDFLAGS 允许未解析的符号。新 LDFLAGS=-shared -Wl,-G,-bernotok -Wl,-bnoentry -Wl,-bexpall

标签: c++ exception gcc aix


【解决方案1】:

我可以通过为链接器提供链接this 库的“-lsupc++”选项来解决此问题。

【讨论】:

    猜你喜欢
    • 2013-04-02
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2010-12-22
    • 2020-03-09
    • 2015-12-11
    相关资源
    最近更新 更多