arm: setjmp/longjmp: fix PIC vs SHARED thinkos

Message ID 1442559907-31957-1-git-send-email-vapier@gentoo.org
State Committed
Delegated to: Mike Frysinger
Headers

Commit Message

Mike Frysinger Sept. 18, 2015, 7:05 a.m. UTC
  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

Joseph Myers Sept. 18, 2015, 11:34 a.m. UTC | #1
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.
  

Patch

diff --git a/sysdeps/arm/__longjmp.S b/sysdeps/arm/__longjmp.S
index fc60a5d..1033e13 100644
--- a/sysdeps/arm/__longjmp.S
+++ b/sysdeps/arm/__longjmp.S
@@ -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
diff --git a/sysdeps/arm/setjmp.S b/sysdeps/arm/setjmp.S
index e44beb4..be0a4ec 100644
--- a/sysdeps/arm/setjmp.S
+++ b/sysdeps/arm/setjmp.S
@@ -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