about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2015-08-14 22:15:49 -0400
committerMike Frysinger <vapier@gentoo.org>2016-01-24 03:43:10 -0500
commit7ad78f869815a73dc26c93b72d156812d93eb026 (patch)
tree0fd18c2e83d4d580877128975bbe03abaaf25243
parentc6d1664014de6e9f36aba21e8c84419885b396d8 (diff)
downloadglibc-7ad78f869815a73dc26c93b72d156812d93eb026.tar.gz
glibc-7ad78f869815a73dc26c93b72d156812d93eb026.tar.xz
glibc-7ad78f869815a73dc26c93b72d156812d93eb026.zip
hppa: start.S: rework references to fix PIE TEXTRELs [BZ #18421]
The startup code was not using PIC friendly references leading to TEXTRELs
in every PIE ELF.

(cherry picked from commit cf4253777412e9c8d5bfbc1c8b975f472e1e7d43)
-rw-r--r--ChangeLog8
-rw-r--r--NEWS4
-rw-r--r--sysdeps/hppa/start.S16
3 files changed, 24 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 4f30c7e002..0bde9e21f4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2015-08-18  Alan Modra  <amodra@gmail.com>
+
+	[BZ #18421]
+	* sysdeps/hppa/start.S [SHARED]: Use .section .data.rel.ro and define
+	.Lp__global.
+	(_start): Load %dp via .Lp__global.
+	[!SHARED]: Use .section .rodata.
+
 2015-08-09  John David Anglin  <danglin@gcc.gnu.org>
 
 	[BZ #18480]
diff --git a/NEWS b/NEWS
index bc2287d222..99e68d20de 100644
--- a/NEWS
+++ b/NEWS
@@ -9,8 +9,8 @@ Version 2.22.1
 
 * The following bugs are resolved with this release:
 
-  17905, 18480, 18589, 18743, 18778, 18781, 18787, 18796, 18870, 18887,
-  18921, 18928, 18969, 18985, 19018, 19058, 19174, 19178.
+  17905, 18421, 18480, 18589, 18743, 18778, 18781, 18787, 18796, 18870,
+  18887, 18921, 18928, 18969, 18985, 19018, 19058, 19174, 19178.
 
 * The LD_POINTER_GUARD environment variable can no longer be used to
   disable the pointer guard feature.  It is always enabled.
diff --git a/sysdeps/hppa/start.S b/sysdeps/hppa/start.S
index 64d8c3ed6f..cc4f243650 100644
--- a/sysdeps/hppa/start.S
+++ b/sysdeps/hppa/start.S
@@ -42,7 +42,11 @@
 	/* Have the linker create plabel words so we get PLABEL32
 	   relocs and not 21/14.  The use of 21/14 relocs is only
 	   supported in the latest dynamic linker.  */
-	.section	.rodata
+#ifdef SHARED
+	.section	.data.rel.ro,"aw",@progbits
+#else
+	.section	.rodata,"a",@progbits
+#endif
 	.align 4
 .Lpmain:
 	.word P%main
@@ -52,6 +56,10 @@
 	.word P%__libc_csu_fini
 .Lp__libc_csu_init:
 	.word P%__libc_csu_init
+#ifdef SHARED
+.Lp__global:
+	.word $global$
+#endif
 
 	.text
 	.align 4
@@ -122,10 +130,14 @@ _start:
 	/* void *stack_end (7th argument) */
 	stw	%sp, -60(%sp)
 
+#ifdef SHARED
+	addil	LT'.Lp__global, %r19
+	ldw	RT'.Lp__global(%r1), %dp
+#else
 	/* load global */
 	ldil	L%$global$, %dp
 	ldo	R%$global$(%dp), %dp
-
+#endif
 	bl	__libc_start_main,%r2
 	nop
 	/* die horribly if it returned (it shouldn't) */