mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-21 01:12:32 +08:00
x86: Add elf_x86_allocate_local_got_info
Add elf_x86_allocate_local_got_info to allocate x86 GOT info for local symbols. * elf32-i386.c (elf_i386_check_relocs): Call elf_x86_allocate_local_got_info. * elf64-x86-64.c (elf_x86_64_check_relocs): Likewise. * elfxx-x86.h (elf_x86_allocate_local_got_info): New.
This commit is contained in:
parent
39fb369834
commit
bbdeb108d8
@ -1668,25 +1668,12 @@ elf_i386_check_relocs (bfd *abfd,
|
||||
{
|
||||
bfd_signed_vma *local_got_refcounts;
|
||||
|
||||
if (!elf_x86_allocate_local_got_info (abfd,
|
||||
symtab_hdr->sh_info))
|
||||
goto error_return;
|
||||
|
||||
/* This is a global offset table entry for a local symbol. */
|
||||
local_got_refcounts = elf_local_got_refcounts (abfd);
|
||||
if (local_got_refcounts == NULL)
|
||||
{
|
||||
bfd_size_type size;
|
||||
|
||||
size = symtab_hdr->sh_info;
|
||||
size *= (sizeof (bfd_signed_vma)
|
||||
+ sizeof (bfd_vma) + sizeof(char));
|
||||
local_got_refcounts = (bfd_signed_vma *)
|
||||
bfd_zalloc (abfd, size);
|
||||
if (local_got_refcounts == NULL)
|
||||
goto error_return;
|
||||
elf_local_got_refcounts (abfd) = local_got_refcounts;
|
||||
elf_x86_local_tlsdesc_gotent (abfd)
|
||||
= (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
|
||||
elf_x86_local_got_tls_type (abfd)
|
||||
= (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
|
||||
}
|
||||
local_got_refcounts[r_symndx] = 1;
|
||||
old_tls_type = elf_x86_local_got_tls_type (abfd) [r_symndx];
|
||||
}
|
||||
|
@ -2066,25 +2066,12 @@ elf_x86_64_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
||||
{
|
||||
bfd_signed_vma *local_got_refcounts;
|
||||
|
||||
if (!elf_x86_allocate_local_got_info (abfd,
|
||||
symtab_hdr->sh_info))
|
||||
goto error_return;
|
||||
|
||||
/* This is a global offset table entry for a local symbol. */
|
||||
local_got_refcounts = elf_local_got_refcounts (abfd);
|
||||
if (local_got_refcounts == NULL)
|
||||
{
|
||||
bfd_size_type size;
|
||||
|
||||
size = symtab_hdr->sh_info;
|
||||
size *= sizeof (bfd_signed_vma)
|
||||
+ sizeof (bfd_vma) + sizeof (char);
|
||||
local_got_refcounts = ((bfd_signed_vma *)
|
||||
bfd_zalloc (abfd, size));
|
||||
if (local_got_refcounts == NULL)
|
||||
goto error_return;
|
||||
elf_local_got_refcounts (abfd) = local_got_refcounts;
|
||||
elf_x86_local_tlsdesc_gotent (abfd)
|
||||
= (bfd_vma *) (local_got_refcounts + symtab_hdr->sh_info);
|
||||
elf_x86_local_got_tls_type (abfd)
|
||||
= (char *) (local_got_refcounts + 2 * symtab_hdr->sh_info);
|
||||
}
|
||||
local_got_refcounts[r_symndx] = 1;
|
||||
old_tls_type
|
||||
= elf_x86_local_got_tls_type (abfd) [r_symndx];
|
||||
|
@ -789,3 +789,25 @@ elf_x86_start_stop_gc_p (struct bfd_link_info *link_info,
|
||||
--gc-sections or -z start-stop-gc isn't used. */
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Allocate x86 GOT info for local symbols. */
|
||||
|
||||
static inline bool
|
||||
elf_x86_allocate_local_got_info (bfd *abfd, bfd_size_type count)
|
||||
{
|
||||
bfd_signed_vma *local_got_refcounts = elf_local_got_refcounts (abfd);
|
||||
if (local_got_refcounts == NULL)
|
||||
{
|
||||
bfd_size_type size = count * (sizeof (bfd_signed_vma)
|
||||
+ sizeof (bfd_vma) + sizeof(char));
|
||||
local_got_refcounts = (bfd_signed_vma *) bfd_zalloc (abfd, size);
|
||||
if (local_got_refcounts == NULL)
|
||||
return false;
|
||||
elf_local_got_refcounts (abfd) = local_got_refcounts;
|
||||
elf_x86_local_tlsdesc_gotent (abfd) =
|
||||
(bfd_vma *) (local_got_refcounts + count);
|
||||
elf_x86_local_got_tls_type (abfd) =
|
||||
(char *) (local_got_refcounts + 2 * count);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user