From: H.J. Lu Date: Tue, 6 Sep 2016 20:34:30 +0000 (-0700) Subject: Resolve size relocation with copy relocation X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d8457a04b71cbd642a00352dce0539fe1fe22dd4;p=binutils-gdb.git Resolve size relocation with copy relocation 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 56012b40868..6863e3afef7 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2016-09-06 H.J. Lu + + 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 PR ld/20545 diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index c8bbed8bc05..9a6a5c747db 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -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) diff --git a/ld/ChangeLog b/ld/ChangeLog index 85d7820bf3f..7d3e292a944 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,11 @@ +2016-09-06 H.J. Lu + + 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 * 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 index 00000000000..4430398817d --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr20550a.s @@ -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 index 00000000000..fbc482ab014 --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr20550b.s @@ -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 diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index c24eeeaf4ec..c84bdf12d8e 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -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,