Set reloc_count to 0 for reloc sections
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 13 Apr 2012 23:20:00 +0000 (23:20 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 13 Apr 2012 23:20:00 +0000 (23:20 +0000)
bfd/

2012-04-13  Alan Modra  <amodra@gmail.com>

PR ld/13947
* elflink.c (bfd_elf_final_link): Set reloc_count to 0 for
reloc sections.

ld/testsuite/

2012-04-13  H.J. Lu  <hongjiu.lu@intel.com>

PR ld/13947
* ld-x86-64/x86-64.exp: Run pr13947.
* ld-x86-64/pr13947.d: New file.
* ld-x86-64/pr13947.s: Likewise.

bfd/ChangeLog
bfd/elflink.c
ld/testsuite/ChangeLog
ld/testsuite/ld-x86-64/pr13947.d [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr13947.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp

index 6eea52d..ab5fd6f 100644 (file)
@@ -1,3 +1,9 @@
+2012-04-13  Alan Modra  <amodra@gmail.com>
+
+       PR ld/13947
+       * elflink.c (bfd_elf_final_link): Set reloc_count to 0 for
+       reloc sections.
+
 2012-04-12  David S. Miller  <davem@davemloft.net>
 
        * reloc.c (BFD_RELOC_SPARC_H34, BFD_RELOC_SPARC_SIZE32,
index 0ed5208..aa02e25 100644 (file)
@@ -10396,7 +10396,13 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
              if (sec->flags & SEC_MERGE)
                merged = TRUE;
 
-             if (info->relocatable || info->emitrelocations)
+             if (esdo->this_hdr.sh_type == SHT_REL
+                 || esdo->this_hdr.sh_type == SHT_RELA)
+               /* Some backends use reloc_count in relocation sections
+                  to count particular types of relocs.  Of course,
+                  reloc sections themselves can't have relocations.  */
+               reloc_count = 0;
+             else if (info->relocatable || info->emitrelocations)
                reloc_count = sec->reloc_count;
              else if (bed->elf_backend_count_relocs)
                reloc_count = (*bed->elf_backend_count_relocs) (info, sec);
index 4064c84..669014d 100644 (file)
@@ -1,3 +1,10 @@
+2012-04-13  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/13947
+       * ld-x86-64/x86-64.exp: Run pr13947.
+       * ld-x86-64/pr13947.d: New file.
+       * ld-x86-64/pr13947.s: Likewise.
+
 2012-04-13  Roland McGrath  <mcgrathr@google.com>
 
        * ld-arm/arm-elf.exp (armelftests_common): Move cases using
diff --git a/ld/testsuite/ld-x86-64/pr13947.d b/ld/testsuite/ld-x86-64/pr13947.d
new file mode 100644 (file)
index 0000000..c8af34d
--- /dev/null
@@ -0,0 +1,7 @@
+#ld: -shared --emit-relocs
+#readelf: -S --wide
+
+#failif
+#...
+ +\[ [0-9]\] .rela.rela.plt +RELA +[0-9a-f]+ +[0-9a-f]+ 0+ +.*
+#...
diff --git a/ld/testsuite/ld-x86-64/pr13947.s b/ld/testsuite/ld-x86-64/pr13947.s
new file mode 100644 (file)
index 0000000..71928cb
--- /dev/null
@@ -0,0 +1,5 @@
+       .text
+       .globl foo
+       .type foo, @function
+foo:
+       call bar@PLT
index 963e8e7..27174d5 100644 (file)
@@ -205,6 +205,7 @@ run_dump_test "nogot2"
 run_dump_test "discarded1"
 run_dump_test "pr12718"
 run_dump_test "pr12921"
+run_dump_test "pr13947"
 
 if { ![istarget "x86_64-*-linux*"] && ![istarget "x86_64-*-nacl*"]} {
     return