| Index: bfd/elf32-hppa.c
|
| diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c
|
| index dc3053ce0700410912d6b97e9c1d5a87ddf9df21..df25ac903c870982222160314cbe5c7c8d9ce9b7 100644
|
| --- a/bfd/elf32-hppa.c
|
| +++ b/bfd/elf32-hppa.c
|
| @@ -1,7 +1,5 @@
|
| /* BFD back-end for HP PA-RISC ELF files.
|
| - Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2001,
|
| - 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
| - Free Software Foundation, Inc.
|
| + Copyright 1990-2013 Free Software Foundation, Inc.
|
|
|
| Original code by
|
| Center for Software Science
|
| @@ -10,7 +8,7 @@
|
| Largely rewritten by Alan Modra <alan@linuxcare.com.au>
|
| Naming cleanup by Carlos O'Donell <carlos@systemhalted.org>
|
| TLS support written by Randolph Chung <tausq@debian.org>
|
| -
|
| +
|
| This file is part of BFD, the Binary File Descriptor library.
|
|
|
| This program is free software; you can redistribute it and/or modify
|
| @@ -124,20 +122,20 @@
|
| Structure/Variable Prefix
|
| elf_link_hash_table "etab"
|
| elf_link_hash_entry "eh"
|
| -
|
| +
|
| elf32_hppa_link_hash_table "htab"
|
| elf32_hppa_link_hash_entry "hh"
|
|
|
| bfd_hash_table "btab"
|
| bfd_hash_entry "bh"
|
| -
|
| +
|
| bfd_hash_table containing stubs "bstab"
|
| elf32_hppa_stub_hash_entry "hsh"
|
|
|
| elf32_hppa_dyn_reloc_entry "hdh"
|
| -
|
| +
|
| Always remember to use GNU Coding Style. */
|
| -
|
| +
|
| #define PLT_ENTRY_SIZE 8
|
| #define GOT_ENTRY_SIZE 4
|
| #define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1"
|
| @@ -419,7 +417,7 @@ elf32_hppa_link_hash_table_create (bfd *abfd)
|
| struct elf32_hppa_link_hash_table *htab;
|
| bfd_size_type amt = sizeof (*htab);
|
|
|
| - htab = bfd_malloc (amt);
|
| + htab = bfd_zmalloc (amt);
|
| if (htab == NULL)
|
| return NULL;
|
|
|
| @@ -436,26 +434,8 @@ elf32_hppa_link_hash_table_create (bfd *abfd)
|
| sizeof (struct elf32_hppa_stub_hash_entry)))
|
| return NULL;
|
|
|
| - htab->stub_bfd = NULL;
|
| - htab->add_stub_section = NULL;
|
| - htab->layout_sections_again = NULL;
|
| - htab->stub_group = NULL;
|
| - htab->sgot = NULL;
|
| - htab->srelgot = NULL;
|
| - htab->splt = NULL;
|
| - htab->srelplt = NULL;
|
| - htab->sdynbss = NULL;
|
| - htab->srelbss = NULL;
|
| htab->text_segment_base = (bfd_vma) -1;
|
| htab->data_segment_base = (bfd_vma) -1;
|
| - htab->multi_subspace = 0;
|
| - htab->has_12bit_branch = 0;
|
| - htab->has_17bit_branch = 0;
|
| - htab->has_22bit_branch = 0;
|
| - htab->need_plt_stub = 0;
|
| - htab->sym_cache.abfd = NULL;
|
| - htab->tls_ldm_got.refcount = 0;
|
| -
|
| return &htab->etab.root;
|
| }
|
|
|
| @@ -468,7 +448,7 @@ elf32_hppa_link_hash_table_free (struct bfd_link_hash_table *btab)
|
| = (struct elf32_hppa_link_hash_table *) btab;
|
|
|
| bfd_hash_table_free (&htab->bstab);
|
| - _bfd_generic_link_hash_table_free (btab);
|
| + _bfd_elf_link_hash_table_free (btab);
|
| }
|
|
|
| /* Build a name for an entry in the stub hash table. */
|
| @@ -1110,7 +1090,7 @@ 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)
|
| {
|
| @@ -1187,6 +1167,10 @@ elf32_hppa_check_relocs (bfd *abfd,
|
| while (hh->eh.root.type == bfd_link_hash_indirect
|
| || 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;
|
| }
|
|
|
| r_type = ELF32_R_TYPE (rela->r_info);
|
| @@ -1378,7 +1362,7 @@ elf32_hppa_check_relocs (bfd *abfd,
|
| else
|
| {
|
| bfd_signed_vma *local_got_refcounts;
|
| -
|
| +
|
| /* This is a global offset table entry for a local symbol. */
|
| local_got_refcounts = hppa32_elf_local_refcounts (abfd);
|
| if (local_got_refcounts == NULL)
|
| @@ -1724,10 +1708,10 @@ elf32_hppa_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
|
|
|
| case 396: /* 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 + 24);
|
| + elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
|
|
|
| /* pr_reg */
|
| offset = 72;
|
| @@ -1750,9 +1734,9 @@ elf32_hppa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
|
| return FALSE;
|
|
|
| case 124: /* Linux/hppa elf_prpsinfo. */
|
| - elf_tdata (abfd)->core_program
|
| + elf_tdata (abfd)->core->program
|
| = _bfd_elfcore_strndup (abfd, note->descdata + 28, 16);
|
| - elf_tdata (abfd)->core_command
|
| + elf_tdata (abfd)->core->command
|
| = _bfd_elfcore_strndup (abfd, note->descdata + 44, 80);
|
| }
|
|
|
| @@ -1760,7 +1744,7 @@ elf32_hppa_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
|
| onto the end of the args in some (at least one anyway)
|
| implementations, so strip it off if it exists. */
|
| {
|
| - char *command = elf_tdata (abfd)->core_command;
|
| + char *command = elf_tdata (abfd)->core->command;
|
| int n = strlen (command);
|
|
|
| if (0 < n && command[n - 1] == ' ')
|
| @@ -1787,6 +1771,10 @@ elf32_hppa_hide_symbol (struct bfd_link_info *info,
|
| _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
|
| eh->dynstr_index);
|
| }
|
| +
|
| + /* PR 16082: Remove version information from hidden symbol. */
|
| + eh->verinfo.verdef = NULL;
|
| + eh->verinfo.vertree = NULL;
|
| }
|
|
|
| /* STT_GNU_IFUNC symbol must go through PLT. */
|
| @@ -1965,7 +1953,7 @@ allocate_plt_static (struct elf_link_hash_entry *eh, void *inf)
|
| means that the plt entry is only used by a plabel.
|
| We'll be using a normal plt entry for this symbol, so
|
| clear the plabel indicator. */
|
| -
|
| +
|
| hh->plabel = 0;
|
| }
|
| else if (hh->plabel)
|
| @@ -2013,7 +2001,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
|
| return FALSE;
|
|
|
| hh = hppa_elf_hash_entry (eh);
|
| -
|
| +
|
| if (htab->etab.dynamic_sections_created
|
| && eh->plt.offset != (bfd_vma) -1
|
| && !hh->plabel
|
| @@ -2114,7 +2102,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf)
|
| /* For the non-shared case, discard space for relocs against
|
| symbols which turn out to need copy relocs or are not
|
| dynamic. */
|
| -
|
| +
|
| if (!eh->non_got_ref
|
| && ((ELIMINATE_COPY_RELOCS
|
| && eh->def_dynamic
|
| @@ -2301,7 +2289,7 @@ elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
| sec->size += 2 * GOT_ENTRY_SIZE;
|
| else if ((*local_tls_type & GOT_TLS_GD) == GOT_TLS_GD)
|
| sec->size += GOT_ENTRY_SIZE;
|
| - if (info->shared)
|
| + if (info->shared)
|
| {
|
| srel->size += sizeof (Elf32_External_Rela);
|
| if ((*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE))
|
| @@ -2342,10 +2330,10 @@ elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
| }
|
| }
|
| }
|
| -
|
| +
|
| if (htab->tls_ldm_got.refcount > 0)
|
| {
|
| - /* Allocate 2 got entries and 1 dynamic reloc for
|
| + /* Allocate 2 got entries and 1 dynamic reloc for
|
| R_PARISC_TLS_DTPMOD32 relocs. */
|
| htab->tls_ldm_got.offset = htab->sgot->size;
|
| htab->sgot->size += (GOT_ENTRY_SIZE * 2);
|
| @@ -2384,7 +2372,7 @@ elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
|
| bfd_size_type mask;
|
|
|
| if (gotalign > pltalign)
|
| - bfd_set_section_alignment (dynobj, sec, gotalign);
|
| + (void) bfd_set_section_alignment (dynobj, sec, gotalign);
|
| mask = ((bfd_size_type) 1 << gotalign) - 1;
|
| sec->size = (sec->size + sizeof (plt_stub) + mask) & ~mask;
|
| }
|
| @@ -3220,7 +3208,7 @@ elf32_hppa_build_stubs (struct bfd_link_info *info)
|
| }
|
|
|
| /* Return the base vma address which should be subtracted from the real
|
| - address when resolving a dtpoff relocation.
|
| + address when resolving a dtpoff relocation.
|
| This is PT_TLS segment p_vaddr. */
|
|
|
| static bfd_vma
|
| @@ -3242,9 +3230,9 @@ tpoff (struct bfd_link_info *info, bfd_vma address)
|
| /* If tls_sec is NULL, we should have signalled an error already. */
|
| if (htab->tls_sec == NULL)
|
| return 0;
|
| - /* hppa TLS ABI is variant I and static TLS block start just after
|
| + /* hppa TLS ABI is variant I and static TLS block start just after
|
| tcbhead structure which has 2 pointer fields. */
|
| - return (address - htab->tls_sec->vma
|
| + return (address - htab->tls_sec->vma
|
| + align_power ((bfd_vma) 8, htab->tls_sec->alignment_power));
|
| }
|
|
|
| @@ -3323,7 +3311,7 @@ final_link_relocate (asection *input_section,
|
| bfd_signed_vma addend = rela->r_addend;
|
| bfd_vma location;
|
| struct elf32_hppa_stub_hash_entry *hsh = NULL;
|
| - int val;
|
| + int val;
|
|
|
| if (r_type == R_PARISC_NONE)
|
| return bfd_reloc_ok;
|
| @@ -3706,13 +3694,14 @@ elf32_hppa_relocate_section (bfd *output_bfd,
|
| else
|
| {
|
| struct elf_link_hash_entry *eh;
|
| - bfd_boolean unresolved_reloc;
|
| + bfd_boolean unresolved_reloc, ignored;
|
| struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
|
|
|
| RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rela,
|
| r_symndx, symtab_hdr, sym_hashes,
|
| eh, sym_sec, relocation,
|
| - unresolved_reloc, warned_undef);
|
| + unresolved_reloc, warned_undef,
|
| + ignored);
|
|
|
| if (!info->relocatable
|
| && relocation == 0
|
| @@ -4002,7 +3991,7 @@ elf32_hppa_relocate_section (bfd *output_bfd,
|
| || outrel.r_offset == (bfd_vma) -2);
|
| outrel.r_offset += (input_section->output_offset
|
| + input_section->output_section->vma);
|
| -
|
| +
|
| if (skip)
|
| {
|
| memset (&outrel, 0, sizeof (outrel));
|
| @@ -4064,12 +4053,12 @@ elf32_hppa_relocate_section (bfd *output_bfd,
|
| bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
|
| }
|
| break;
|
| -
|
| +
|
| case R_PARISC_TLS_LDM21L:
|
| case R_PARISC_TLS_LDM14R:
|
| {
|
| bfd_vma off;
|
| -
|
| +
|
| off = htab->tls_ldm_got.offset;
|
| if (off & 1)
|
| off &= ~1;
|
| @@ -4078,12 +4067,12 @@ elf32_hppa_relocate_section (bfd *output_bfd,
|
| Elf_Internal_Rela outrel;
|
| bfd_byte *loc;
|
|
|
| - outrel.r_offset = (off
|
| + outrel.r_offset = (off
|
| + htab->sgot->output_section->vma
|
| + htab->sgot->output_offset);
|
| outrel.r_addend = 0;
|
| outrel.r_info = ELF32_R_INFO (0, R_PARISC_TLS_DTPMOD32);
|
| - loc = htab->srelgot->contents;
|
| + loc = htab->srelgot->contents;
|
| loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rela);
|
|
|
| bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
|
| @@ -4155,7 +4144,7 @@ elf32_hppa_relocate_section (bfd *output_bfd,
|
| || hh->eh.root.type != bfd_link_hash_undefweak))
|
| {
|
| need_relocs = TRUE;
|
| - loc = htab->srelgot->contents;
|
| + loc = htab->srelgot->contents;
|
| /* FIXME (CAO): Should this be reloc_count++ ? */
|
| loc += htab->srelgot->reloc_count * sizeof (Elf32_External_Rela);
|
| }
|
| @@ -4442,9 +4431,7 @@ elf32_hppa_finish_dynamic_symbol (bfd *output_bfd,
|
| }
|
|
|
| /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */
|
| - if (eh_name (eh)[0] == '_'
|
| - && (strcmp (eh_name (eh), "_DYNAMIC") == 0
|
| - || eh == htab->etab.hgot))
|
| + if (eh == htab->etab.hdynamic || eh == htab->etab.hgot)
|
| {
|
| sym->st_shndx = SHN_ABS;
|
| }
|
| @@ -4456,7 +4443,9 @@ elf32_hppa_finish_dynamic_symbol (bfd *output_bfd,
|
| dynamic linker, before writing them out. */
|
|
|
| static enum elf_reloc_type_class
|
| -elf32_hppa_reloc_type_class (const Elf_Internal_Rela *rela)
|
| +elf32_hppa_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
|
| + const asection *rel_sec ATTRIBUTE_UNUSED,
|
| + const Elf_Internal_Rela *rela)
|
| {
|
| /* Handle TLS relocs first; we don't want them to be marked
|
| relative by the "if (ELF32_R_SYM (rela->r_info) == STN_UNDEF)"
|
|
|