arm: setjmp/longjmp: fix PIC vs SHARED thinkos
Commit Message
From: David Lamparter <equinox-gentoo@diac24.net>
The logic in setjmp/__longjmp incorrectly uses "PIC" to figure out
whether the code is going into a shared library when it should be
using "SHARED". If you build glibc with a gcc version that has PIE
enabled by default, then the code will try to use symbols that are
only in the shared library.
2015-09-18 David Lamparter <equinox-gentoo@diac24.net>
* sysdeps/arm/setjmp.S: Change PIC to SHARED.
* sysdeps/arm/__longjmp.S: Likewise
---
Note: This was previously posted here:
https://sourceware.org/ml/libc-ports/2011-09/msg00018.html
But I never got around to cleaning things up. Fortunately, Roland
did that for me in commit 8c2b1ed8bbd20d35314c2a602b903159fa567ffb.
sysdeps/arm/__longjmp.S | 2 +-
sysdeps/arm/setjmp.S | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
Comments
On Fri, 18 Sep 2015, Mike Frysinger wrote:
> From: David Lamparter <equinox-gentoo@diac24.net>
>
> The logic in setjmp/__longjmp incorrectly uses "PIC" to figure out
> whether the code is going into a shared library when it should be
> using "SHARED". If you build glibc with a gcc version that has PIE
> enabled by default, then the code will try to use symbols that are
> only in the shared library.
>
> 2015-09-18 David Lamparter <equinox-gentoo@diac24.net>
>
> * sysdeps/arm/setjmp.S: Change PIC to SHARED.
> * sysdeps/arm/__longjmp.S: Likewise
OK.
@@ -81,7 +81,7 @@ ENTRY (__longjmp)
C_SYMBOL_NAME(_rtld_local_ro) \
+ RTLD_GLOBAL_RO_DL_HWCAP_OFFSET)
# else
-# ifdef PIC
+# ifdef SHARED
LDR_GLOBAL (a4, a3, C_SYMBOL_NAME(_rtld_global_ro), \
RTLD_GLOBAL_RO_DL_HWCAP_OFFSET)
# else
@@ -62,7 +62,7 @@ ENTRY (__sigsetjmp)
C_SYMBOL_NAME(_rtld_local_ro) \
+ RTLD_GLOBAL_RO_DL_HWCAP_OFFSET)
# else
-# ifdef PIC
+# ifdef SHARED
LDR_GLOBAL (a3, a4, C_SYMBOL_NAME(_rtld_global_ro), \
RTLD_GLOBAL_RO_DL_HWCAP_OFFSET)
# else