Check if .got.plt section is discarded before using it.
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 13 Aug 2010 20:50:27 +0000 (20:50 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 13 Aug 2010 20:50:27 +0000 (20:50 +0000)
bfd/

2010-08-13  H.J. Lu  <hongjiu.lu@intel.com>

PR ld/11913
* elf32-i386.c (elf_i386_finish_dynamic_sections): Check if
 .got.plt section is discarded.
 * elf64-x86-64.c (elf64_x86_64_finish_dynamic_sections): Likewise.

ld/testsuite/

2010-08-13  H.J. Lu  <hongjiu.lu@intel.com>

PR ld/11913
* ld-i386/discarded1.d: New.
* ld-i386/discarded1.s: Likewise.
* ld-i386/discarded1.t: Likewise.
* ld-x86-64/discarded1.d: Likewise.
* ld-x86-64/discarded1.s: Likewise.
* ld-x86-64/discarded1.t: Likewise.

* ld-i386/i386.exp: Run discarded1.
* ld-x86-64/x86-64.exp: Likewise.

12 files changed:
bfd/ChangeLog
bfd/elf32-i386.c
bfd/elf64-x86-64.c
ld/testsuite/ChangeLog
ld/testsuite/ld-i386/discarded1.d [new file with mode: 0644]
ld/testsuite/ld-i386/discarded1.s [new file with mode: 0644]
ld/testsuite/ld-i386/discarded1.t [new file with mode: 0644]
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-x86-64/discarded1.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/discarded1.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/discarded1.t [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp

index e1c543b..5f18054 100644 (file)
@@ -1,3 +1,10 @@
+2010-08-13  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/11913
+       * elf32-i386.c (elf_i386_finish_dynamic_sections): Check if
+        .got.plt section is discarded.
+        * elf64-x86-64.c (elf64_x86_64_finish_dynamic_sections): Likewise.
+
 2010-08-13  Nathan Sidwell  <nathan@codesourcery.com>
 
        * elf32-m69k.c (elf32_m68k_print_private_bfd_data): Detect EMAC_B
index 0ff3147..4ba1ba0 100644 (file)
@@ -4613,6 +4613,13 @@ elf_i386_finish_dynamic_sections (bfd *output_bfd,
 
   if (htab->elf.sgotplt)
     {
+      if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
+       {
+         (*_bfd_error_handler)
+           (_("discarded output section: `%A'"), htab->elf.sgotplt);
+         return FALSE;
+       }
+
       /* Fill in the first three entries in the global offset table.  */
       if (htab->elf.sgotplt->size > 0)
        {
index b0bc5c0..9899fd4 100644 (file)
@@ -4186,6 +4186,13 @@ elf64_x86_64_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *inf
 
   if (htab->elf.sgotplt)
     {
+      if (bfd_is_abs_section (htab->elf.sgotplt->output_section))
+       {
+         (*_bfd_error_handler)
+           (_("discarded output section: `%A'"), htab->elf.sgotplt);
+         return FALSE;
+       }
+
       /* Fill in the first three entries in the global offset table.  */
       if (htab->elf.sgotplt->size > 0)
        {
index b5250a5..c15a44e 100644 (file)
@@ -1,3 +1,16 @@
+2010-08-13  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/11913
+       * ld-i386/discarded1.d: New.
+       * ld-i386/discarded1.s: Likewise.
+       * ld-i386/discarded1.t: Likewise.
+       * ld-x86-64/discarded1.d: Likewise.
+       * ld-x86-64/discarded1.s: Likewise.
+       * ld-x86-64/discarded1.t: Likewise.
+
+       * ld-i386/i386.exp: Run discarded1.
+       * ld-x86-64/x86-64.exp: Likewise.
+
 2010-08-09  Catherine Moore  <clm@codesourcery.com>
 
        * ld-mips-elf/mode-change-error-1.d: New.
diff --git a/ld/testsuite/ld-i386/discarded1.d b/ld/testsuite/ld-i386/discarded1.d
new file mode 100644 (file)
index 0000000..8106db3
--- /dev/null
@@ -0,0 +1,3 @@
+#as: --32
+#ld: -melf_i386 -T discarded1.t
+#error: .*discarded output section: `.got.plt'
diff --git a/ld/testsuite/ld-i386/discarded1.s b/ld/testsuite/ld-i386/discarded1.s
new file mode 100644 (file)
index 0000000..9b20c87
--- /dev/null
@@ -0,0 +1,13 @@
+       .text
+.globl _start
+       .type   _start, @function
+_start:
+       movl    x@GOT(%ecx), %eax
+       .size   _start, .-_start
+.globl x
+       .data
+       .align 4
+       .type   x, @object
+       .size   x, 4
+x:
+       .long   2
diff --git a/ld/testsuite/ld-i386/discarded1.t b/ld/testsuite/ld-i386/discarded1.t
new file mode 100644 (file)
index 0000000..a4d617f
--- /dev/null
@@ -0,0 +1,7 @@
+ENTRY(_start)
+SECTIONS
+{
+  .text : {*(.text)}
+  .data : {*(.data)}
+  /DISCARD/ : {*(*)}
+}
index 850713a..86ba9e4 100644 (file)
@@ -190,6 +190,7 @@ run_dump_test "protected2"
 run_dump_test "protected3"
 run_dump_test "tlspie1"
 run_dump_test "nogot1"
+run_dump_test "discarded1"
 
 if { !([istarget "i?86-*-linux*"]
        || [istarget "x86_64-*-linux*"]) } {
diff --git a/ld/testsuite/ld-x86-64/discarded1.d b/ld/testsuite/ld-x86-64/discarded1.d
new file mode 100644 (file)
index 0000000..c892595
--- /dev/null
@@ -0,0 +1,3 @@
+#as: --64
+#ld: -melf_x86_64 -T discarded1.t
+#error: .*discarded output section: `.got.plt'
diff --git a/ld/testsuite/ld-x86-64/discarded1.s b/ld/testsuite/ld-x86-64/discarded1.s
new file mode 100644 (file)
index 0000000..c638ed9
--- /dev/null
@@ -0,0 +1,13 @@
+       .text
+.globl _start
+       .type   _start, @function
+_start:
+       movq    x@GOTPCREL(%rip), %rax
+       .size   _start, .-_start
+.globl x
+       .data
+       .align 4
+       .type   x, @object
+       .size   x, 4
+x:
+       .long   2
diff --git a/ld/testsuite/ld-x86-64/discarded1.t b/ld/testsuite/ld-x86-64/discarded1.t
new file mode 100644 (file)
index 0000000..a4d617f
--- /dev/null
@@ -0,0 +1,7 @@
+ENTRY(_start)
+SECTIONS
+{
+  .text : {*(.text)}
+  .data : {*(.data)}
+  /DISCARD/ : {*(*)}
+}
index d7ca525..ed5d8dc 100644 (file)
@@ -99,6 +99,7 @@ run_dump_test "tlsle1"
 run_dump_test "tlspie1"
 run_dump_test "unique1"
 run_dump_test "nogot1"
+run_dump_test "discarded1"
 
 if { ![istarget "x86_64-*-linux*"] } {
     return