path: root/lib
diff options
authorDimitry Andric <dim@FreeBSD.org>2018-08-10 19:57:55 +0000
committerDimitry Andric <dim@FreeBSD.org>2018-08-10 19:57:55 +0000
commit33c39ab6884fc6b7dfbf471f671e6e40601b3e46 (patch)
tree79c7b0cb4f5aa0fb9d9119a2da4b1a91da193f3b /lib
parent0b56e7a8e90a11ba6f7d32d759699b6a4ad1503f (diff)
In r308100, an explicit -fexceptions flag was added for the C sources
from LLVM's libunwind, which end up in libgcc_eh.a and libgcc_s.so. This is because the unwinder needs the unwinder data for its own functions. However, for the C++ sources in libunwind, -fexceptions is already the default, and this can have the side effect of generating a reference to __gxx_personality_v0, the so-called personality function, which is normally provided by the C++ ABI library (libcxxrt or libsupc++). If the reference ends up in the eventual libgcc_s.so, linking any non-C++ programs against it will fail with "undefined reference to `__gxx_personality_v0'". Note that at high optimization levels, the reference is usually optimized away, which is why we have never noticed this problem before. With clang 7.0.0 though, higher optimization levels don't help anymore, since the addition of address-significance tables [1] in <https://reviews.llvm.org/rL337339>. Effectively, this always causes a reference to __gxx_personality_v0. After discussion with the upstream author of that change, it turns out that we should compile libunwind sources with the -fno-exceptions -funwind-tables flags instead. This ensures unwind tables are generated, but no references to any personality functions are emitted. [1] https://lists.llvm.org/pipermail/llvm-dev/2018-May/123514.html Reported by: jbeich PR: 230399 MFC after: 1 week
Notes: svn path=/head/; revision=337585
Diffstat (limited to 'lib')
1 files changed, 4 insertions, 1 deletions
diff --git a/lib/libgcc_eh/Makefile.inc b/lib/libgcc_eh/Makefile.inc
index d69084f059cf..a8536e2413f1 100644
--- a/lib/libgcc_eh/Makefile.inc
+++ b/lib/libgcc_eh/Makefile.inc
@@ -20,7 +20,10 @@ SRCS_EXC+= libunwind.cpp
.for file in ${SRCS_EXC:M*.c}
-CFLAGS.${file}+= -fexceptions
+CFLAGS.${file}+= -fno-exceptions -funwind-tables
+.for file in ${SRCS_EXC:M*.cpp}
+CXXFLAGS.${file}+= -fno-exceptions -funwind-tables