https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85907
Bug ID: 85907
Summary: AIX: static libstdc++ and exceptions causes abort
Product: gcc
Version: 8.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: brian at groose dot com
Target Milestone: ---
Created attachment 44178
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=44178&action=edit
Pre-processed file
This bug seems to have been introduced in 4.9, and still exists in 8.1.0. This
works as expected in 4.8.x.
If you statically link in libstdc++ on AIX, exception handling is broken. The
first exception gets caught, but any later exceptions cause a core dump.
Example code:
# cat test.cpp
#include
int main()
{
for (int i = 0; i < 5; ++i) {
try {
throw i;
} catch (int n) {
std::cout << "caught " << n << std::endl;
}
}
return 0;
}
Compile/Link:
g++ -o test test.cpp -static-libgcc -static-libstdc++ -lsupc++
Expected output:
caught 0
caught 1
caught 2
caught 3
caught 4
Actual output:
caught 0
IOT/Abort trap (core dumped)
Using built-in specs.
COLLECT_GCC=/opt/act-gcc-5.3.0a/bin/g++
COLLECT_LTO_WRAPPER=/opt/act-gcc-5.3.0a/libexec/gcc/powerpc-ibm-aix6.1.8.0/5.3.0/lto-wrapper
Target: powerpc-ibm-aix6.1.8.0
Configured with: /opt/jenkins/bg/gcc/act-gcc-5.3.0a-sandbox/gcc-5.3.0/configure
--prefix=/opt/act-gcc-5.3.0a --enable-languages=c,c++
--with-pkgversion=act-gcc-5.3.0a
Thread model: aix
gcc version 5.3.0 (act-gcc-5.3.0a)
I found a patch that fixes this at https://patchwork.ozlabs.org/patch/745138/
*** unwind-dw2-fde.c2018-05-21 17:56:34.0 -0400
--- unwind-dw2-fde.c2018-05-22 10:29:07.0 -0400
***
*** 1054,1060
--- 1054,1080
f = search_object (ob, pc);
if (f)
goto fini;
+ /* In an ideal world, even on AIX, we could break here because
+ objects would not overlap. But the larger an application is,
+ the more likely an "overlap" may happen (on AIX) because of:
+ - Shared libraries do export the FDE symbols ("_GLOBAL__F*"),
+which is a bug in their build system, out of gcc's control.
+ - Other shared libraries, or the main executable, may contain
+identical or similar object files - which is suboptimal, but
+may be intentional. However, exporting their FDE symbols,
+which may have identical symbol names as in their original
+shared libraries, again is a bug in their build system, but
+still out of gcc's control.
+ - When enabled, run time linking may redirect adresses of
+duplicate FDE symbols from their original shared library's
+address range into another shared library's or the main
+executable's address range, when they share the same FDE
+symbol name.
+ This results in address ranges being registered by different
+ object to potentially overlap. */
+ #if !(defined(_POWER) && defined(_AIX))
break;
+ #endif