Resolve size relocation with copy relocation
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 6 Sep 2016 20:34:30 +0000 (13:34 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 6 Sep 2016 20:34:44 +0000 (13:34 -0700)
We can resolve size relocation against symbol which needs copy relocation
when building executable.

bfd/

PR ld/20550
* elf64-x86-64.c (elf_x86_64_relocate_section): Resolve size
relocation with copy relocation when building executable.

ld/

PR ld/20550
* testsuite/ld-x86-64/pr20550a.s: New file.
* testsuite/ld-x86-64/pr20550b.s: Likewise.
* testsuite/ld-x86-64/x86-64.exp (x86_64tests): Add tests for
PR ld/20550.

bfd/ChangeLog
bfd/elf64-x86-64.c
ld/ChangeLog
ld/testsuite/ld-x86-64/pr20550a.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/pr20550b.s [new file with mode: 0644]
ld/testsuite/ld-x86-64/x86-64.exp

index 56012b4..6863e3a 100644 (file)
@@ -1,3 +1,9 @@
+2016-09-06  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/20550
+       * elf64-x86-64.c (elf_x86_64_relocate_section): Resolve size
+       relocation with copy relocation when building executable.
+
 2016-09-02  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
 
        PR ld/20545
index c8bbed8..9a6a5c7 100644 (file)
@@ -4818,7 +4818,9 @@ direct:
                    && (h->needs_copy
                        || eh->needs_copy
                        || h->root.type == bfd_link_hash_undefined)
-                   && IS_X86_64_PCREL_TYPE (r_type))
+                   && (IS_X86_64_PCREL_TYPE (r_type)
+                       || r_type == R_X86_64_SIZE32
+                       || r_type == R_X86_64_SIZE64))
               && (h == NULL
                   || ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
                        && !resolved_to_zero)
index 85d7820..7d3e292 100644 (file)
@@ -1,3 +1,11 @@
+2016-09-06  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR ld/20550
+       * testsuite/ld-x86-64/pr20550a.s: New file.
+       * testsuite/ld-x86-64/pr20550b.s: Likewise.
+       * testsuite/ld-x86-64/x86-64.exp (x86_64tests): Add tests for
+       PR ld/20550.
+
 2016-09-06  Nick Clifton  <nickc@redhat.com>
 
        * Makefile.am (CFLAGS_FOR_TARGET): Define as a copy of CFLAGS but
diff --git a/ld/testsuite/ld-x86-64/pr20550a.s b/ld/testsuite/ld-x86-64/pr20550a.s
new file mode 100644 (file)
index 0000000..4430398
--- /dev/null
@@ -0,0 +1,6 @@
+       .text
+       .global _start
+_start:
+       movabsq $strings@SIZE, %rdx
+       .section        .data.rel,"aw",@progbits
+       .quad   strings
diff --git a/ld/testsuite/ld-x86-64/pr20550b.s b/ld/testsuite/ld-x86-64/pr20550b.s
new file mode 100644 (file)
index 0000000..fbc482a
--- /dev/null
@@ -0,0 +1,10 @@
+       .globl  strings
+       .section        .rodata
+.LC0:
+       .string "test"
+       .section        .data.rel.local,"aw",@progbits
+       .align 8
+       .type   strings, @object
+       .size   strings, 8
+strings:
+       .quad   .LC0
index c24eeea..c84bdf1 100644 (file)
@@ -207,6 +207,12 @@ set x86_64tests {
      "--64" { pr19827a.S }  {{readelf {-rW} pr19827.rd}} "pr19827.so"}
     {"Build pr19969.so" "-melf_x86_64 -shared" ""
      "--64" { pr19969a.S } {} "pr19969.so"}
+    {"Build pr20550a.o" "" ""
+     "--64" { pr20550a.s }}
+    {"Build pr20550b.so" "-melf_x86_64 -shared" ""
+     "--64" { pr20550b.s } {} "pr20550b.so"}
+    {"Build pr20550" "-melf_x86_64 -pie tmpdir/pr20550a.o tmpdir/pr20550b.so" ""
+     "--64" { dummy.s } {} "pr20550"}
 }
 
 # So as to avoid rewriting every last test case here in a nacl variant,