| Index: bfd/elf64-hppa.c
|
| diff --git a/bfd/elf64-hppa.c b/bfd/elf64-hppa.c
|
| index 62efef3979dc2912a5669bb56464ace20d9b552e..c992563761db640470df3d8ce7f76ac4e46dc888 100644
|
| --- a/bfd/elf64-hppa.c
|
| +++ b/bfd/elf64-hppa.c
|
| @@ -1,6 +1,6 @@
|
| /* Support for HPPA 64-bit ELF
|
| - 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
|
| - 2010, 2011, 2012
|
| + Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
|
| + 2009, 2010, 2011, 2012
|
| Free Software Foundation, Inc.
|
|
|
| This file is part of BFD, the Binary File Descriptor library.
|
| @@ -194,9 +194,6 @@ static bfd_boolean elf64_hppa_finish_dynamic_symbol
|
| (bfd *, struct bfd_link_info *,
|
| struct elf_link_hash_entry *, Elf_Internal_Sym *);
|
|
|
| -static enum elf_reloc_type_class elf64_hppa_reloc_type_class
|
| - (const Elf_Internal_Rela *);
|
| -
|
| static bfd_boolean elf64_hppa_finish_dynamic_sections
|
| (bfd *, struct bfd_link_info *);
|
|
|
| @@ -299,7 +296,7 @@ elf64_hppa_hash_table_create (bfd *abfd)
|
| struct elf64_hppa_link_hash_table *htab;
|
| bfd_size_type amt = sizeof (*htab);
|
|
|
| - htab = bfd_zalloc (abfd, amt);
|
| + htab = bfd_zmalloc (amt);
|
| if (htab == NULL)
|
| return NULL;
|
|
|
| @@ -308,7 +305,7 @@ elf64_hppa_hash_table_create (bfd *abfd)
|
| sizeof (struct elf64_hppa_link_hash_entry),
|
| HPPA64_ELF_DATA))
|
| {
|
| - bfd_release (abfd, htab);
|
| + free (htab);
|
| return NULL;
|
| }
|
|
|
| @@ -476,7 +473,7 @@ hppa64_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)
|
| {
|
| @@ -647,6 +644,9 @@ elf64_hppa_check_relocs (bfd *abfd,
|
| || hh->eh.root.type == bfd_link_hash_warning)
|
| hh = hppa_elf_hash_entry (hh->eh.root.u.i.link);
|
|
|
| + /* PR15323, ref flags aren't set for references in the same
|
| + object. */
|
| + hh->eh.root.non_ir_ref = 1;
|
| hh->eh.ref_regular = 1;
|
| }
|
| else
|
| @@ -796,7 +796,7 @@ elf64_hppa_check_relocs (bfd *abfd,
|
| else
|
| {
|
| bfd_signed_vma *local_dlt_refcounts;
|
| -
|
| +
|
| /* This is a DLT entry for a local symbol. */
|
| local_dlt_refcounts = hppa64_elf_local_refcounts (abfd);
|
| if (local_dlt_refcounts == NULL)
|
| @@ -821,7 +821,7 @@ elf64_hppa_check_relocs (bfd *abfd,
|
| {
|
| bfd_signed_vma *local_dlt_refcounts;
|
| bfd_signed_vma *local_plt_refcounts;
|
| -
|
| +
|
| /* This is a PLT entry for a local symbol. */
|
| local_dlt_refcounts = hppa64_elf_local_refcounts (abfd);
|
| if (local_dlt_refcounts == NULL)
|
| @@ -855,7 +855,7 @@ elf64_hppa_check_relocs (bfd *abfd,
|
| {
|
| bfd_signed_vma *local_dlt_refcounts;
|
| bfd_signed_vma *local_opd_refcounts;
|
| -
|
| +
|
| /* This is a OPD for a local symbol. */
|
| local_dlt_refcounts = hppa64_elf_local_refcounts (abfd);
|
| if (local_dlt_refcounts == NULL)
|
| @@ -1132,7 +1132,7 @@ elf64_hppa_post_process_headers (bfd *abfd,
|
| Elf_Internal_Ehdr * i_ehdrp;
|
|
|
| i_ehdrp = elf_elfheader (abfd);
|
| -
|
| +
|
| i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
|
| i_ehdrp->e_ident[EI_ABIVERSION] = 1;
|
| }
|
| @@ -1639,7 +1639,7 @@ elf64_hppa_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
|
| {
|
| *local_dlt = sec->size;
|
| sec->size += DLT_ENTRY_SIZE;
|
| - if (info->shared)
|
| + if (info->shared)
|
| {
|
| srel->size += sizeof (Elf64_External_Rela);
|
| }
|
| @@ -2213,7 +2213,7 @@ elf64_hppa_finalize_opd (struct elf_link_hash_entry *eh, void *data)
|
|
|
| nh = elf_link_hash_lookup (elf_hash_table (info),
|
| new_name, TRUE, TRUE, FALSE);
|
| -
|
| +
|
| /* All we really want from the new symbol is its dynamic
|
| symbol index. */
|
| if (nh)
|
| @@ -2446,7 +2446,9 @@ elf64_hppa_finalize_dynreloc (struct elf_link_hash_entry *eh,
|
| dynamic linker, before writing them out. */
|
|
|
| static enum elf_reloc_type_class
|
| -elf64_hppa_reloc_type_class (const Elf_Internal_Rela *rela)
|
| +elf64_hppa_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
|
| + const asection *rel_sec ATTRIBUTE_UNUSED,
|
| + const Elf_Internal_Rela *rela)
|
| {
|
| if (ELF64_R_SYM (rela->r_info) == STN_UNDEF)
|
| return reloc_class_relative;
|
| @@ -2522,6 +2524,8 @@ elf64_hppa_finish_dynamic_sections (bfd *output_bfd,
|
| area at the start of the .data section. So all we have to
|
| to is find the start of the .data section. */
|
| s = bfd_get_section_by_name (output_bfd, ".data");
|
| + if (!s)
|
| + return FALSE;
|
| dyn.d_un.d_ptr = s->vma;
|
| bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
|
| break;
|
| @@ -2591,10 +2595,10 @@ elf64_hppa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
|
|
|
| case 760: /* Linux/hppa */
|
| /* pr_cursig */
|
| - elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
|
| + elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
|
|
|
| /* pr_pid */
|
| - elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 32);
|
| + elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
|
|
|
| /* pr_reg */
|
| offset = 112;
|
| @@ -2620,16 +2624,16 @@ elf64_hppa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
|
| return FALSE;
|
|
|
| case 136: /* Linux/hppa elf_prpsinfo. */
|
| - elf_tdata (abfd)->core_program
|
| + elf_tdata (abfd)->core->program
|
| = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
|
| - elf_tdata (abfd)->core_command
|
| + elf_tdata (abfd)->core->command
|
| = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
|
| }
|
|
|
| /* Note that for some reason, a spurious space is tacked
|
| onto the end of the args in some (at least one anyway)
|
| implementations, so strip it off if it exists. */
|
| - command = elf_tdata (abfd)->core_command;
|
| + command = elf_tdata (abfd)->core->command;
|
| n = strlen (command);
|
|
|
| if (0 < n && command[n - 1] == ' ')
|
| @@ -2687,7 +2691,7 @@ elf64_hppa_modify_segment_map (bfd *abfd,
|
| s = bfd_get_section_by_name (abfd, ".interp");
|
| if (! s)
|
| {
|
| - for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
|
| + for (m = elf_seg_map (abfd); m != NULL; m = m->next)
|
| if (m->p_type == PT_PHDR)
|
| break;
|
| if (m == NULL)
|
| @@ -2703,12 +2707,12 @@ elf64_hppa_modify_segment_map (bfd *abfd,
|
| m->p_paddr_valid = 1;
|
| m->includes_phdrs = 1;
|
|
|
| - m->next = elf_tdata (abfd)->segment_map;
|
| - elf_tdata (abfd)->segment_map = m;
|
| + m->next = elf_seg_map (abfd);
|
| + elf_seg_map (abfd) = m;
|
| }
|
| }
|
|
|
| - for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
|
| + for (m = elf_seg_map (abfd); m != NULL; m = m->next)
|
| if (m->p_type == PT_LOAD)
|
| {
|
| unsigned int i;
|
| @@ -2772,7 +2776,7 @@ elf64_hppa_section_from_phdr (bfd *abfd, Elf_Internal_Phdr *hdr, int sec_index,
|
| if (bfd_bread (&sig, 4, abfd) != 4)
|
| return FALSE;
|
|
|
| - elf_tdata (abfd)->core_signal = sig;
|
| + elf_tdata (abfd)->core->signal = sig;
|
|
|
| if (!_bfd_elf_make_section_from_phdr (abfd, hdr, sec_index, typename))
|
| return FALSE;
|
| @@ -3190,7 +3194,7 @@ elf_hppa_final_link_relocate (Elf_Internal_Rela *rel,
|
|
|
| if (hppa_info == NULL)
|
| return bfd_reloc_notsupported;
|
| -
|
| +
|
| symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
|
| local_offsets = elf_local_got_offsets (input_bfd);
|
| insn = bfd_get_32 (input_bfd, hit_data);
|
| @@ -3273,7 +3277,7 @@ elf_hppa_final_link_relocate (Elf_Internal_Rela *rel,
|
| && value + addend + max_branch_offset >= 2*max_branch_offset)
|
| {
|
| (*_bfd_error_handler)
|
| - (_("%B(%A+0x" BFD_VMA_FMT "x): cannot reach %s"),
|
| + (_("%B(%A+0x%" BFD_VMA_FMT "x): cannot reach %s"),
|
| input_bfd,
|
| input_section,
|
| offset,
|
| @@ -3859,14 +3863,14 @@ elf64_hppa_relocate_section (bfd *output_bfd,
|
| /* This is not a local symbol. */
|
| struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
|
|
|
| - /* It seems this can happen with erroneous or unsupported
|
| + /* It seems this can happen with erroneous or unsupported
|
| input (mixing a.out and elf in an archive, for example.) */
|
| if (sym_hashes == NULL)
|
| return FALSE;
|
|
|
| eh = sym_hashes[r_symndx - symtab_hdr->sh_info];
|
|
|
| - while (eh->root.type == bfd_link_hash_indirect
|
| + while (eh->root.type == bfd_link_hash_indirect
|
| || eh->root.type == bfd_link_hash_warning)
|
| eh = (struct elf_link_hash_entry *) eh->root.u.i.link;
|
|
|
| @@ -4057,7 +4061,7 @@ const struct elf_size_info hppa64_elf_size_info =
|
| elf64_hppa_finish_dynamic_sections
|
| #define elf_backend_grok_prstatus elf64_hppa_grok_prstatus
|
| #define elf_backend_grok_psinfo elf64_hppa_grok_psinfo
|
| -
|
| +
|
| /* Stuff for the BFD linker: */
|
| #define bfd_elf64_bfd_link_hash_table_create \
|
| elf64_hppa_hash_table_create
|
|
|