From 1fa29c42bb742a5f31926b7a4eb61b6164734d00 Mon Sep 17 00:00:00 2001 From: Michal Meloun Date: Mon, 16 Dec 2019 14:08:49 +0000 Subject: [PATCH] Fix LLVM libunwnwind _Unwind_Backtrace symbol version for ARM. In original GNU libgcc, _Unwind_Backtrace is published with GCC_3.3 version for all architectures but ARM. For ARM should be publishes with GCC_4.3.0 version. This was originally omitted in r255095, fixed in r318024 and omitted aging in LLVM libunwind implementation in r354347. For ARM _Unwind_Backtrace should be published as default with GCC_4.3.0 version , (because this is right original version) and again as normal(not-default) with GCC_3.3 version (to maintain ABI compatibility compiled/linked with wrong pre r318024 libgcc) PR: 233664 --- contrib/libunwind/src/UnwindLevel1-gcc-ext.c | 4 ++-- lib/libgcc_s/Makefile | 2 ++ lib/libgcc_s/Symbol.map | 1 - lib/libgcc_s/SymbolDefault.map | 7 +++++++ lib/libgcc_s/arm/Symbol.map | 4 ++++ 5 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 lib/libgcc_s/SymbolDefault.map diff --git a/contrib/libunwind/src/UnwindLevel1-gcc-ext.c b/contrib/libunwind/src/UnwindLevel1-gcc-ext.c index 2afa6c69d4d..00cfd243d47 100644 --- a/contrib/libunwind/src/UnwindLevel1-gcc-ext.c +++ b/contrib/libunwind/src/UnwindLevel1-gcc-ext.c @@ -182,8 +182,8 @@ _Unwind_Backtrace(_Unwind_Trace_Fn callback, void *ref) { } } #ifdef __arm__ -/* Preserve legacy libgcc ARM ABI mistake. */ -__sym_compat(_Unwind_Backtrace, _Unwind_Backtrace, GCC_4.3.0); +/* Preserve legacy libgcc (pre r318024) ARM ABI mistake */ +__sym_compat(_Unwind_Backtrace, _Unwind_Backtrace, GCC_3.3); #endif diff --git a/lib/libgcc_s/Makefile b/lib/libgcc_s/Makefile index ef309421032..0b9bbf257c5 100644 --- a/lib/libgcc_s/Makefile +++ b/lib/libgcc_s/Makefile @@ -18,6 +18,8 @@ SYMBOL_MAPS= ${.CURDIR}/Symbol.map # Export ARM AEABI unwind routines needed by libc and libthr. .if exists(${.CURDIR}/${MACHINE_CPUARCH}/Symbol.map) SYMBOL_MAPS+= ${.CURDIR}/${MACHINE_CPUARCH}/Symbol.map +.else +SYMBOL_MAPS+= ${.CURDIR}/SymbolDefault.map .endif .endif diff --git a/lib/libgcc_s/Symbol.map b/lib/libgcc_s/Symbol.map index 065629d44cd..695f6189336 100644 --- a/lib/libgcc_s/Symbol.map +++ b/lib/libgcc_s/Symbol.map @@ -86,7 +86,6 @@ GCC_3.0 { }; GCC_3.3 { - _Unwind_Backtrace; _Unwind_FindEnclosingFunction; _Unwind_GetCFA; _Unwind_Resume_or_Rethrow; diff --git a/lib/libgcc_s/SymbolDefault.map b/lib/libgcc_s/SymbolDefault.map new file mode 100644 index 00000000000..b3da3a8688b --- /dev/null +++ b/lib/libgcc_s/SymbolDefault.map @@ -0,0 +1,7 @@ +/* + * $FreeBSD$ + */ +/* _Unwind_Backtrace should be exported with different version on ARM */ +GCC_3.3 { + _Unwind_Backtrace; +}; diff --git a/lib/libgcc_s/arm/Symbol.map b/lib/libgcc_s/arm/Symbol.map index 447ba923ccb..fd48eab4d60 100644 --- a/lib/libgcc_s/arm/Symbol.map +++ b/lib/libgcc_s/arm/Symbol.map @@ -10,3 +10,7 @@ GCC_3.5 { __aeabi_unwind_cpp_pr2; __gnu_unwind_frame; }; + +GCC_4.3.0 { + _Unwind_Backtrace; +};