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.
This commit is contained in:
H.J. Lu 2015-01-11 08:04:27 -08:00
parent b2fb95e006
commit 9d1d54d5a7
7 changed files with 53 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2015-01-11 H.J. Lu <hongjiu.lu@intel.com>
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 <nickc@redhat.com> 2015-01-09 Nick Clifton <nickc@redhat.com>
* tekhex.c (getvalue): Fix thinko in test for correct extraction * tekhex.c (getvalue): Fix thinko in test for correct extraction

View File

@ -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)) && ! bfd_elf_link_record_dynamic_symbol (info, h))
return FALSE; return FALSE;
} }
/* For PIE, discard space for relocs against symbols which /* For PIE, discard space for pc-relative relocs against
turn out to need copy relocs. */ symbols which turn out to need copy relocs. */
else if (info->executable else if (info->executable
&& (h->needs_copy || eh->needs_copy) && (h->needs_copy || eh->needs_copy)
&& h->def_dynamic && h->def_dynamic
&& !h->def_regular) && !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) else if (ELIMINATE_COPY_RELOCS)

View File

@ -1,3 +1,13 @@
2015-01-11 H.J. Lu <hongjiu.lu@intel.com>
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 <jbeulich@suse.com> 2015-01-08 Jan Beulich <jbeulich@suse.com>
* ld-x86-64/pr14207.d: Adjust expecations to cover the * ld-x86-64/pr14207.d: Adjust expecations to cover the

View File

@ -1 +1,2 @@
PASS PASS
PASS

View File

@ -5,8 +5,18 @@ main:
subq $8, %rsp subq $8, %rsp
movq bar_alias(%rip), %rdi movq bar_alias(%rip), %rdi
call foo@PLT call foo@PLT
movq ptr(%rip), %rax
movq (%rax), %rdi
call foo@PLT
xorl %eax, %eax xorl %eax, %eax
addq $8, %rsp addq $8, %rsp
ret ret
.size main, .-main .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 .section .note.GNU-stack,"",@progbits

View File

@ -0,0 +1,4 @@
#failif
#...
[0-9a-f ]+R_X86_64_NONE.*
#...

View File

@ -432,6 +432,14 @@ if { [isnative] && [which $CC] != 0 } {
{{readelf {-Wr} pr17689.rd}} \ {{readelf {-Wr} pr17689.rd}} \
"pr17689" \ "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 \ run_ld_link_exec_tests [] [list \