From 9d1d54d5a7e3b634895e6e434646c706eb55c082 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sun, 11 Jan 2015 08:04:27 -0800 Subject: [PATCH] Only discard space for pc-relative relocs symbols When building PIE, we should only discard space for pc-relative relocs symbols which turn out to need copy relocs. bfd/ PR ld/17827 * elf64-x86-64.c (elf_x86_64_allocate_dynrelocs): For PIE, only discard space for pc-relative relocs symbols which turn out to need copy relocs. ld/testsuite/ PR ld/17827 * ld-x86-64/pr17689.out: Updated. * ld-x86-64/pr17689b.S: Likewise. * ld-x86-64/pr17827.rd: New file. * ld-x86-64/x86-64.exp: Run PR ld/17827 test. --- bfd/ChangeLog | 7 +++++++ bfd/elf64-x86-64.c | 16 +++++++++++++--- ld/testsuite/ChangeLog | 10 ++++++++++ ld/testsuite/ld-x86-64/pr17689.out | 1 + ld/testsuite/ld-x86-64/pr17689b.S | 10 ++++++++++ ld/testsuite/ld-x86-64/pr17827.rd | 4 ++++ ld/testsuite/ld-x86-64/x86-64.exp | 8 ++++++++ 7 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 ld/testsuite/ld-x86-64/pr17827.rd diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 70b138b2d0..234d559c1e 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2015-01-11 H.J. Lu + + PR ld/17827 + * elf64-x86-64.c (elf_x86_64_allocate_dynrelocs): For PIE, + only discard space for pc-relative relocs symbols which turn + out to need copy relocs. + 2015-01-09 Nick Clifton * tekhex.c (getvalue): Fix thinko in test for correct extraction diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 581ee17177..6b7d3c9a56 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -2742,13 +2742,23 @@ elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf) && ! bfd_elf_link_record_dynamic_symbol (info, h)) return FALSE; } - /* For PIE, discard space for relocs against symbols which - turn out to need copy relocs. */ + /* For PIE, discard space for pc-relative relocs against + symbols which turn out to need copy relocs. */ else if (info->executable && (h->needs_copy || eh->needs_copy) && h->def_dynamic && !h->def_regular) - eh->dyn_relocs = NULL; + { + struct elf_dyn_relocs **pp; + + for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) + { + if (p->pc_count != 0) + *pp = p->next; + else + pp = &p->next; + } + } } } else if (ELIMINATE_COPY_RELOCS) diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 229e006fc6..e6903f7f21 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2015-01-11 H.J. Lu + + PR ld/17827 + * ld-x86-64/pr17689.out: Updated. + * ld-x86-64/pr17689b.S: Likewise. + + * ld-x86-64/pr17827.rd: New file. + + * ld-x86-64/x86-64.exp: Run PR ld/17827 test. + 2015-01-08 Jan Beulich * ld-x86-64/pr14207.d: Adjust expecations to cover the diff --git a/ld/testsuite/ld-x86-64/pr17689.out b/ld/testsuite/ld-x86-64/pr17689.out index 7ef22e9a43..38e0352515 100644 --- a/ld/testsuite/ld-x86-64/pr17689.out +++ b/ld/testsuite/ld-x86-64/pr17689.out @@ -1 +1,2 @@ PASS +PASS diff --git a/ld/testsuite/ld-x86-64/pr17689b.S b/ld/testsuite/ld-x86-64/pr17689b.S index c95f891057..64485c7e91 100644 --- a/ld/testsuite/ld-x86-64/pr17689b.S +++ b/ld/testsuite/ld-x86-64/pr17689b.S @@ -5,8 +5,18 @@ main: subq $8, %rsp movq bar_alias(%rip), %rdi call foo@PLT + movq ptr(%rip), %rax + movq (%rax), %rdi + call foo@PLT xorl %eax, %eax addq $8, %rsp ret .size main, .-main + .globl ptr + .section .data.rel,"aw",@progbits + .align 8 + .type ptr, @object + .size ptr, 8 +ptr: + .quad bar_alias .section .note.GNU-stack,"",@progbits diff --git a/ld/testsuite/ld-x86-64/pr17827.rd b/ld/testsuite/ld-x86-64/pr17827.rd new file mode 100644 index 0000000000..d78ea2f7cc --- /dev/null +++ b/ld/testsuite/ld-x86-64/pr17827.rd @@ -0,0 +1,4 @@ +#failif +#... +[0-9a-f ]+R_X86_64_NONE.* +#... diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index aa8555ff3e..5b49bffe66 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -432,6 +432,14 @@ if { [isnative] && [which $CC] != 0 } { {{readelf {-Wr} pr17689.rd}} \ "pr17689" \ ] \ + [list \ + "Build pr17827 with PIE without -fPIE" \ + "tmpdir/pr17689.so -pie" \ + "" \ + { pr17689b.S } \ + {{readelf {-Wr} pr17827.rd}} \ + "pr17827" \ + ] \ ] run_ld_link_exec_tests [] [list \ -- 2.34.1