x86: Set GOT refcount to 1
Since x86 check_relocs is called after opening all inputs and garbage collection, they never see the removed sections. There is no need for incrementing GOT refcount. But since PLT refcount is also used in /* Don't create the PLT entry if there are only function pointer relocations which can be resolved at run-time. */ else if (htab->elf.dynamic_sections_created && (h->plt.refcount > eh->func_pointer_refcount || eh->plt_got.refcount > 0)) { we must increment it. * elf32-i386.c (elf_i386_check_relocs): Set GOT refcount to 1 instead of incrementing it. * elf64-x86-64.c (elf_x86_64_check_relocs): Likewise.
This commit is contained in:
parent
2f20e312aa
commit
0f09b4d8d8
@ -1,3 +1,9 @@
|
||||
2017-10-10 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
* elf32-i386.c (elf_i386_check_relocs): Set GOT refcount to 1
|
||||
instead of incrementing it.
|
||||
* elf64-x86-64.c (elf_x86_64_check_relocs): Likewise.
|
||||
|
||||
2017-10-10 Renlin Li <renlin.li@arm.com>
|
||||
|
||||
PR ld/21402
|
||||
|
@ -1603,7 +1603,7 @@ elf_i386_check_relocs (bfd *abfd,
|
||||
switch (r_type)
|
||||
{
|
||||
case R_386_TLS_LDM:
|
||||
htab->tls_ld_or_ldm_got.refcount += 1;
|
||||
htab->tls_ld_or_ldm_got.refcount = 1;
|
||||
goto create_got;
|
||||
|
||||
case R_386_PLT32:
|
||||
@ -1670,7 +1670,7 @@ elf_i386_check_relocs (bfd *abfd,
|
||||
|
||||
if (h != NULL)
|
||||
{
|
||||
h->got.refcount += 1;
|
||||
h->got.refcount = 1;
|
||||
old_tls_type = elf_x86_hash_entry (h)->tls_type;
|
||||
}
|
||||
else
|
||||
@ -1696,7 +1696,7 @@ elf_i386_check_relocs (bfd *abfd,
|
||||
elf_x86_local_got_tls_type (abfd)
|
||||
= (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
|
||||
}
|
||||
local_got_refcounts[r_symndx] += 1;
|
||||
local_got_refcounts[r_symndx] = 1;
|
||||
old_tls_type = elf_x86_local_got_tls_type (abfd) [r_symndx];
|
||||
}
|
||||
|
||||
|
@ -1950,7 +1950,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
switch (r_type)
|
||||
{
|
||||
case R_X86_64_TLSLD:
|
||||
htab->tls_ld_or_ldm_got.refcount += 1;
|
||||
htab->tls_ld_or_ldm_got.refcount = 1;
|
||||
goto create_got;
|
||||
|
||||
case R_X86_64_TPOFF32:
|
||||
@ -1992,7 +1992,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
|
||||
if (h != NULL)
|
||||
{
|
||||
h->got.refcount += 1;
|
||||
h->got.refcount = 1;
|
||||
old_tls_type = eh->tls_type;
|
||||
}
|
||||
else
|
||||
@ -2018,7 +2018,7 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
elf_x86_local_got_tls_type (abfd)
|
||||
= (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
|
||||
}
|
||||
local_got_refcounts[r_symndx] += 1;
|
||||
local_got_refcounts[r_symndx] = 1;
|
||||
old_tls_type
|
||||
= elf_x86_local_got_tls_type (abfd) [r_symndx];
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user