From a347c1bd9be53513f60ed0e5f440c1f5cd78dec4 Mon Sep 17 00:00:00 2001
From: "Maciej W. Rozycki" <macro@linux-mips.org>
Date: Fri, 3 May 2013 15:19:26 +0000
Subject: [PATCH]         gold/         PR ld/15365         * layout.cc
 (Layout::finalize): Make __ehdr_start STV_HIDDEN.

        ld/
        PR ld/15365
        * emultempl/elf32.em (gld${EMULATION_NAME}_before_allocation):
        Restrict __ehdr_start's export class to no less than STV_HIDDEN.

        ld/testsuite/
        PR ld/15365
        * ld-elf/ehdr_start.d: Expect __ehdr_start to be STB_LOCAL.
        * ld-mips-elf/ehdr_start-1.nd: New test.
        * ld-mips-elf/ehdr_start-2.nd: New test.
        * ld-mips-elf/ehdr_start-1.ld: New test linker script.
        * ld-mips-elf/ehdr_start-2.ld: New test linker script.
        * ld-mips-elf/ehdr_start-new.s: New test source.
        * ld-mips-elf/ehdr_start-o32.s: New test source.
        * ld-mips-elf/mips-elf.exp: Run the new tests.
---
 gold/ChangeLog                            |    5 +++++
 gold/layout.cc                            |    2 +-
 ld/ChangeLog                              |    6 ++++++
 ld/emultempl/elf32.em                     |    7 +++++++
 ld/testsuite/ChangeLog                    |   12 ++++++++++++
 ld/testsuite/ld-elf/ehdr_start.d          |    2 +-
 ld/testsuite/ld-mips-elf/ehdr_start-1.ld  |    9 +++++++++
 ld/testsuite/ld-mips-elf/ehdr_start-1.nd  |    4 ++++
 ld/testsuite/ld-mips-elf/ehdr_start-2.ld  |   10 ++++++++++
 ld/testsuite/ld-mips-elf/ehdr_start-2.nd  |    4 ++++
 ld/testsuite/ld-mips-elf/ehdr_start-new.s |   13 +++++++++++++
 ld/testsuite/ld-mips-elf/ehdr_start-o32.s |   14 ++++++++++++++
 ld/testsuite/ld-mips-elf/mips-elf.exp     |   25 +++++++++++++++++++++++++
 13 files changed, 111 insertions(+), 2 deletions(-)
 create mode 100644 ld/testsuite/ld-mips-elf/ehdr_start-1.ld
 create mode 100644 ld/testsuite/ld-mips-elf/ehdr_start-1.nd
 create mode 100644 ld/testsuite/ld-mips-elf/ehdr_start-2.ld
 create mode 100644 ld/testsuite/ld-mips-elf/ehdr_start-2.nd
 create mode 100644 ld/testsuite/ld-mips-elf/ehdr_start-new.s
 create mode 100644 ld/testsuite/ld-mips-elf/ehdr_start-o32.s

Upstream-Status: Backport
Index: binutils-2.23.2/gold/layout.cc
===================================================================
--- binutils-2.23.2.orig/gold/layout.cc	2013-06-26 23:29:32.000000000 -0700
+++ binutils-2.23.2/gold/layout.cc	2013-06-26 23:39:22.170432315 -0700
@@ -2516,7 +2516,7 @@
     symtab->define_in_output_segment("__ehdr_start", NULL,
 				     Symbol_table::PREDEFINED, load_seg, 0, 0,
 				     elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL,
-				     elfcpp::STV_DEFAULT, 0,
+				     elfcpp::STV_HIDDEN, 0,
 				     Symbol::SEGMENT_START, true);
 
   // Set the file offsets of all the non-data sections we've seen so
Index: binutils-2.23.2/ld/emultempl/elf32.em
===================================================================
--- binutils-2.23.2.orig/ld/emultempl/elf32.em	2013-06-26 23:37:04.000000000 -0700
+++ binutils-2.23.2/ld/emultempl/elf32.em	2013-06-26 23:39:22.174432315 -0700
@@ -1498,6 +1498,13 @@
     {
       _bfd_elf_tls_setup (link_info.output_bfd, &link_info);
 
+      /* Make __ehdr_start hidden if it has been referenced, to
+	 prevent the symbol from being dynamic.  */
+      if (!bfd_elf_record_link_assignment (link_info.output_bfd, &link_info,
+					   "__ehdr_start", TRUE, TRUE))
+	einfo ("%P%F: failed to record assignment to %s: %E\n",
+	       "__ehdr_start");
+
       /* If we are going to make any variable assignments, we need to
 	 let the ELF backend know about them in case the variables are
 	 referred to by dynamic objects.  */
Index: binutils-2.23.2/ld/testsuite/ld-elf/ehdr_start.d
===================================================================
--- binutils-2.23.2.orig/ld/testsuite/ld-elf/ehdr_start.d	2013-06-26 23:29:32.000000000 -0700
+++ binutils-2.23.2/ld/testsuite/ld-elf/ehdr_start.d	2013-06-26 23:39:22.174432315 -0700
@@ -4,5 +4,5 @@
 #target: *-*-linux* *-*-gnu* *-*-nacl*
 
 #...
-[0-9a-f]*000 [ADRT] __ehdr_start
+[0-9a-f]*000 [Adrt] __ehdr_start
 #pass
Index: binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-1.ld
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-1.ld	2013-06-26 23:39:22.174432315 -0700
@@ -0,0 +1,9 @@
+ENTRY (__start)
+SECTIONS
+{
+  . = 0x12300000 + SIZEOF_HEADERS;
+  .text : { *(.text) }
+  . = 0x23400000;
+  HIDDEN (_gp = ALIGN (16) + 0x7ff0);
+  .got : { *(.got) }
+}
Index: binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-1.nd
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-1.nd	2013-06-26 23:39:22.174432315 -0700
@@ -0,0 +1,4 @@
+Symbol table '\.symtab' contains [0-9]+ entries:
+#...
+ *[0-9]+: 0*12300000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +[0-9]+ __ehdr_start
+#pass
Index: binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-2.ld
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-2.ld	2013-06-26 23:39:22.174432315 -0700
@@ -0,0 +1,10 @@
+ENTRY (__start)
+SECTIONS
+{
+  . = 0x12300000 + SIZEOF_HEADERS;
+  .text : { *(.text) }
+  . = 0x23400000;
+  __ehdr_start = .;
+  HIDDEN (_gp = ALIGN (16) + 0x7ff0);
+  .got : { *(.got) }
+}
Index: binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-2.nd
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-2.nd	2013-06-26 23:39:22.178432315 -0700
@@ -0,0 +1,4 @@
+Symbol table '\.symtab' contains [0-9]+ entries:
+#...
+ *[0-9]+: 0*23400000 +0 (?:NOTYPE|OBJECT) +LOCAL +DEFAULT +[0-9]+ __ehdr_start
+#pass
Index: binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-new.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-new.s	2013-06-26 23:39:22.178432315 -0700
@@ -0,0 +1,13 @@
+	.abicalls
+	.text
+	.weak	__ehdr_start
+	.globl	__start
+	.ent	__start
+	.frame	$29, 0, $31
+	.mask	0x00000000, 0
+__start:
+	.cplocal $2
+	.cpsetup $t9, $zero, __start
+	lw	$2, __ehdr_start
+	jr	$31
+	.end	__start
Index: binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-o32.s
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ binutils-2.23.2/ld/testsuite/ld-mips-elf/ehdr_start-o32.s	2013-06-26 23:39:22.178432315 -0700
@@ -0,0 +1,14 @@
+	.abicalls
+	.text
+	.weak	__ehdr_start
+	.globl	__start
+	.ent	__start
+	.frame	$29, 0, $31
+	.mask	0x00000000, 0
+__start:
+	.set	noreorder
+	.cpload	$25
+	.set	reorder
+	lw	$2, __ehdr_start
+	jr	$31
+	.end	__start
Index: binutils-2.23.2/ld/testsuite/ld-mips-elf/mips-elf.exp
===================================================================
--- binutils-2.23.2.orig/ld/testsuite/ld-mips-elf/mips-elf.exp	2013-06-26 23:29:32.000000000 -0700
+++ binutils-2.23.2/ld/testsuite/ld-mips-elf/mips-elf.exp	2013-06-26 23:39:22.178432315 -0700
@@ -669,3 +669,28 @@
 		"readelf -A export-class-call16-${abi}.gd"] \
 	    "export-class-call16-${abi}.so"]]
 }
+
+# Magic __ehdr_start symbol tests.
+set abis [concat o32 [expr {$has_newabi ? "n32 n64" : ""}]]
+foreach { abi } $abis {
+    set suff [string map {o32 o32 n32 new n64 new} $abi]
+    run_ld_link_tests [list \
+        [list \
+            "MIPS magic __ehdr_start symbol test 1 ($abi)" \
+            "$abi_ldflags($abi) -T ehdr_start-1.ld" "" \
+            "$abi_asflags($abi)" \
+            [list ehdr_start-${suff}.s] \
+            [list "readelf -s ehdr_start-1.nd"] \
+            "ehdr_start-1-${abi}"]]
+    if [regexp "(?:n32|n64)" "$abi"] {
+	setup_kfail "mips*-*-*" "ld/15428"
+    }
+    run_ld_link_tests [list \
+        [list \
+            "MIPS magic __ehdr_start symbol test 2 ($abi)" \
+            "$abi_ldflags($abi) -T ehdr_start-2.ld" "" \
+            "$abi_asflags($abi)" \
+            [list ehdr_start-${suff}.s] \
+            [list "readelf -s ehdr_start-2.nd"] \
+            "ehdr_start-2-${abi}"]]
+}
