gold/
authorMaciej W. Rozycki <macro@linux-mips.org>
Fri, 3 May 2013 15:19:27 +0000 (15:19 +0000)
committerMaciej W. Rozycki <macro@linux-mips.org>
Fri, 3 May 2013 15:19:27 +0000 (15:19 +0000)
        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.

13 files changed:
gold/ChangeLog
gold/layout.cc
ld/ChangeLog
ld/emultempl/elf32.em
ld/testsuite/ChangeLog
ld/testsuite/ld-elf/ehdr_start.d
ld/testsuite/ld-mips-elf/ehdr_start-1.ld [new file with mode: 0644]
ld/testsuite/ld-mips-elf/ehdr_start-1.nd [new file with mode: 0644]
ld/testsuite/ld-mips-elf/ehdr_start-2.ld [new file with mode: 0644]
ld/testsuite/ld-mips-elf/ehdr_start-2.nd [new file with mode: 0644]
ld/testsuite/ld-mips-elf/ehdr_start-new.s [new file with mode: 0644]
ld/testsuite/ld-mips-elf/ehdr_start-o32.s [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips-elf.exp

index 35aa64abd16c146dd1ba2b41b73c28bc7d5ffbb9..9a50ae01a2d2fa97df5af121e91536ee76797a35 100644 (file)
@@ -1,3 +1,8 @@
+2013-05-03  Maciej W. Rozycki  <macro@codesourcery.com>
+
+       PR ld/15365
+       * layout.cc (Layout::finalize): Make __ehdr_start STV_HIDDEN.
+
 2013-05-03  Alan Modra  <amodra@gmail.com>
 
        * merge.cc (Output_merge_string::do_add_input_section): Correct
index b593acdb0b2ce989be51567a3bf817141eabff10..85b1db7a7f142c90da806091a486c6b204821390 100644 (file)
@@ -2713,7 +2713,7 @@ Layout::finalize(const Input_objects* input_objects, Symbol_table* symtab,
     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 7175c98343945950e0dbcce5207d9f1e0dec498e..e41c4dd14377b64ce9a74aef6246eff50c9f92cd 100644 (file)
@@ -1,3 +1,9 @@
+2013-05-03  Alan Modra  <amodra@gmail.com>
+
+       PR ld/15365
+       * emultempl/elf32.em (gld${EMULATION_NAME}_before_allocation):
+       Restrict __ehdr_start's export class to no less than STV_HIDDEN.
+
 2013-05-03  Alan Modra  <amodra@gmail.com>
 
        * emultempl/elf32.em (gld${EMULATION_NAME}_before_allocation):
index 251c5110823147e9b121c8c5b168aca6b65bb5aa..581d9db897703e664697c03897fc09a1070ad76d 100644 (file)
@@ -1487,6 +1487,13 @@ gld${EMULATION_NAME}_before_allocation (void)
     {
       _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 4b8645b71208dbc0427258ca5fb81e176eb56f9e..a6919e39f8b64bcb24e50b38f18e76307c6d9fca 100644 (file)
@@ -1,3 +1,15 @@
+2013-05-03  Maciej W. Rozycki  <macro@codesourcery.com>
+
+       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.
+
 2013-05-03  Maciej W. Rozycki  <macro@codesourcery.com>
 
        * ld-elf/provide-hidden-s.nd: New test.
index 9a8288242fab47a470cb93589d242fc16f27397d..52e5b5488307c2debd58e9597be874137aaebe23 100644 (file)
@@ -4,5 +4,5 @@
 #target: *-*-linux* *-*-gnu* *-*-nacl*
 
 #...
-[0-9a-f]*000 [ADRT] __ehdr_start
+[0-9a-f]*000 [Adrt] __ehdr_start
 #pass
diff --git a/ld/testsuite/ld-mips-elf/ehdr_start-1.ld b/ld/testsuite/ld-mips-elf/ehdr_start-1.ld
new file mode 100644 (file)
index 0000000..0485b05
--- /dev/null
@@ -0,0 +1,9 @@
+ENTRY (__start)
+SECTIONS
+{
+  . = 0x12300000 + SIZEOF_HEADERS;
+  .text : { *(.text) }
+  . = 0x23400000;
+  HIDDEN (_gp = ALIGN (16) + 0x7ff0);
+  .got : { *(.got) }
+}
diff --git a/ld/testsuite/ld-mips-elf/ehdr_start-1.nd b/ld/testsuite/ld-mips-elf/ehdr_start-1.nd
new file mode 100644 (file)
index 0000000..9496b7d
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-mips-elf/ehdr_start-2.ld b/ld/testsuite/ld-mips-elf/ehdr_start-2.ld
new file mode 100644 (file)
index 0000000..5d5e183
--- /dev/null
@@ -0,0 +1,10 @@
+ENTRY (__start)
+SECTIONS
+{
+  . = 0x12300000 + SIZEOF_HEADERS;
+  .text : { *(.text) }
+  . = 0x23400000;
+  __ehdr_start = .;
+  HIDDEN (_gp = ALIGN (16) + 0x7ff0);
+  .got : { *(.got) }
+}
diff --git a/ld/testsuite/ld-mips-elf/ehdr_start-2.nd b/ld/testsuite/ld-mips-elf/ehdr_start-2.nd
new file mode 100644 (file)
index 0000000..986c2a2
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-mips-elf/ehdr_start-new.s b/ld/testsuite/ld-mips-elf/ehdr_start-new.s
new file mode 100644 (file)
index 0000000..5ee00dc
--- /dev/null
@@ -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
diff --git a/ld/testsuite/ld-mips-elf/ehdr_start-o32.s b/ld/testsuite/ld-mips-elf/ehdr_start-o32.s
new file mode 100644 (file)
index 0000000..0973447
--- /dev/null
@@ -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 902ae006a7291996773e9bd0afdf6663a3969145..97e0c2ce63c741194bb74b99a433fe97161692a9 100644 (file)
@@ -709,3 +709,28 @@ foreach { abi } $abis {
                "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}"]]
+}