X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felf-m10300.c;h=1dbb2f9b262842aa200786133a611499daaa755f;hb=6cabe1ea460c54c17ac877b2541eccf91d6b4b9c;hp=d5e183df21a3f5c4896d2283e2198a8bb1f87725;hpb=0a22ae8eb56103aec42f9263aa0e6737228d52d8;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf-m10300.c b/bfd/elf-m10300.c index d5e183df21..1dbb2f9b26 100644 --- a/bfd/elf-m10300.c +++ b/bfd/elf-m10300.c @@ -1,6 +1,5 @@ /* Matsushita 10300 specific support for 32-bit ELF - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 1996-2014 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -604,7 +603,7 @@ static reloc_howto_type elf_mn10300_howto_table[] = 0xffffffff, /* src_mask */ 0xffffffff, /* dst_mask */ FALSE), /* pcrel_offset */ - + HOWTO (R_MN10300_SYM_DIFF, /* type */ 0, /* rightshift */ 2, /* size (0 = byte, 1 = short, 2 = long) */ @@ -690,10 +689,12 @@ _bfd_mn10300_elf_create_got_section (bfd * abfd, asection * s; struct elf_link_hash_entry * h; const struct elf_backend_data * bed = get_elf_backend_data (abfd); + struct elf_link_hash_table *htab; int ptralign; /* This function may be called more than once. */ - if (bfd_get_section_by_name (abfd, ".got") != NULL) + htab = elf_hash_table (info); + if (htab->sgot != NULL) return TRUE; switch (bed->s->arch_size) @@ -721,7 +722,8 @@ _bfd_mn10300_elf_create_got_section (bfd * abfd, if (bed->plt_readonly) pltflags |= SEC_READONLY; - s = bfd_make_section_with_flags (abfd, ".plt", pltflags); + s = bfd_make_section_anyway_with_flags (abfd, ".plt", pltflags); + htab->splt = s; if (s == NULL || ! bfd_set_section_alignment (abfd, s, bed->plt_alignment)) return FALSE; @@ -732,19 +734,21 @@ _bfd_mn10300_elf_create_got_section (bfd * abfd, { h = _bfd_elf_define_linkage_sym (abfd, info, s, "_PROCEDURE_LINKAGE_TABLE_"); - elf_hash_table (info)->hplt = h; + htab->hplt = h; if (h == NULL) return FALSE; } - s = bfd_make_section_with_flags (abfd, ".got", flags); + s = bfd_make_section_anyway_with_flags (abfd, ".got", flags); + htab->sgot = s; if (s == NULL || ! bfd_set_section_alignment (abfd, s, ptralign)) return FALSE; if (bed->want_got_plt) { - s = bfd_make_section_with_flags (abfd, ".got.plt", flags); + s = bfd_make_section_anyway_with_flags (abfd, ".got.plt", flags); + htab->sgotplt = s; if (s == NULL || ! bfd_set_section_alignment (abfd, s, ptralign)) return FALSE; @@ -755,7 +759,7 @@ _bfd_mn10300_elf_create_got_section (bfd * abfd, because we don't want to define the symbol if we are not creating a global offset table. */ h = _bfd_elf_define_linkage_sym (abfd, info, s, "_GLOBAL_OFFSET_TABLE_"); - elf_hash_table (info)->hgot = h; + htab->hgot = h; if (h == NULL) return FALSE; @@ -1079,6 +1083,10 @@ mn10300_elf_check_relocs (bfd *abfd, while (h->root.type == bfd_link_hash_indirect || h->root.type == bfd_link_hash_warning) h = (struct elf_link_hash_entry *) h->root.u.i.link; + + /* PR15323, ref flags aren't set for references in the same + object. */ + h->root.non_ir_ref = 1; } r_type = ELF32_R_TYPE (rel->r_info); @@ -1142,7 +1150,7 @@ mn10300_elf_check_relocs (bfd *abfd, if (info->shared) info->flags |= DF_STATIC_TLS; /* Fall through */ - + case R_MN10300_TLS_GD: case R_MN10300_GOT32: case R_MN10300_GOT24: @@ -1160,24 +1168,22 @@ mn10300_elf_check_relocs (bfd *abfd, if (sgot == NULL) { - sgot = bfd_get_section_by_name (dynobj, ".got"); + sgot = htab->root.sgot; BFD_ASSERT (sgot != NULL); } if (srelgot == NULL && (h != NULL || info->shared)) { - srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); + srelgot = bfd_get_linker_section (dynobj, ".rela.got"); if (srelgot == NULL) { - srelgot = bfd_make_section_with_flags (dynobj, - ".rela.got", - (SEC_ALLOC - | SEC_LOAD - | SEC_HAS_CONTENTS - | SEC_IN_MEMORY - | SEC_LINKER_CREATED - | SEC_READONLY)); + flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS + | SEC_IN_MEMORY | SEC_LINKER_CREATED + | SEC_READONLY); + srelgot = bfd_make_section_anyway_with_flags (dynobj, + ".rela.got", + flags); if (srelgot == NULL || ! bfd_set_section_alignment (dynobj, srelgot, 2)) goto fail; @@ -1669,8 +1675,7 @@ mn10300_elf_final_link_relocate (reloc_howto_type *howto, return bfd_reloc_dangerous; /* Use global offset table as symbol value. */ - value = bfd_get_section_by_name (dynobj, - ".got")->output_section->vma; + value = htab->root.sgot->output_section->vma; value -= (input_section->output_section->vma + input_section->output_offset); value -= offset; @@ -1684,8 +1689,7 @@ mn10300_elf_final_link_relocate (reloc_howto_type *howto, return bfd_reloc_dangerous; /* Use global offset table as symbol value. */ - value = bfd_get_section_by_name (dynobj, - ".got")->output_section->vma; + value = htab->root.sgot->output_section->vma; value -= (input_section->output_section->vma + input_section->output_offset); value -= offset; @@ -1701,8 +1705,7 @@ mn10300_elf_final_link_relocate (reloc_howto_type *howto, if (dynobj == NULL) return bfd_reloc_dangerous; - value -= bfd_get_section_by_name (dynobj, - ".got")->output_section->vma; + value -= htab->root.sgot->output_section->vma; value += addend; bfd_put_32 (input_bfd, value, hit_data); @@ -1712,8 +1715,7 @@ mn10300_elf_final_link_relocate (reloc_howto_type *howto, if (dynobj == NULL) return bfd_reloc_dangerous; - value -= bfd_get_section_by_name (dynobj, - ".got")->output_section->vma; + value -= htab->root.sgot->output_section->vma; value += addend; if ((long) value > 0x7fffff || (long) value < -0x800000) @@ -1728,8 +1730,7 @@ mn10300_elf_final_link_relocate (reloc_howto_type *howto, if (dynobj == NULL) return bfd_reloc_dangerous; - value -= bfd_get_section_by_name (dynobj, - ".got")->output_section->vma; + value -= htab->root.sgot->output_section->vma; value += addend; if ((long) value > 0x7fff || (long) value < -0x8000) @@ -1747,8 +1748,7 @@ mn10300_elf_final_link_relocate (reloc_howto_type *howto, if (dynobj == NULL) return bfd_reloc_dangerous; - splt = bfd_get_section_by_name (dynobj, ".plt"); - + splt = htab->root.splt; value = (splt->output_section->vma + splt->output_offset + h->plt.offset) - value; @@ -1771,8 +1771,7 @@ mn10300_elf_final_link_relocate (reloc_howto_type *howto, if (dynobj == NULL) return bfd_reloc_dangerous; - splt = bfd_get_section_by_name (dynobj, ".plt"); - + splt = htab->root.splt; value = (splt->output_section->vma + splt->output_offset + h->plt.offset) - value; @@ -1803,15 +1802,14 @@ mn10300_elf_final_link_relocate (reloc_howto_type *howto, if (dynobj == NULL) return bfd_reloc_dangerous; - sgot = bfd_get_section_by_name (dynobj, ".got"); - + sgot = htab->root.sgot; BFD_ASSERT (sgot != NULL); value = htab->tls_ldm_got.offset + sgot->output_offset; bfd_put_32 (input_bfd, value, hit_data); if (!htab->tls_ldm_got.rel_emitted) { - asection * srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); + asection * srelgot = bfd_get_linker_section (dynobj, ".rela.got"); Elf_Internal_Rela rel; BFD_ASSERT (srelgot != NULL); @@ -1843,8 +1841,7 @@ mn10300_elf_final_link_relocate (reloc_howto_type *howto, if (dynobj == NULL) return bfd_reloc_dangerous; - sgot = bfd_get_section_by_name (dynobj, ".got"); - + sgot = htab->root.sgot; if (r_type == R_MN10300_TLS_GD) value = dtpoff (info, value); @@ -1892,7 +1889,7 @@ mn10300_elf_final_link_relocate (reloc_howto_type *howto, asection * srelgot; Elf_Internal_Rela outrel; - srelgot = bfd_get_section_by_name (dynobj, ".rela.got"); + srelgot = bfd_get_linker_section (dynobj, ".rela.got"); BFD_ASSERT (srelgot != NULL); outrel.r_offset = (sgot->output_section->vma @@ -2013,7 +2010,7 @@ mn10300_elf_relocate_section (bfd *output_bfd, bfd_reloc_status_type r; int tls_r_type; bfd_boolean unresolved_reloc = FALSE; - bfd_boolean warned; + bfd_boolean warned, ignored; struct elf_link_hash_entry * hh; relocation = 0; @@ -2036,7 +2033,7 @@ mn10300_elf_relocate_section (bfd *output_bfd, RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, r_symndx, symtab_hdr, sym_hashes, hh, sec, relocation, - unresolved_reloc, warned); + unresolved_reloc, warned, ignored); } h = elf_mn10300_hash_entry (hh); @@ -2115,9 +2112,9 @@ mn10300_elf_relocate_section (bfd *output_bfd, h->root.root.root.string); } - if (sec != NULL && elf_discarded_section (sec)) + if (sec != NULL && discarded_section (sec)) RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, - rel, relend, howto, contents); + rel, 1, relend, howto, 0, contents); if (info->relocatable) continue; @@ -2431,7 +2428,7 @@ mn10300_elf_relax_delete_bytes (bfd *abfd, serve to keep the section artifically inflated. */ if (ELF32_R_TYPE ((irelend - 1)->r_info) == (int) R_MN10300_ALIGN) --irelend; - + /* The deletion must stop at the next ALIGN reloc for an aligment power larger than, or not a multiple of, the number of bytes we are deleting. */ @@ -2682,7 +2679,7 @@ mn10300_elf_relax_section (bfd *abfd, /* Iterate over all the input bfds. */ for (input_bfd = link_info->input_bfds; input_bfd != NULL; - input_bfd = input_bfd->link_next) + input_bfd = input_bfd->link.next) { /* We're going to need all the symbols for each bfd. */ symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; @@ -3025,7 +3022,7 @@ mn10300_elf_relax_section (bfd *abfd, a "call" instruction. */ for (input_bfd = link_info->input_bfds; input_bfd != NULL; - input_bfd = input_bfd->link_next) + input_bfd = input_bfd->link.next) { /* We're going to need all the local symbols for each bfd. */ symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr; @@ -3390,7 +3387,7 @@ mn10300_elf_relax_section (bfd *abfd, isym->st_name); if ((sym_sec->flags & SEC_MERGE) - && sym_sec->sec_info_type == ELF_INFO_TYPE_MERGE) + && sym_sec->sec_info_type == SEC_INFO_TYPE_MERGE) { symval = isym->st_value; @@ -3486,9 +3483,7 @@ mn10300_elf_relax_section (bfd *abfd, { asection * splt; - splt = bfd_get_section_by_name (elf_hash_table (link_info) - ->dynobj, ".plt"); - + splt = hash_table->root.splt; value = ((splt->output_section->vma + splt->output_offset + h->root.plt.offset) @@ -3928,9 +3923,7 @@ mn10300_elf_relax_section (bfd *abfd, { asection * sgot; - sgot = bfd_get_section_by_name (elf_hash_table (link_info) - ->dynobj, ".got"); - + sgot = hash_table->root.sgot; if (ELF32_R_TYPE (irel->r_info) == (int) R_MN10300_GOT32) { value = sgot->output_offset; @@ -4605,6 +4598,21 @@ _bfd_mn10300_copy_indirect_symbol (struct bfd_link_info * info, _bfd_elf_link_hash_copy_indirect (info, dir, ind); } +/* Destroy an mn10300 ELF linker hash table. */ + +static void +elf32_mn10300_link_hash_table_free (bfd *obfd) +{ + struct elf32_mn10300_link_hash_table *ret + = (struct elf32_mn10300_link_hash_table *) obfd->link.hash; + + obfd->link.hash = &ret->static_hash_table->root.root; + _bfd_elf_link_hash_table_free (obfd); + obfd->is_linker_output = TRUE; + obfd->link.hash = &ret->root.root; + _bfd_elf_link_hash_table_free (obfd); +} + /* Create an mn10300 ELF linker hash table. */ static struct bfd_link_hash_table * @@ -4613,27 +4621,12 @@ elf32_mn10300_link_hash_table_create (bfd *abfd) struct elf32_mn10300_link_hash_table *ret; bfd_size_type amt = sizeof (* ret); - ret = bfd_malloc (amt); + ret = bfd_zmalloc (amt); if (ret == NULL) return NULL; - if (!_bfd_elf_link_hash_table_init (&ret->root, abfd, - elf32_mn10300_link_hash_newfunc, - sizeof (struct elf32_mn10300_link_hash_entry), - MN10300_ELF_DATA)) - { - free (ret); - return NULL; - } - - ret->flags = 0; - ret->tls_ldm_got.refcount = 0; - ret->tls_ldm_got.offset = -1; - ret->tls_ldm_got.got_allocated = 0; - ret->tls_ldm_got.rel_emitted = 0; - amt = sizeof (struct elf_link_hash_table); - ret->static_hash_table = bfd_malloc (amt); + ret->static_hash_table = bfd_zmalloc (amt); if (ret->static_hash_table == NULL) { free (ret); @@ -4649,21 +4642,25 @@ elf32_mn10300_link_hash_table_create (bfd *abfd) free (ret); return NULL; } - return & ret->root.root; -} -/* Free an mn10300 ELF linker hash table. */ + abfd->is_linker_output = FALSE; + abfd->link.hash = NULL; + if (!_bfd_elf_link_hash_table_init (&ret->root, abfd, + elf32_mn10300_link_hash_newfunc, + sizeof (struct elf32_mn10300_link_hash_entry), + MN10300_ELF_DATA)) + { + abfd->is_linker_output = TRUE; + abfd->link.hash = &ret->static_hash_table->root.root; + _bfd_elf_link_hash_table_free (abfd); + free (ret); + return NULL; + } + ret->root.root.hash_table_free = elf32_mn10300_link_hash_table_free; -static void -elf32_mn10300_link_hash_table_free (struct bfd_link_hash_table *hash) -{ - struct elf32_mn10300_link_hash_table *ret - = (struct elf32_mn10300_link_hash_table *) hash; + ret->tls_ldm_got.offset = -1; - _bfd_generic_link_hash_table_free - ((struct bfd_link_hash_table *) ret->static_hash_table); - _bfd_generic_link_hash_table_free - ((struct bfd_link_hash_table *) ret); + return & ret->root.root; } static unsigned long @@ -4810,6 +4807,7 @@ _bfd_mn10300_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) flagword flags; asection * s; const struct elf_backend_data * bed = get_elf_backend_data (abfd); + struct elf32_mn10300_link_hash_table *htab = elf32_mn10300_hash_table (info); int ptralign = 0; switch (bed->s->arch_size) @@ -4832,10 +4830,11 @@ _bfd_mn10300_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED); - s = bfd_make_section_with_flags (abfd, - (bed->default_use_rela_p - ? ".rela.plt" : ".rel.plt"), - flags | SEC_READONLY); + s = bfd_make_section_anyway_with_flags (abfd, + (bed->default_use_rela_p + ? ".rela.plt" : ".rel.plt"), + flags | SEC_READONLY); + htab->root.srelplt = s; if (s == NULL || ! bfd_set_section_alignment (abfd, s, ptralign)) return FALSE; @@ -4843,32 +4842,6 @@ _bfd_mn10300_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) if (! _bfd_mn10300_elf_create_got_section (abfd, info)) return FALSE; - { - const char * secname; - char * relname; - flagword secflags; - asection * sec; - - for (sec = abfd->sections; sec; sec = sec->next) - { - secflags = bfd_get_section_flags (abfd, sec); - if ((secflags & (SEC_DATA | SEC_LINKER_CREATED)) - || ((secflags & SEC_HAS_CONTENTS) != SEC_HAS_CONTENTS)) - continue; - - secname = bfd_get_section_name (abfd, sec); - relname = bfd_malloc (strlen (secname) + 6); - strcpy (relname, ".rela"); - strcat (relname, secname); - - s = bfd_make_section_with_flags (abfd, relname, - flags | SEC_READONLY); - if (s == NULL - || ! bfd_set_section_alignment (abfd, s, ptralign)) - return FALSE; - } - } - if (bed->want_dynbss) { /* The .dynbss section is a place to put symbols which are defined @@ -4877,8 +4850,8 @@ _bfd_mn10300_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) image and use a R_*_COPY reloc to tell the dynamic linker to initialize them at run time. The linker script puts the .dynbss section into the .bss section of the final image. */ - s = bfd_make_section_with_flags (abfd, ".dynbss", - SEC_ALLOC | SEC_LINKER_CREATED); + s = bfd_make_section_anyway_with_flags (abfd, ".dynbss", + SEC_ALLOC | SEC_LINKER_CREATED); if (s == NULL) return FALSE; @@ -4895,10 +4868,10 @@ _bfd_mn10300_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) copy relocs. */ if (! info->shared) { - s = bfd_make_section_with_flags (abfd, - (bed->default_use_rela_p - ? ".rela.bss" : ".rel.bss"), - flags | SEC_READONLY); + s = bfd_make_section_anyway_with_flags (abfd, + (bed->default_use_rela_p + ? ".rela.bss" : ".rel.bss"), + flags | SEC_READONLY); if (s == NULL || ! bfd_set_section_alignment (abfd, s, ptralign)) return FALSE; @@ -4918,10 +4891,11 @@ static bfd_boolean _bfd_mn10300_elf_adjust_dynamic_symbol (struct bfd_link_info * info, struct elf_link_hash_entry * h) { + struct elf32_mn10300_link_hash_table *htab = elf32_mn10300_hash_table (info); bfd * dynobj; asection * s; - dynobj = elf_hash_table (info)->dynobj; + dynobj = htab->root.dynobj; /* Make sure we know what is going on here. */ BFD_ASSERT (dynobj != NULL @@ -4957,7 +4931,7 @@ _bfd_mn10300_elf_adjust_dynamic_symbol (struct bfd_link_info * info, return FALSE; } - s = bfd_get_section_by_name (dynobj, ".plt"); + s = htab->root.splt; BFD_ASSERT (s != NULL); /* If this is the first .plt entry, make room for the special @@ -4984,12 +4958,12 @@ _bfd_mn10300_elf_adjust_dynamic_symbol (struct bfd_link_info * info, /* We also need to make an entry in the .got.plt section, which will be placed in the .got section by the linker script. */ - s = bfd_get_section_by_name (dynobj, ".got.plt"); + s = htab->root.sgotplt; BFD_ASSERT (s != NULL); s->size += 4; /* We also need to make an entry in the .rela.plt section. */ - s = bfd_get_section_by_name (dynobj, ".rela.plt"); + s = bfd_get_linker_section (dynobj, ".rela.plt"); BFD_ASSERT (s != NULL); s->size += sizeof (Elf32_External_Rela); @@ -5023,13 +4997,6 @@ _bfd_mn10300_elf_adjust_dynamic_symbol (struct bfd_link_info * info, if (!h->non_got_ref) return TRUE; - if (h->size == 0) - { - (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"), - h->root.root.string); - return TRUE; - } - /* We must allocate the symbol in our .dynbss section, which will become part of the .bss section of the executable. There will be an entry for this symbol in the .dynsym section. The dynamic @@ -5040,24 +5007,24 @@ _bfd_mn10300_elf_adjust_dynamic_symbol (struct bfd_link_info * info, both the dynamic object and the regular object will refer to the same memory location for the variable. */ - s = bfd_get_section_by_name (dynobj, ".dynbss"); + s = bfd_get_linker_section (dynobj, ".dynbss"); BFD_ASSERT (s != NULL); /* We must generate a R_MN10300_COPY reloc to tell the dynamic linker to copy the initial value out of the dynamic object and into the runtime process image. We need to remember the offset into the .rela.bss section we are going to use. */ - if ((h->root.u.def.section->flags & SEC_ALLOC) != 0) + if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0) { asection * srel; - srel = bfd_get_section_by_name (dynobj, ".rela.bss"); + srel = bfd_get_linker_section (dynobj, ".rela.bss"); BFD_ASSERT (srel != NULL); srel->size += sizeof (Elf32_External_Rela); h->needs_copy = 1; } - return _bfd_elf_adjust_dynamic_copy (h, s); + return _bfd_elf_adjust_dynamic_copy (info, h, s); } /* Set the sizes of the dynamic sections. */ @@ -5073,7 +5040,7 @@ _bfd_mn10300_elf_size_dynamic_sections (bfd * output_bfd, bfd_boolean relocs; bfd_boolean reltext; - dynobj = elf_hash_table (info)->dynobj; + dynobj = htab->root.dynobj; BFD_ASSERT (dynobj != NULL); if (elf_hash_table (info)->dynamic_sections_created) @@ -5081,7 +5048,7 @@ _bfd_mn10300_elf_size_dynamic_sections (bfd * output_bfd, /* Set the contents of the .interp section to the interpreter. */ if (info->executable) { - s = bfd_get_section_by_name (dynobj, ".interp"); + s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); s->size = sizeof ELF_DYNAMIC_INTERPRETER; s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; @@ -5094,14 +5061,14 @@ _bfd_mn10300_elf_size_dynamic_sections (bfd * output_bfd, not actually use these entries. Reset the size of .rela.got, which will cause it to get stripped from the output file below. */ - s = bfd_get_section_by_name (dynobj, ".rela.got"); + s = htab->root.sgot; if (s != NULL) s->size = 0; } if (htab->tls_ldm_got.refcount > 0) { - s = bfd_get_section_by_name (dynobj, ".rela.got"); + s = bfd_get_linker_section (dynobj, ".rela.got"); BFD_ASSERT (s != NULL); s->size += sizeof (Elf32_External_Rela); } @@ -5244,9 +5211,10 @@ _bfd_mn10300_elf_finish_dynamic_symbol (bfd * output_bfd, struct elf_link_hash_entry * h, Elf_Internal_Sym * sym) { + struct elf32_mn10300_link_hash_table *htab = elf32_mn10300_hash_table (info); bfd * dynobj; - dynobj = elf_hash_table (info)->dynobj; + dynobj = htab->root.dynobj; if (h->plt.offset != (bfd_vma) -1) { @@ -5262,9 +5230,9 @@ _bfd_mn10300_elf_finish_dynamic_symbol (bfd * output_bfd, BFD_ASSERT (h->dynindx != -1); - splt = bfd_get_section_by_name (dynobj, ".plt"); - sgot = bfd_get_section_by_name (dynobj, ".got.plt"); - srel = bfd_get_section_by_name (dynobj, ".rela.plt"); + splt = htab->root.splt; + sgot = htab->root.sgotplt; + srel = bfd_get_linker_section (dynobj, ".rela.plt"); BFD_ASSERT (splt != NULL && sgot != NULL && srel != NULL); /* Get the index in the procedure linkage table which @@ -5341,8 +5309,8 @@ _bfd_mn10300_elf_finish_dynamic_symbol (bfd * output_bfd, Elf_Internal_Rela rel; /* This symbol has an entry in the global offset table. Set it up. */ - sgot = bfd_get_section_by_name (dynobj, ".got"); - srel = bfd_get_section_by_name (dynobj, ".rela.got"); + sgot = htab->root.sgot; + srel = bfd_get_linker_section (dynobj, ".rela.got"); BFD_ASSERT (sgot != NULL && srel != NULL); rel.r_offset = (sgot->output_section->vma @@ -5419,8 +5387,7 @@ _bfd_mn10300_elf_finish_dynamic_symbol (bfd * output_bfd, && (h->root.type == bfd_link_hash_defined || h->root.type == bfd_link_hash_defweak)); - s = bfd_get_section_by_name (h->root.u.def.section->owner, - ".rela.bss"); + s = bfd_get_linker_section (dynobj, ".rela.bss"); BFD_ASSERT (s != NULL); rel.r_offset = (h->root.u.def.value @@ -5435,7 +5402,7 @@ _bfd_mn10300_elf_finish_dynamic_symbol (bfd * output_bfd, } /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */ - if (streq (h->root.root.string, "_DYNAMIC") + if (h == elf_hash_table (info)->hdynamic || h == elf_hash_table (info)->hgot) sym->st_shndx = SHN_ABS; @@ -5451,12 +5418,12 @@ _bfd_mn10300_elf_finish_dynamic_sections (bfd * output_bfd, bfd * dynobj; asection * sgot; asection * sdyn; + struct elf32_mn10300_link_hash_table *htab = elf32_mn10300_hash_table (info); - dynobj = elf_hash_table (info)->dynobj; - - sgot = bfd_get_section_by_name (dynobj, ".got.plt"); + dynobj = htab->root.dynobj; + sgot = htab->root.sgotplt; BFD_ASSERT (sgot != NULL); - sdyn = bfd_get_section_by_name (dynobj, ".dynamic"); + sdyn = bfd_get_linker_section (dynobj, ".dynamic"); if (elf_hash_table (info)->dynamic_sections_created) { @@ -5521,7 +5488,7 @@ _bfd_mn10300_elf_finish_dynamic_sections (bfd * output_bfd, } /* Fill in the first entry in the procedure linkage table. */ - splt = bfd_get_section_by_name (dynobj, ".plt"); + splt = htab->root.splt; if (splt && splt->size > 0) { if (info->shared) @@ -5576,7 +5543,9 @@ _bfd_mn10300_elf_finish_dynamic_sections (bfd * output_bfd, properly. */ static enum elf_reloc_type_class -_bfd_mn10300_elf_reloc_type_class (const Elf_Internal_Rela *rela) +_bfd_mn10300_elf_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED, + const asection *rel_sec ATTRIBUTE_UNUSED, + const Elf_Internal_Rela *rela) { switch ((int) ELF32_R_TYPE (rela->r_info)) { @@ -5599,7 +5568,7 @@ mn10300_elf_mkobject (bfd *abfd) #define bfd_elf32_mkobject mn10300_elf_mkobject #ifndef ELF_ARCH -#define TARGET_LITTLE_SYM bfd_elf32_mn10300_vec +#define TARGET_LITTLE_SYM mn10300_elf32_vec #define TARGET_LITTLE_NAME "elf32-mn10300" #define ELF_ARCH bfd_arch_mn10300 #define ELF_TARGET_ID MN10300_ELF_DATA @@ -5620,8 +5589,6 @@ mn10300_elf_mkobject (bfd *abfd) mn10300_elf_get_relocated_section_contents #define bfd_elf32_bfd_link_hash_table_create \ elf32_mn10300_link_hash_table_create -#define bfd_elf32_bfd_link_hash_table_free \ - elf32_mn10300_link_hash_table_free #ifndef elf_symbol_leading_char #define elf_symbol_leading_char '_'