diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 34bd05ee92..d3ec7a9614 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,8 @@ 2009-03-01 John David Anglin + * elf32-hppa.c (hppa32_elf_local_refcounts): New function. + (elf32_hppa_check_relocs): Use it. + * elf_hppa_add_symbol_hook (elf_hppa_add_symbol_hook): Move to elf64-hppa.c. (elf_hppa_unmark_useless_dynamic_symbols): Likewise. diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c index 077f3efa7d..e16344dd22 100644 --- a/bfd/elf32-hppa.c +++ b/bfd/elf32-hppa.c @@ -1113,6 +1113,38 @@ elf32_hppa_optimized_tls_reloc (struct bfd_link_info *info ATTRIBUTE_UNUSED, return r_type; } +/* Return a pointer to the local GOT, PLT and TLS reference counts + for ABFD. Returns NULL if the storage allocation fails. */ + +static bfd_signed_vma * +hppa32_elf_local_refcounts (bfd *abfd) +{ + Elf_Internal_Shdr *symtab_hdr = &elf_tdata (abfd)->symtab_hdr; + bfd_signed_vma *local_refcounts; + + local_refcounts = elf_local_got_refcounts (abfd); + if (local_refcounts == NULL) + { + bfd_size_type size; + + /* Allocate space for local GOT and PLT reference + counts. Done this way to save polluting elf_obj_tdata + with another target specific pointer. */ + size = symtab_hdr->sh_info; + size *= 2 * sizeof (bfd_signed_vma); + /* Add in space to store the local GOT TLS types. */ + size += symtab_hdr->sh_info; + local_refcounts = bfd_zalloc (abfd, size); + if (local_refcounts == NULL) + return NULL; + elf_local_got_refcounts (abfd) = local_refcounts; + memset (hppa_elf_local_got_tls_type (abfd), GOT_UNKNOWN, + symtab_hdr->sh_info); + } + return local_refcounts; +} + + /* Look through the relocs for a section during the first phase, and calculate needed space in the global offset table, procedure linkage table, and dynamic reloc sections. At this point we haven't @@ -1359,26 +1391,9 @@ elf32_hppa_check_relocs (bfd *abfd, bfd_signed_vma *local_got_refcounts; /* This is a global offset table entry for a local symbol. */ - local_got_refcounts = elf_local_got_refcounts (abfd); + local_got_refcounts = hppa32_elf_local_refcounts (abfd); if (local_got_refcounts == NULL) - { - bfd_size_type size; - - /* Allocate space for local got offsets and local - plt offsets. Done this way to save polluting - elf_obj_tdata with another target specific - pointer. */ - size = symtab_hdr->sh_info; - size *= 2 * sizeof (bfd_signed_vma); - /* Add in space to store the local GOT TLS types. */ - size += symtab_hdr->sh_info; - local_got_refcounts = bfd_zalloc (abfd, size); - if (local_got_refcounts == NULL) - return FALSE; - elf_local_got_refcounts (abfd) = local_got_refcounts; - memset (hppa_elf_local_got_tls_type (abfd), - GOT_UNKNOWN, symtab_hdr->sh_info); - } + return FALSE; local_got_refcounts[r_symndx] += 1; old_tls_type = hppa_elf_local_got_tls_type (abfd) [r_symndx]; @@ -1425,22 +1440,9 @@ elf32_hppa_check_relocs (bfd *abfd, bfd_signed_vma *local_got_refcounts; bfd_signed_vma *local_plt_refcounts; - local_got_refcounts = elf_local_got_refcounts (abfd); + local_got_refcounts = hppa32_elf_local_refcounts (abfd); if (local_got_refcounts == NULL) - { - bfd_size_type size; - - /* Allocate space for local got offsets and local - plt offsets. */ - size = symtab_hdr->sh_info; - size *= 2 * sizeof (bfd_signed_vma); - /* Add in space to store the local GOT TLS types. */ - size += symtab_hdr->sh_info; - local_got_refcounts = bfd_zalloc (abfd, size); - if (local_got_refcounts == NULL) - return FALSE; - elf_local_got_refcounts (abfd) = local_got_refcounts; - } + return FALSE; local_plt_refcounts = (local_got_refcounts + symtab_hdr->sh_info); local_plt_refcounts[r_symndx] += 1;