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 |