AIX 5.3上跨共享库的异常问题

问题描述 投票:3回答:1

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

Environment: IBM AIX 5.3 64 Bits
Compiler: 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生成选项是

Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/opt/freeware/libexec/gcc/powerpc-ibm-aix5.3.0.0/4.6.1/lto-wrapper
Target: powerpc-ibm-aix5.3.0.0
Configured with: ../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
Thread model: aix
gcc version 4.6.1 (GCC)
COLLECT_GCC_OPTIONS='-g' '-v' '-Wextra' '-Wall' '-fPIC' '-O2' '-mminimal-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 -mminimal-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
terminate called after throwing an instance of 'int*'
IOT/Abort trap(coredump)

ldd回归:

CoreCTest needs:
         /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)

有没有人知道发生了什么?任何帮助将非常感激!

谢谢

c++ exception gcc aix
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.