EABI functions like __aeabi_f2ulz are defined as aliases of standard
libgcc functions like __fixunssfdi. In libgcc.a, the standard function
gets the correct hidden visibility, but the alias retains default
visibility. This means that DSOs linked against libgcc.a may end
up exporting the libgcc.a definition of __aeabi_f2ulz.
The bug is that bpabi-lib.h uses an asm statement to define an alias,
so the standard ways of forcing hidden visibility at the C level have
no effect. Fixed by using attributes instead.
Tested on arm-linux-gnueabi. Also tested by making sure that libgcc.a
defined no default-visibility symbols. OK for trunk?
What about release branches? I suppose this isn't a regression,
but it is a backwards-compatible ABI fix.
Richard
libgcc/
PR target/50090
* config/arm/bpabi-lib.h (RENAME_LIBRARY): Use a C-level alias
instead of an assembly one.
Index: libgcc/config/arm/bpabi-lib.h
===================================================================
--- libgcc/config/arm/bpabi-lib.h 2011-08-15 16:46:13.000000000 +0100
+++ libgcc/config/arm/bpabi-lib.h 2011-08-15 16:50:39.052030640 +0100
@@ -28,9 +28,8 @@ #define RENAME_LIBRARY_SET ".set"
/* Make __aeabi_AEABI_NAME an alias for __GCC_NAME. */
#define RENAME_LIBRARY(GCC_NAME, AEABI_NAME) \
- __asm__ (".globl\t__aeabi_" #AEABI_NAME "\n" \
- RENAME_LIBRARY_SET "\t__aeabi_" #AEABI_NAME \
- ", __" #GCC_NAME "\n");
+ typeof (__##GCC_NAME) __aeabi_##AEABI_NAME \
+ __attribute__((alias ("__" #GCC_NAME)));
/* Give some libgcc functions an additional __aeabi name. */
#ifdef L_muldi3