title: Exception across shared libraries issue on AIX 5.3
body: <p>I'm porting for AIX a pretty stable code wich already runs in Windows, Linux  (both 32 and 64 bits) and Solaris SPARC and x86. The code throws exceptions across shared libraries:</p>
  
  <pre>
  Environment: IBM AIX 5.3 64 Bits
  Compiler: GCC 4.6.1
  </pre>
  
  <p>Note: The issue occurs either with code compiled in 32 or 64 bits</p>
  
  <p>The architecture is a little bit complicated, but basically we have:
  <code>CoreModules.a</code>: Static library which contais all core functions, objects and structures used by the shared libraries. The exception class is defined here and exceptions are thrown by classes defined here. Generated with <code>$(AR)</code>.</p>
  
  <p><code>libConfig.so</code>: Shared library which contains config info. Linked against <code>CoreModules.a</code>. Exceptions are thrown by classes defined here.</p>
  
  <p><code>libHostServices.so</code>: Shared library which contains the business rules. Linked against <code>CoreModules.a</code> and <code>libConfig.so</code>. Exceptions are thrown by classes defined here.</p>
  
  <p>Here goes my compiling and linking options:</p>
  
  <pre><code>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
  </code></pre>
  
  <p>The examples below were generated with <code>OBJECT_MODE=64</code></p>
  
  <p>My GCC generation options are</p>
  
  <pre>
  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
  </pre>
  
  <p>All my modules are linked to shared gcc (as they have to be to throw exception across shared libraries):</p>
  
  <pre><code>
  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)
  </code></pre>
  
  <p>When I execute the executable InterfaceCTest, I get:</p>
  
  <pre><code>
  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) 
  </code></pre>
  
  <p>I've passed the last three days googling anything I could be doing wrong but I got nothing untill now. The link <a href="https://stackoverflow.com/questions/305424/aix-why-does-throwing-an-exception-abort-multithreaded-code">AIX: Why does throwing an exception abort multithreaded code?</a> works fine for me, so I'm sure the issue is due to exceptions being thrown across shared libraries.</p>
  
  <p>Does anyone have any idea of what I might be doing wrong?</p>
  
  <p>Thanks</p>
  
  <hr>
  
  <p>I've done a pretty simple test and now I'm pretty sure It is something related to my environment:</p>
  
  <p>Library <code>libCore.a</code>:</p>
  
  <p>Header <code>Core.h</code>:</p>
  
  <pre><code>#ifdef __cplusplus
  extern "C" {
  #endif
  
  void ThrowException();
  
  #ifdef __cplusplus
  } //extern "C"
  #endif
  </code></pre>
  
  <p>Body:</p>
  
  <pre><code>#include "Core.h"
  
  void ThrowException()
  {
      try
      {
      throw new int;
      }
      catch(int * e)
      {
         printf("Exception int caught\n");
      }
      catch(...)
      {
         printf("Exception ... caught\n");
      }   
  }
  </code></pre>
  
  <p>Executable <code>CoreCTest</code>:</p>
  
  <pre><code>#include "Core.h"
  
  int main()
  {
  
      ThrowException();
  
      return 1;
  }
  </code></pre>
  
  <p>And when I execute my executable, I get:</p>
  
  <pre>
  ./CoreCTest
  terminate called after throwing an instance of 'int*'
  IOT/Abort trap(coredump)
  </pre>
  
  <p>The <code>ldd</code> returns:</p>
  
  <pre>
  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)
  </pre>
  
  <p>Does anyone have ANY idea of what is going on? Any help would be really appreciated!</p>
  
  <p>Thanks</p>