Я портирую для 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.a
и libConfig.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: Почему создание исключения прерывает многопоточный код? прекрасно работает для меня, поэтому я уверен, что проблема связана с исключениями, создаваемыми в общих библиотеках.
Кто-нибудь имеет представление о том, что я могу делать неправильно?
Спасибо
Я провел довольно простой тест, и теперь я уверен, что это что-то, связанное с моей средой:
Библиотека libCore.a
:
Заголовок Core.h
:
#ifdef __cplusplus
extern "C" {
#endif
void ThrowException();
#ifdef __cplusplus
} //extern "C"
#endif
Body:
#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)
Кто-нибудь имеет ЛЮБОЕ представление о том, что происходит? Буду признателен за любую помощь!
Спасибо