X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Felf-m10300.c;h=a6a22b354e8ba59b484df72537631441df02cf5f;hb=64d2901806c171c0d949f8fb1b29b4e5ba8cf04d;hp=ef3233ac93491aabc31300f45a28cfc8857e4093;hpb=66e17d7f5306149e4ac421015d305d00eb1a2f0f;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf-m10300.c b/bfd/elf-m10300.c index ef3233ac93..a6a22b354e 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, 2012 Free Software Foundation, Inc. + Copyright (C) 1996-2015 Free Software Foundation, Inc. This file is part of BFD, the Binary File Descriptor library. @@ -143,11 +142,11 @@ static reloc_howto_type elf_mn10300_howto_table[] = /* Dummy relocation. Does nothing. */ HOWTO (R_MN10300_NONE, 0, - 2, - 16, + 3, + 0, FALSE, 0, - complain_overflow_bitfield, + complain_overflow_dont, bfd_elf_generic_reloc, "R_MN10300_NONE", FALSE, @@ -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; @@ -802,7 +806,13 @@ mn10300_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, unsigned int r_type; r_type = ELF32_R_TYPE (dst->r_info); - BFD_ASSERT (r_type < (unsigned int) R_MN10300_MAX); + if (r_type >= R_MN10300_MAX) + { + (*_bfd_error_handler) (_("%B: unrecognised MN10300 reloc number: %d"), + abfd, r_type); + bfd_set_error (bfd_error_bad_value); + r_type = R_MN10300_NONE; + } cache_ptr->howto = elf_mn10300_howto_table + r_type; } @@ -1079,6 +1089,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 +1156,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 +1174,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 +1681,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 +1695,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 +1711,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 +1721,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 +1736,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 +1754,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 +1777,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 +1808,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 +1847,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 +1895,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 +2016,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 +2039,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); @@ -2431,7 +2434,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 +2685,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 +3028,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; @@ -3486,9 +3489,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 +3929,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 +4604,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 +4627,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 +4648,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 +4813,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 +4836,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; @@ -4851,8 +4856,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; @@ -4869,10 +4874,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; @@ -4892,10 +4897,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 @@ -4931,7 +4937,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 @@ -4958,12 +4964,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); @@ -5007,7 +5013,7 @@ _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 @@ -5018,13 +5024,13 @@ _bfd_mn10300_elf_adjust_dynamic_symbol (struct bfd_link_info * info, { 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. */ @@ -5040,7 +5046,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) @@ -5048,7 +5054,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; @@ -5061,14 +5067,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); } @@ -5211,9 +5217,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) { @@ -5229,9 +5236,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 @@ -5308,8 +5315,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 @@ -5386,8 +5393,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 @@ -5402,7 +5408,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; @@ -5418,12 +5424,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) { @@ -5488,7 +5494,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) @@ -5543,7 +5549,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)) { @@ -5566,7 +5574,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 @@ -5587,8 +5595,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 '_'