X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=bfd%2Felf32-hppa.c;h=1deebf4f038ee595757be714e2429331620300a2;hb=ffc2605c41d026cf5710704848b7c3b1cdbdcf49;hp=95d79552f78610f6f7623635deddd3224a98baaa;hpb=4b95cf5c0c75d6efc1b2f96af72317aecca079f1;p=binutils-gdb.git diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c index 95d79552f78..1deebf4f038 100644 --- a/bfd/elf32-hppa.c +++ b/bfd/elf32-hppa.c @@ -1,5 +1,5 @@ /* BFD back-end for HP PA-RISC ELF files. - Copyright (C) 1990-2014 Free Software Foundation, Inc. + Copyright (C) 1990-2017 Free Software Foundation, Inc. Original code by Center for Software Science @@ -270,18 +270,10 @@ struct elf32_hppa_link_hash_table /* Assorted information used by elf32_hppa_size_stubs. */ unsigned int bfd_count; - int top_index; + unsigned int top_index; asection **input_list; Elf_Internal_Sym **all_local_syms; - /* Short-cuts to get to dynamic linker sections. */ - asection *sgot; - asection *srelgot; - asection *splt; - asection *srelplt; - asection *sdynbss; - asection *srelbss; - /* Used during a final link to store the base of the text and data segments so that we can perform SEGREL relocations. */ bfd_vma text_segment_base; @@ -407,6 +399,18 @@ hppa_link_hash_newfunc (struct bfd_hash_entry *entry, return entry; } +/* Free the derived linker hash table. */ + +static void +elf32_hppa_link_hash_table_free (bfd *obfd) +{ + struct elf32_hppa_link_hash_table *htab + = (struct elf32_hppa_link_hash_table *) obfd->link.hash; + + bfd_hash_table_free (&htab->bstab); + _bfd_elf_link_hash_table_free (obfd); +} + /* Create the derived linker hash table. The PA ELF port uses the derived hash table to keep information specific to the PA ELF linker (without using static variables). */ @@ -432,23 +436,27 @@ elf32_hppa_link_hash_table_create (bfd *abfd) /* Init the stub hash table too. */ if (!bfd_hash_table_init (&htab->bstab, stub_hash_newfunc, sizeof (struct elf32_hppa_stub_hash_entry))) - return NULL; + { + _bfd_elf_link_hash_table_free (abfd); + return NULL; + } + htab->etab.root.hash_table_free = elf32_hppa_link_hash_table_free; htab->text_segment_base = (bfd_vma) -1; htab->data_segment_base = (bfd_vma) -1; return &htab->etab.root; } -/* Free the derived linker hash table. */ +/* Initialize the linker stubs BFD so that we can use it for linker + created dynamic sections. */ -static void -elf32_hppa_link_hash_table_free (struct bfd_link_hash_table *btab) +void +elf32_hppa_init_stub_bfd (bfd *abfd, struct bfd_link_info *info) { - struct elf32_hppa_link_hash_table *htab - = (struct elf32_hppa_link_hash_table *) btab; + struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info); - bfd_hash_table_free (&htab->bstab); - _bfd_elf_link_hash_table_free (btab); + elf_elfheader (abfd)->e_ident[EI_CLASS] = ELFCLASS32; + htab->etab.dynobj = abfd; } /* Build a name for an entry in the stub hash table. */ @@ -575,9 +583,9 @@ hppa_add_stub (const char *stub_name, TRUE, FALSE); if (hsh == NULL) { - (*_bfd_error_handler) (_("%B: cannot create stub entry %s"), - section->owner, - stub_name); + /* xgettext:c-format */ + _bfd_error_handler (_("%B: cannot create stub entry %s"), + section->owner, stub_name); return NULL; } @@ -605,7 +613,7 @@ hppa_type_of_stub (asection *input_sec, && hh->eh.plt.offset != (bfd_vma) -1 && hh->eh.dynindx != -1 && !hh->plabel - && (info->shared + && (bfd_link_pic (info) || !hh->eh.def_regular || hh->eh.root.type == bfd_link_hash_defweak)) { @@ -764,9 +772,9 @@ hppa_build_one_stub (struct bfd_hash_entry *bh, void *in_arg) off &= ~ (bfd_vma) 1; sym_value = (off - + htab->splt->output_offset - + htab->splt->output_section->vma - - elf_gp (htab->splt->output_section->owner)); + + htab->etab.splt->output_offset + + htab->etab.splt->output_section->vma + - elf_gp (htab->etab.splt->output_section->owner)); insn = ADDIL_DP; #if R19_STUBS @@ -826,7 +834,8 @@ hppa_build_one_stub (struct bfd_hash_entry *bh, void *in_arg) && (!htab->has_22bit_branch || sym_value - 8 + (1 << (22 + 1)) >= (1 << (22 + 2)))) { - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext:c-format */ (_("%B(%A+0x%lx): cannot reach %s, recompile with -ffunction-sections"), hsh->target_section->owner, stub_sec, @@ -978,22 +987,13 @@ elf32_hppa_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) htab = hppa_link_hash_table (info); if (htab == NULL) return FALSE; - if (htab->splt != NULL) + if (htab->etab.splt != NULL) return TRUE; /* Call the generic code to do most of the work. */ if (! _bfd_elf_create_dynamic_sections (abfd, info)) return FALSE; - htab->splt = bfd_get_linker_section (abfd, ".plt"); - htab->srelplt = bfd_get_linker_section (abfd, ".rela.plt"); - - htab->sgot = bfd_get_linker_section (abfd, ".got"); - htab->srelgot = bfd_get_linker_section (abfd, ".rela.got"); - - htab->sdynbss = bfd_get_linker_section (abfd, ".dynbss"); - htab->srelbss = bfd_get_linker_section (abfd, ".rela.bss"); - /* hppa-linux needs _GLOBAL_OFFSET_TABLE_ to be visible from the main application, because __canonicalize_funcptr_for_compare needs it. */ eh = elf_hash_table (info)->hgot; @@ -1056,19 +1056,20 @@ elf32_hppa_copy_indirect_symbol (struct bfd_link_info *info, /* If called to transfer flags for a weakdef during processing of elf_adjust_dynamic_symbol, don't copy non_got_ref. We clear it ourselves for ELIMINATE_COPY_RELOCS. */ - eh_dir->ref_dynamic |= eh_ind->ref_dynamic; + if (eh_dir->versioned != versioned_hidden) + eh_dir->ref_dynamic |= eh_ind->ref_dynamic; eh_dir->ref_regular |= eh_ind->ref_regular; eh_dir->ref_regular_nonweak |= eh_ind->ref_regular_nonweak; eh_dir->needs_plt |= eh_ind->needs_plt; } else { - if (eh_ind->root.type == bfd_link_hash_indirect - && eh_dir->got.refcount <= 0) - { - hh_dir->tls_type = hh_ind->tls_type; - hh_ind->tls_type = GOT_UNKNOWN; - } + if (eh_ind->root.type == bfd_link_hash_indirect) + { + hh_dir->plabel |= hh_ind->plabel; + hh_dir->tls_type |= hh_ind->tls_type; + hh_ind->tls_type = GOT_UNKNOWN; + } _bfd_elf_link_hash_copy_indirect (info, eh_dir, eh_ind); } @@ -1133,7 +1134,7 @@ elf32_hppa_check_relocs (bfd *abfd, asection *sreloc; int tls_type = GOT_UNKNOWN, old_tls_type = GOT_UNKNOWN; - if (info->relocatable) + if (bfd_link_relocatable (info)) return TRUE; htab = hppa_link_hash_table (info); @@ -1262,9 +1263,10 @@ elf32_hppa_check_relocs (bfd *abfd, case R_PARISC_DPREL14F: /* Used for gp rel data load/store. */ case R_PARISC_DPREL14R: case R_PARISC_DPREL21L: - if (info->shared) + if (bfd_link_pic (info)) { - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext:c-format */ (_("%B: relocation %s can not be used when making a shared object; recompile with -fPIC"), abfd, elf_hppa_howto_table[r_type].name); @@ -1308,7 +1310,7 @@ elf32_hppa_check_relocs (bfd *abfd, case R_PARISC_TLS_IE21L: case R_PARISC_TLS_IE14R: - if (info->shared) + if (bfd_link_pic (info)) info->flags |= DF_STATIC_TLS; need_entry = NEED_GOT; break; @@ -1341,10 +1343,8 @@ elf32_hppa_check_relocs (bfd *abfd, /* Allocate space for a GOT entry, as well as a dynamic relocation for this entry. */ - if (htab->sgot == NULL) + if (htab->etab.sgot == NULL) { - if (htab->etab.dynobj == NULL) - htab->etab.dynobj = abfd; if (!elf32_hppa_create_dynamic_sections (htab->etab.dynobj, info)) return FALSE; } @@ -1428,7 +1428,7 @@ elf32_hppa_check_relocs (bfd *abfd, /* Flag this symbol as having a non-got, non-plt reference so that we generate copy relocs if it turns out to be dynamic. */ - if (hh != NULL && !info->shared) + if (hh != NULL && !bfd_link_pic (info)) hh->eh.non_got_ref = 1; /* If we are creating a shared library then we need to copy @@ -1459,15 +1459,15 @@ elf32_hppa_check_relocs (bfd *abfd, may need to keep relocations for symbols satisfied by a dynamic library if we manage to avoid copy relocs for the symbol. */ - if ((info->shared + if ((bfd_link_pic (info) && (sec->flags & SEC_ALLOC) != 0 && (IS_ABSOLUTE_RELOC (r_type) || (hh != NULL - && (!info->symbolic + && (!SYMBOLIC_BIND (info, &hh->eh) || hh->eh.root.type == bfd_link_hash_defweak || !hh->eh.def_regular)))) || (ELIMINATE_COPY_RELOCS - && !info->shared + && !bfd_link_pic (info) && (sec->flags & SEC_ALLOC) != 0 && hh != NULL && (hh->eh.root.type == bfd_link_hash_defweak @@ -1480,9 +1480,6 @@ elf32_hppa_check_relocs (bfd *abfd, this reloc. */ if (sreloc == NULL) { - if (htab->etab.dynobj == NULL) - htab->etab.dynobj = abfd; - sreloc = _bfd_elf_make_dynamic_reloc_section (sec, htab->etab.dynobj, 2, abfd, /*rela?*/ TRUE); @@ -1585,7 +1582,7 @@ elf32_hppa_gc_sweep_hook (bfd *abfd, const Elf_Internal_Rela *rela, *relend; struct elf32_hppa_link_hash_table *htab; - if (info->relocatable) + if (bfd_link_relocatable (info)) return TRUE; htab = hppa_link_hash_table (info); @@ -1797,7 +1794,7 @@ elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info, struct elf_link_hash_entry *eh) { struct elf32_hppa_link_hash_table *htab; - asection *sec; + asection *sec, *srel; /* If this is a function, put it in the procedure linkage table. We will fill in the contents of the procedure linkage table later. */ @@ -1815,7 +1812,7 @@ elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info, || (eh->def_regular && eh->root.type != bfd_link_hash_defweak && ! hppa_elf_hash_entry (eh)->plabel - && (!info->shared || info->symbolic))) + && (!bfd_link_pic (info) || SYMBOLIC_BIND (info, eh)))) { /* The .plt entry is not needed when: a) Garbage collection has removed all references to the @@ -1856,7 +1853,7 @@ elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info, only references to the symbol are via the global offset table. For such cases we need not do anything here; the relocations will be handled correctly by relocate_section. */ - if (info->shared) + if (bfd_link_pic (info)) return TRUE; /* If there are no references to this symbol that do not use the @@ -1903,15 +1900,38 @@ elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info, /* We must generate a COPY reloc to tell the dynamic linker to copy the initial value out of the dynamic object and into the runtime process image. */ + if ((eh->root.u.def.section->flags & SEC_READONLY) != 0) + { + sec = htab->etab.sdynrelro; + srel = htab->etab.sreldynrelro; + } + else + { + sec = htab->etab.sdynbss; + srel = htab->etab.srelbss; + } if ((eh->root.u.def.section->flags & SEC_ALLOC) != 0 && eh->size != 0) { - htab->srelbss->size += sizeof (Elf32_External_Rela); + srel->size += sizeof (Elf32_External_Rela); eh->needs_copy = 1; } - sec = htab->sdynbss; + return _bfd_elf_adjust_dynamic_copy (info, eh, sec); +} - return _bfd_elf_adjust_dynamic_copy (eh, sec); +/* Make an undefined weak symbol dynamic. */ + +static bfd_boolean +ensure_undef_weak_dynamic (struct bfd_link_info *info, + struct elf_link_hash_entry *eh) +{ + if (eh->dynindx == -1 + && !eh->forced_local + && eh->type != STT_PARISC_MILLI + && eh->root.type == bfd_link_hash_undefweak + && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT) + return bfd_elf_link_record_dynamic_symbol (info, eh); + return TRUE; } /* Allocate space in the .plt for entries that won't have relocations. @@ -1937,17 +1957,10 @@ allocate_plt_static (struct elf_link_hash_entry *eh, void *inf) if (htab->etab.dynamic_sections_created && eh->plt.refcount > 0) { - /* Make sure this symbol is output as a dynamic symbol. - Undefined weak syms won't yet be marked as dynamic. */ - if (eh->dynindx == -1 - && !eh->forced_local - && eh->type != STT_PARISC_MILLI) - { - if (! bfd_elf_link_record_dynamic_symbol (info, eh)) - return FALSE; - } + if (!ensure_undef_weak_dynamic (info, eh)) + return FALSE; - if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, eh)) + if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), eh)) { /* Allocate these later. From this point on, h->plabel means that the plt entry is only used by a plabel. @@ -1960,9 +1973,11 @@ allocate_plt_static (struct elf_link_hash_entry *eh, void *inf) { /* Make an entry in the .plt section for plabel references that won't have a .plt entry for other reasons. */ - sec = htab->splt; + sec = htab->etab.splt; eh->plt.offset = sec->size; sec->size += PLT_ENTRY_SIZE; + if (bfd_link_pic (info)) + htab->etab.srelplt->size += sizeof (Elf32_External_Rela); } else { @@ -2008,28 +2023,21 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf) && eh->plt.refcount > 0) { /* Make an entry in the .plt section. */ - sec = htab->splt; + sec = htab->etab.splt; eh->plt.offset = sec->size; sec->size += PLT_ENTRY_SIZE; /* We also need to make an entry in the .rela.plt section. */ - htab->srelplt->size += sizeof (Elf32_External_Rela); + htab->etab.srelplt->size += sizeof (Elf32_External_Rela); htab->need_plt_stub = 1; } if (eh->got.refcount > 0) { - /* Make sure this symbol is output as a dynamic symbol. - Undefined weak syms won't yet be marked as dynamic. */ - if (eh->dynindx == -1 - && !eh->forced_local - && eh->type != STT_PARISC_MILLI) - { - if (! bfd_elf_link_record_dynamic_symbol (info, eh)) - return FALSE; - } + if (!ensure_undef_weak_dynamic (info, eh)) + return FALSE; - sec = htab->sgot; + sec = htab->etab.sgot; eh->got.offset = sec->size; sec->size += GOT_ENTRY_SIZE; /* R_PARISC_TLS_GD* needs two GOT entries */ @@ -2038,15 +2046,15 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf) else if ((hh->tls_type & GOT_TLS_GD) == GOT_TLS_GD) sec->size += GOT_ENTRY_SIZE; if (htab->etab.dynamic_sections_created - && (info->shared + && (bfd_link_pic (info) || (eh->dynindx != -1 && !eh->forced_local))) { - htab->srelgot->size += sizeof (Elf32_External_Rela); + htab->etab.srelgot->size += sizeof (Elf32_External_Rela); if ((hh->tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE)) - htab->srelgot->size += 2 * sizeof (Elf32_External_Rela); + htab->etab.srelgot->size += 2 * sizeof (Elf32_External_Rela); else if ((hh->tls_type & GOT_TLS_GD) == GOT_TLS_GD) - htab->srelgot->size += sizeof (Elf32_External_Rela); + htab->etab.srelgot->size += sizeof (Elf32_External_Rela); } } else @@ -2060,7 +2068,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf) defined in a regular object. For the normal shared case, discard space for relocs that have become local due to symbol visibility changes. */ - if (info->shared) + if (bfd_link_pic (info)) { #if RELATIVE_DYNRELOCS if (SYMBOL_CALLS_LOCAL (info, eh)) @@ -2087,14 +2095,8 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf) if (ELF_ST_VISIBILITY (eh->other) != STV_DEFAULT) hh->dyn_relocs = NULL; - /* Make sure undefined weak symbols are output as a dynamic - symbol in PIEs. */ - else if (eh->dynindx == -1 - && !eh->forced_local) - { - if (! bfd_elf_link_record_dynamic_symbol (info, eh)) - return FALSE; - } + else if (!ensure_undef_weak_dynamic (info, eh)) + return FALSE; } } else @@ -2111,15 +2113,8 @@ allocate_dynrelocs (struct elf_link_hash_entry *eh, void *inf) && (eh->root.type == bfd_link_hash_undefweak || eh->root.type == bfd_link_hash_undefined)))) { - /* Make sure this symbol is output as a dynamic symbol. - Undefined weak syms won't yet be marked as dynamic. */ - if (eh->dynindx == -1 - && !eh->forced_local - && eh->type != STT_PARISC_MILLI) - { - if (! bfd_elf_link_record_dynamic_symbol (info, eh)) - return FALSE; - } + if (!ensure_undef_weak_dynamic (info, eh)) + return FALSE; /* If that succeeded, we know we'll be keeping all the relocs. */ @@ -2211,7 +2206,7 @@ elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (htab->etab.dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (info->executable) + if (bfd_link_executable (info) && !info->nointerp) { sec = bfd_get_linker_section (dynobj, ".interp"); if (sec == NULL) @@ -2228,7 +2223,7 @@ elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, /* Set up .got and .plt offsets for local syms, and space for local dynamic relocs. */ - for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next) + for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next) { bfd_signed_vma *local_got; bfd_signed_vma *end_local_got; @@ -2277,8 +2272,8 @@ elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, locsymcount = symtab_hdr->sh_info; end_local_got = local_got + locsymcount; local_tls_type = hppa_elf_local_got_tls_type (ibfd); - sec = htab->sgot; - srel = htab->srelgot; + sec = htab->etab.sgot; + srel = htab->etab.srelgot; for (; local_got < end_local_got; ++local_got) { if (*local_got > 0) @@ -2289,7 +2284,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 (bfd_link_pic (info)) { srel->size += sizeof (Elf32_External_Rela); if ((*local_tls_type & (GOT_TLS_GD | GOT_TLS_IE)) == (GOT_TLS_GD | GOT_TLS_IE)) @@ -2314,15 +2309,15 @@ elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, } else { - sec = htab->splt; - srel = htab->srelplt; + sec = htab->etab.splt; + srel = htab->etab.srelplt; for (; local_plt < end_local_plt; ++local_plt) { if (*local_plt > 0) { *local_plt = sec->size; sec->size += PLT_ENTRY_SIZE; - if (info->shared) + if (bfd_link_pic (info)) srel->size += sizeof (Elf32_External_Rela); } else @@ -2335,9 +2330,9 @@ elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, { /* 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); - htab->srelgot->size += sizeof (Elf32_External_Rela); + htab->tls_ldm_got.offset = htab->etab.sgot->size; + htab->etab.sgot->size += (GOT_ENTRY_SIZE * 2); + htab->etab.srelgot->size += sizeof (Elf32_External_Rela); } else htab->tls_ldm_got.offset = -1; @@ -2360,14 +2355,14 @@ elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if ((sec->flags & SEC_LINKER_CREATED) == 0) continue; - if (sec == htab->splt) + if (sec == htab->etab.splt) { if (htab->need_plt_stub) { /* Make space for the plt stub at the end of the .plt section. We want this stub right at the end, up against the .got section. */ - int gotalign = bfd_section_alignment (dynobj, htab->sgot); + int gotalign = bfd_section_alignment (dynobj, htab->etab.sgot); int pltalign = bfd_section_alignment (dynobj, sec); bfd_size_type mask; @@ -2377,8 +2372,9 @@ elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, sec->size = (sec->size + sizeof (plt_stub) + mask) & ~mask; } } - else if (sec == htab->sgot - || sec == htab->sdynbss) + else if (sec == htab->etab.sgot + || sec == htab->etab.sdynbss + || sec == htab->etab.sdynrelro) ; else if (CONST_STRNEQ (bfd_get_section_name (dynobj, sec), ".rela")) { @@ -2386,7 +2382,7 @@ elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, { /* Remember whether there are any reloc sections other than .rela.plt. */ - if (sec != htab->srelplt) + if (sec != htab->etab.srelplt) relocs = TRUE; /* We use the reloc_count field as a counter if we need @@ -2442,13 +2438,13 @@ elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, must add the entries now so that we get the correct size for the .dynamic section. The DT_DEBUG entry is filled in by the dynamic linker and used by the debugger. */ - if (info->executable) + if (bfd_link_executable (info)) { if (!add_dynamic_entry (DT_DEBUG, 0)) return FALSE; } - if (htab->srelplt->size != 0) + if (htab->etab.srelplt->size != 0) { if (!add_dynamic_entry (DT_PLTRELSZ, 0) || !add_dynamic_entry (DT_PLTREL, DT_RELA) @@ -2491,7 +2487,7 @@ elf32_hppa_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info) { bfd *input_bfd; unsigned int bfd_count; - int top_id, top_index; + unsigned int top_id, top_index; asection *section; asection **input_list, **list; bfd_size_type amt; @@ -2503,7 +2499,7 @@ elf32_hppa_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info) /* Count the number of input BFDs and find the top input section id. */ for (input_bfd = info->input_bfds, bfd_count = 0, top_id = 0; input_bfd != NULL; - input_bfd = input_bfd->link_next) + input_bfd = input_bfd->link.next) { bfd_count += 1; for (section = input_bfd->sections; @@ -2694,7 +2690,7 @@ get_local_syms (bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *info) export stubs. */ for (bfd_indx = 0; input_bfd != NULL; - input_bfd = input_bfd->link_next, bfd_indx++) + input_bfd = input_bfd->link.next, bfd_indx++) { Elf_Internal_Shdr *symtab_hdr; @@ -2718,7 +2714,7 @@ get_local_syms (bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *info) all_local_syms[bfd_indx] = local_syms; - if (info->shared && htab->multi_subspace) + if (bfd_link_pic (info) && htab->multi_subspace) { struct elf_link_hash_entry **eh_syms; struct elf_link_hash_entry **eh_symend; @@ -2778,9 +2774,9 @@ get_local_syms (bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *info) } else { - (*_bfd_error_handler) (_("%B: duplicate export stub %s"), - input_bfd, - stub_name); + /* xgettext:c-format */ + _bfd_error_handler (_("%B: duplicate export stub %s"), + input_bfd, stub_name); } } } @@ -2868,7 +2864,7 @@ elf32_hppa_size_stubs for (input_bfd = info->input_bfds, bfd_indx = 0; input_bfd != NULL; - input_bfd = input_bfd->link_next, bfd_indx++) + input_bfd = input_bfd->link.next, bfd_indx++) { Elf_Internal_Shdr *symtab_hdr; asection *section; @@ -2990,7 +2986,7 @@ elf32_hppa_size_stubs } else if (hh->eh.root.type == bfd_link_hash_undefweak) { - if (! info->shared) + if (! bfd_link_pic (info)) continue; } else if (hh->eh.root.type == bfd_link_hash_undefined) @@ -3042,7 +3038,7 @@ elf32_hppa_size_stubs hsh->target_value = sym_value; hsh->target_section = sym_sec; hsh->stub_type = stub_type; - if (info->shared) + if (bfd_link_pic (info)) { if (stub_type == hppa_stub_import) hsh->stub_type = hppa_stub_import_shared; @@ -3067,7 +3063,8 @@ elf32_hppa_size_stubs for (stub_sec = htab->stub_bfd->sections; stub_sec != NULL; stub_sec = stub_sec->next) - stub_sec->size = 0; + if ((stub_sec->flags & SEC_LINKER_CREATED) == 0) + stub_sec->size = 0; bfd_hash_traverse (&htab->bstab, hppa_size_one_stub, htab); @@ -3189,16 +3186,15 @@ elf32_hppa_build_stubs (struct bfd_link_info *info) for (stub_sec = htab->stub_bfd->sections; stub_sec != NULL; stub_sec = stub_sec->next) - { - bfd_size_type size; - - /* Allocate memory to hold the linker stubs. */ - size = stub_sec->size; - stub_sec->contents = bfd_zalloc (htab->stub_bfd, size); - if (stub_sec->contents == NULL && size != 0) - return FALSE; - stub_sec->size = 0; - } + if ((stub_sec->flags & SEC_LINKER_CREATED) == 0 + && stub_sec->size != 0) + { + /* Allocate memory to hold the linker stubs. */ + stub_sec->contents = bfd_zalloc (htab->stub_bfd, stub_sec->size); + if (stub_sec->contents == NULL) + return FALSE; + stub_sec->size = 0; + } /* Build the stubs as directed by the stub hash table. */ table = &htab->bstab; @@ -3241,13 +3237,22 @@ tpoff (struct bfd_link_info *info, bfd_vma address) static bfd_boolean elf32_hppa_final_link (bfd *abfd, struct bfd_link_info *info) { + struct stat buf; + /* Invoke the regular ELF linker to do all the work. */ if (!bfd_elf_final_link (abfd, info)) return FALSE; /* If we're producing a final executable, sort the contents of the unwind section. */ - if (info->relocatable) + if (bfd_link_relocatable (info)) + return TRUE; + + /* Do not attempt to sort non-regular files. This is here + especially for configure scripts and kernel builds which run + tests with "ld [...] -o /dev/null". */ + if (stat (abfd->filename, &buf) != 0 + || !S_ISREG(buf.st_mode)) return TRUE; return elf_hppa_sort_unwind (abfd); @@ -3325,7 +3330,7 @@ final_link_relocate (asection *input_section, /* If we are not building a shared library, convert DLTIND relocs to DPREL relocs. */ - if (!info->shared) + if (!bfd_link_pic (info)) { switch (r_type) { @@ -3362,7 +3367,7 @@ final_link_relocate (asection *input_section, && hh->eh.plt.offset != (bfd_vma) -1 && hh->eh.dynindx != -1 && !hh->plabel - && (info->shared + && (bfd_link_pic (info) || !hh->eh.def_regular || hh->eh.root.type == bfd_link_hash_defweak))) { @@ -3423,7 +3428,8 @@ final_link_relocate (asection *input_section, /* We must have a ldil instruction. It's too hard to find and convert the associated add instruction, so issue an error. */ - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext:c-format */ (_("%B(%A+0x%lx): %s fixup for insn 0x%x is not supported in a non-shared link"), input_bfd, input_section, @@ -3588,7 +3594,8 @@ final_link_relocate (asection *input_section, if (max_branch_offset != 0 && value + addend + max_branch_offset >= 2*max_branch_offset) { - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext:c-format */ (_("%B(%A+0x%lx): cannot reach %s, recompile with -ffunction-sections"), input_bfd, input_section, @@ -3703,7 +3710,7 @@ elf32_hppa_relocate_section (bfd *output_bfd, unresolved_reloc, warned_undef, ignored); - if (!info->relocatable + if (!bfd_link_relocatable (info) && relocation == 0 && eh->root.type != bfd_link_hash_defined && eh->root.type != bfd_link_hash_defweak @@ -3713,10 +3720,9 @@ elf32_hppa_relocate_section (bfd *output_bfd, && ELF_ST_VISIBILITY (eh->other) == STV_DEFAULT && eh->type == STT_PARISC_MILLI) { - if (! info->callbacks->undefined_symbol - (info, eh_name (eh), input_bfd, - input_section, rela->r_offset, FALSE)) - return FALSE; + (*info->callbacks->undefined_symbol) + (info, eh_name (eh), input_bfd, + input_section, rela->r_offset, FALSE); warned_undef = TRUE; } } @@ -3729,7 +3735,7 @@ elf32_hppa_relocate_section (bfd *output_bfd, elf_hppa_howto_table + r_type, 0, contents); - if (info->relocatable) + if (bfd_link_relocatable (info)) continue; /* Do any required modifications to the relocation value, and @@ -3753,7 +3759,8 @@ elf32_hppa_relocate_section (bfd *output_bfd, off = hh->eh.got.offset; dyn = htab->etab.dynamic_sections_created; - if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, + if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, + bfd_link_pic (info), &hh->eh)) { /* If we aren't going to call finish_dynamic_symbol, @@ -3793,18 +3800,18 @@ elf32_hppa_relocate_section (bfd *output_bfd, if (do_got) { - if (info->shared) + if (bfd_link_pic (info)) { /* Output a dynamic relocation for this GOT entry. In this case it is relative to the base of the object because the symbol index is zero. */ Elf_Internal_Rela outrel; bfd_byte *loc; - asection *sec = htab->srelgot; + asection *sec = htab->etab.srelgot; outrel.r_offset = (off - + htab->sgot->output_offset - + htab->sgot->output_section->vma); + + htab->etab.sgot->output_offset + + htab->etab.sgot->output_section->vma); outrel.r_info = ELF32_R_INFO (0, R_PARISC_DIR32); outrel.r_addend = relocation; loc = sec->contents; @@ -3813,7 +3820,7 @@ elf32_hppa_relocate_section (bfd *output_bfd, } else bfd_put_32 (output_bfd, relocation, - htab->sgot->contents + off); + htab->etab.sgot->contents + off); } if (off >= (bfd_vma) -2) @@ -3821,8 +3828,8 @@ elf32_hppa_relocate_section (bfd *output_bfd, /* Add the base of the GOT to the relocation value. */ relocation = (off - + htab->sgot->output_offset - + htab->sgot->output_section->vma); + + htab->etab.sgot->output_offset + + htab->etab.sgot->output_section->vma); } break; @@ -3845,7 +3852,8 @@ elf32_hppa_relocate_section (bfd *output_bfd, if (hh != NULL) { off = hh->eh.plt.offset; - if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, + if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, + bfd_link_pic (info), &hh->eh)) { /* In a non-shared link, adjust_dynamic_symbols @@ -3884,17 +3892,17 @@ elf32_hppa_relocate_section (bfd *output_bfd, if (do_plt) { - if (info->shared) + if (bfd_link_pic (info)) { /* Output a dynamic IPLT relocation for this PLT entry. */ Elf_Internal_Rela outrel; bfd_byte *loc; - asection *s = htab->srelplt; + asection *s = htab->etab.srelplt; outrel.r_offset = (off - + htab->splt->output_offset - + htab->splt->output_section->vma); + + htab->etab.splt->output_offset + + htab->etab.splt->output_section->vma); outrel.r_info = ELF32_R_INFO (0, R_PARISC_IPLT); outrel.r_addend = relocation; loc = s->contents; @@ -3905,10 +3913,10 @@ elf32_hppa_relocate_section (bfd *output_bfd, { bfd_put_32 (output_bfd, relocation, - htab->splt->contents + off); + htab->etab.splt->contents + off); bfd_put_32 (output_bfd, - elf_gp (htab->splt->output_section->owner), - htab->splt->contents + off + 4); + elf_gp (htab->etab.splt->output_section->owner), + htab->etab.splt->contents + off + 4); } } @@ -3926,13 +3934,13 @@ elf32_hppa_relocate_section (bfd *output_bfd, && hh->eh.root.type != bfd_link_hash_undefined)) { relocation = (off - + htab->splt->output_offset - + htab->splt->output_section->vma + + htab->etab.splt->output_offset + + htab->etab.splt->output_section->vma + 2); } plabel = 1; } - /* Fall through and possibly emit a dynamic relocation. */ + /* Fall through. */ case R_PARISC_DIR17F: case R_PARISC_DIR17R: @@ -3958,13 +3966,13 @@ elf32_hppa_relocate_section (bfd *output_bfd, which is why we can't use just that test here. Conversely, DEF_DYNAMIC can't be used in check_relocs as there all files have not been loaded. */ - if ((info->shared + if ((bfd_link_pic (info) && (hh == NULL || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT || hh->eh.root.type != bfd_link_hash_undefweak) && (IS_ABSOLUTE_RELOC (r_type) || !SYMBOL_CALLS_LOCAL (info, &hh->eh))) - || (!info->shared + || (!bfd_link_pic (info) && hh != NULL && hh->eh.dynindx != -1 && !hh->eh.non_got_ref @@ -4000,8 +4008,8 @@ elf32_hppa_relocate_section (bfd *output_bfd, && hh->eh.dynindx != -1 && (plabel || !IS_ABSOLUTE_RELOC (r_type) - || !info->shared - || !info->symbolic + || !bfd_link_pic (info) + || !SYMBOLIC_BIND (info, &hh->eh) || !hh->eh.def_regular)) { outrel.r_info = ELF32_R_INFO (hh->eh.dynindx, r_type); @@ -4068,12 +4076,12 @@ elf32_hppa_relocate_section (bfd *output_bfd, bfd_byte *loc; outrel.r_offset = (off - + htab->sgot->output_section->vma - + htab->sgot->output_offset); + + htab->etab.sgot->output_section->vma + + htab->etab.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->reloc_count++ * sizeof (Elf32_External_Rela); + loc = htab->etab.srelgot->contents; + loc += htab->etab.srelgot->reloc_count++ * sizeof (Elf32_External_Rela); bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); htab->tls_ldm_got.offset |= 1; @@ -4081,8 +4089,8 @@ elf32_hppa_relocate_section (bfd *output_bfd, /* Add the base of the GOT to the relocation value. */ relocation = (off - + htab->sgot->output_offset - + htab->sgot->output_section->vma); + + htab->etab.sgot->output_offset + + htab->etab.sgot->output_section->vma); break; } @@ -4107,8 +4115,10 @@ elf32_hppa_relocate_section (bfd *output_bfd, bfd_boolean dyn; dyn = htab->etab.dynamic_sections_created; - if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, &hh->eh) - && (!info->shared + if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, + bfd_link_pic (info), + &hh->eh) + && (!bfd_link_pic (info) || !SYMBOL_REFERENCES_LOCAL (info, &hh->eh))) { indx = hh->eh.dynindx; @@ -4138,15 +4148,15 @@ elf32_hppa_relocate_section (bfd *output_bfd, now, and emit any relocations. If both an IE GOT and a GD GOT are necessary, we emit the GD first. */ - if ((info->shared || indx != 0) + if ((bfd_link_pic (info) || indx != 0) && (hh == NULL || ELF_ST_VISIBILITY (hh->eh.other) == STV_DEFAULT || hh->eh.root.type != bfd_link_hash_undefweak)) { need_relocs = TRUE; - loc = htab->srelgot->contents; + loc = htab->etab.srelgot->contents; /* FIXME (CAO): Should this be reloc_count++ ? */ - loc += htab->srelgot->reloc_count * sizeof (Elf32_External_Rela); + loc += htab->etab.srelgot->reloc_count * sizeof (Elf32_External_Rela); } if (tls_type & GOT_TLS_GD) @@ -4154,26 +4164,26 @@ elf32_hppa_relocate_section (bfd *output_bfd, if (need_relocs) { outrel.r_offset = (cur_off - + htab->sgot->output_section->vma - + htab->sgot->output_offset); + + htab->etab.sgot->output_section->vma + + htab->etab.sgot->output_offset); outrel.r_info = ELF32_R_INFO (indx,R_PARISC_TLS_DTPMOD32); outrel.r_addend = 0; - bfd_put_32 (output_bfd, 0, htab->sgot->contents + cur_off); + bfd_put_32 (output_bfd, 0, htab->etab.sgot->contents + cur_off); bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); - htab->srelgot->reloc_count++; + htab->etab.srelgot->reloc_count++; loc += sizeof (Elf32_External_Rela); if (indx == 0) bfd_put_32 (output_bfd, relocation - dtpoff_base (info), - htab->sgot->contents + cur_off + 4); + htab->etab.sgot->contents + cur_off + 4); else { bfd_put_32 (output_bfd, 0, - htab->sgot->contents + cur_off + 4); + htab->etab.sgot->contents + cur_off + 4); outrel.r_info = ELF32_R_INFO (indx, R_PARISC_TLS_DTPOFF32); outrel.r_offset += 4; bfd_elf32_swap_reloca_out (output_bfd, &outrel,loc); - htab->srelgot->reloc_count++; + htab->etab.srelgot->reloc_count++; loc += sizeof (Elf32_External_Rela); } } @@ -4185,9 +4195,9 @@ elf32_hppa_relocate_section (bfd *output_bfd, symbol binding locally. Mark it as belonging to module 1, the executable. */ bfd_put_32 (output_bfd, 1, - htab->sgot->contents + cur_off); + htab->etab.sgot->contents + cur_off); bfd_put_32 (output_bfd, relocation - dtpoff_base (info), - htab->sgot->contents + cur_off + 4); + htab->etab.sgot->contents + cur_off + 4); } @@ -4199,8 +4209,8 @@ elf32_hppa_relocate_section (bfd *output_bfd, if (need_relocs) { outrel.r_offset = (cur_off - + htab->sgot->output_section->vma - + htab->sgot->output_offset); + + htab->etab.sgot->output_section->vma + + htab->etab.sgot->output_offset); outrel.r_info = ELF32_R_INFO (indx, R_PARISC_TLS_TPREL32); if (indx == 0) @@ -4209,12 +4219,12 @@ elf32_hppa_relocate_section (bfd *output_bfd, outrel.r_addend = 0; bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc); - htab->srelgot->reloc_count++; + htab->etab.srelgot->reloc_count++; loc += sizeof (Elf32_External_Rela); } else bfd_put_32 (output_bfd, tpoff (info, relocation), - htab->sgot->contents + cur_off); + htab->etab.sgot->contents + cur_off); cur_off += 4; } @@ -4232,8 +4242,8 @@ elf32_hppa_relocate_section (bfd *output_bfd, /* Add the base of the GOT to the relocation value. */ relocation = (off - + htab->sgot->output_offset - + htab->sgot->output_section->vma); + + htab->etab.sgot->output_offset + + htab->etab.sgot->output_section->vma); break; } @@ -4275,7 +4285,8 @@ elf32_hppa_relocate_section (bfd *output_bfd, { if (rstatus == bfd_reloc_notsupported || !warned_undef) { - (*_bfd_error_handler) + _bfd_error_handler + /* xgettext:c-format */ (_("%B(%A+0x%lx): cannot handle %s for %s"), input_bfd, input_section, @@ -4287,12 +4298,9 @@ elf32_hppa_relocate_section (bfd *output_bfd, } } else - { - if (!((*info->callbacks->reloc_overflow) - (info, (hh ? &hh->eh.root : NULL), sym_name, howto->name, - (bfd_vma) 0, input_bfd, input_section, rela->r_offset))) - return FALSE; - } + (*info->callbacks->reloc_overflow) + (info, (hh ? &hh->eh.root : NULL), sym_name, howto->name, + (bfd_vma) 0, input_bfd, input_section, rela->r_offset); } return TRUE; @@ -4341,8 +4349,8 @@ elf32_hppa_finish_dynamic_symbol (bfd *output_bfd, /* Create a dynamic IPLT relocation for this entry. */ rela.r_offset = (eh->plt.offset - + htab->splt->output_offset - + htab->splt->output_section->vma); + + htab->etab.splt->output_offset + + htab->etab.splt->output_section->vma); if (eh->dynindx != -1) { rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_IPLT); @@ -4356,9 +4364,9 @@ elf32_hppa_finish_dynamic_symbol (bfd *output_bfd, rela.r_addend = value; } - loc = htab->srelplt->contents; - loc += htab->srelplt->reloc_count++ * sizeof (Elf32_External_Rela); - bfd_elf32_swap_reloca_out (htab->splt->output_section->owner, &rela, loc); + loc = htab->etab.srelplt->contents; + loc += htab->etab.srelplt->reloc_count++ * sizeof (Elf32_External_Rela); + bfd_elf32_swap_reloca_out (htab->etab.splt->output_section->owner, &rela, loc); if (!eh->def_regular) { @@ -4376,16 +4384,16 @@ elf32_hppa_finish_dynamic_symbol (bfd *output_bfd, up. */ rela.r_offset = ((eh->got.offset &~ (bfd_vma) 1) - + htab->sgot->output_offset - + htab->sgot->output_section->vma); + + htab->etab.sgot->output_offset + + htab->etab.sgot->output_section->vma); /* If this is a -Bsymbolic link and the symbol is defined locally or was forced to be local because of a version file, we just want to emit a RELATIVE reloc. The entry in the global offset table will already have been initialized in the relocate_section function. */ - if (info->shared - && (info->symbolic || eh->dynindx == -1) + if (bfd_link_pic (info) + && (SYMBOLIC_BIND (info, eh) || eh->dynindx == -1) && eh->def_regular) { rela.r_info = ELF32_R_INFO (0, R_PARISC_DIR32); @@ -4398,13 +4406,13 @@ elf32_hppa_finish_dynamic_symbol (bfd *output_bfd, if ((eh->got.offset & 1) != 0) abort (); - bfd_put_32 (output_bfd, 0, htab->sgot->contents + (eh->got.offset & ~1)); + bfd_put_32 (output_bfd, 0, htab->etab.sgot->contents + (eh->got.offset & ~1)); rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_DIR32); rela.r_addend = 0; } - loc = htab->srelgot->contents; - loc += htab->srelgot->reloc_count++ * sizeof (Elf32_External_Rela); + loc = htab->etab.srelgot->contents; + loc += htab->etab.srelgot->reloc_count++ * sizeof (Elf32_External_Rela); bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); } @@ -4419,13 +4427,15 @@ elf32_hppa_finish_dynamic_symbol (bfd *output_bfd, || eh->root.type == bfd_link_hash_defweak))) abort (); - sec = htab->srelbss; - rela.r_offset = (eh->root.u.def.value + eh->root.u.def.section->output_offset + eh->root.u.def.section->output_section->vma); rela.r_addend = 0; rela.r_info = ELF32_R_INFO (eh->dynindx, R_PARISC_COPY); + if (eh->root.u.def.section == htab->etab.sdynrelro) + sec = htab->etab.sreldynrelro; + else + sec = htab->etab.srelbss; loc = sec->contents + sec->reloc_count++ * sizeof (Elf32_External_Rela); bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); } @@ -4489,7 +4499,7 @@ elf32_hppa_finish_dynamic_sections (bfd *output_bfd, dynobj = htab->etab.dynobj; - sgot = htab->sgot; + sgot = htab->etab.sgot; /* A broken linker script might have discarded the dynamic sections. Catch this here so that we do not seg-fault later on. */ if (sgot != NULL && bfd_is_abs_section (sgot->output_section)) @@ -4524,35 +4534,14 @@ elf32_hppa_finish_dynamic_sections (bfd *output_bfd, break; case DT_JMPREL: - s = htab->srelplt; + s = htab->etab.srelplt; dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; break; case DT_PLTRELSZ: - s = htab->srelplt; + s = htab->etab.srelplt; dyn.d_un.d_val = s->size; break; - - case DT_RELASZ: - /* Don't count procedure linkage table relocs in the - overall reloc count. */ - s = htab->srelplt; - if (s == NULL) - continue; - dyn.d_un.d_val -= s->size; - break; - - case DT_RELA: - /* We may not be using the standard ELF linker script. - If .rela.plt is the first .rela section, we adjust - DT_RELA to not include it. */ - s = htab->srelplt; - if (s == NULL) - continue; - if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset) - continue; - dyn.d_un.d_ptr += s->size; - break; } bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); @@ -4575,26 +4564,27 @@ elf32_hppa_finish_dynamic_sections (bfd *output_bfd, ->this_hdr.sh_entsize = GOT_ENTRY_SIZE; } - if (htab->splt != NULL && htab->splt->size != 0) + if (htab->etab.splt != NULL && htab->etab.splt->size != 0) { - /* Set plt entry size. */ - elf_section_data (htab->splt->output_section) - ->this_hdr.sh_entsize = PLT_ENTRY_SIZE; + /* Set plt entry size to 0 instead of PLT_ENTRY_SIZE, since we add the + plt stubs and as such the section does not hold a table of fixed-size + entries. */ + elf_section_data (htab->etab.splt->output_section)->this_hdr.sh_entsize = 0; if (htab->need_plt_stub) { /* Set up the .plt stub. */ - memcpy (htab->splt->contents - + htab->splt->size - sizeof (plt_stub), + memcpy (htab->etab.splt->contents + + htab->etab.splt->size - sizeof (plt_stub), plt_stub, sizeof (plt_stub)); - if ((htab->splt->output_offset - + htab->splt->output_section->vma - + htab->splt->size) + if ((htab->etab.splt->output_offset + + htab->etab.splt->output_section->vma + + htab->etab.splt->size) != (sgot->output_offset + sgot->output_section->vma)) { - (*_bfd_error_handler) + _bfd_error_handler (_(".got section not immediately after .plt section")); return FALSE; } @@ -4625,7 +4615,6 @@ elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type) /* Stuff for the BFD linker. */ #define bfd_elf32_bfd_final_link elf32_hppa_final_link #define bfd_elf32_bfd_link_hash_table_create elf32_hppa_link_hash_table_create -#define bfd_elf32_bfd_link_hash_table_free elf32_hppa_link_hash_table_free #define elf_backend_adjust_dynamic_symbol elf32_hppa_adjust_dynamic_symbol #define elf_backend_copy_indirect_symbol elf32_hppa_copy_indirect_symbol #define elf_backend_check_relocs elf32_hppa_check_relocs @@ -4654,9 +4643,12 @@ elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type) #define elf_backend_plt_readonly 0 #define elf_backend_want_plt_sym 0 #define elf_backend_got_header_size 8 +#define elf_backend_want_dynrelro 1 #define elf_backend_rela_normal 1 +#define elf_backend_dtrel_excludes_plt 1 +#define elf_backend_no_page_alias 1 -#define TARGET_BIG_SYM bfd_elf32_hppa_vec +#define TARGET_BIG_SYM hppa_elf32_vec #define TARGET_BIG_NAME "elf32-hppa" #define ELF_ARCH bfd_arch_hppa #define ELF_TARGET_ID HPPA32_ELF_DATA @@ -4668,7 +4660,7 @@ elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type) #include "elf32-target.h" #undef TARGET_BIG_SYM -#define TARGET_BIG_SYM bfd_elf32_hppa_linux_vec +#define TARGET_BIG_SYM hppa_elf32_linux_vec #undef TARGET_BIG_NAME #define TARGET_BIG_NAME "elf32-hppa-linux" #undef ELF_OSABI @@ -4679,7 +4671,7 @@ elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type) #include "elf32-target.h" #undef TARGET_BIG_SYM -#define TARGET_BIG_SYM bfd_elf32_hppa_nbsd_vec +#define TARGET_BIG_SYM hppa_elf32_nbsd_vec #undef TARGET_BIG_NAME #define TARGET_BIG_NAME "elf32-hppa-netbsd" #undef ELF_OSABI