X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Felf32-cr16.c;h=20015a4e3e0ffcb6a4628225c679459eed258488;hb=a2bea3245ecf4ff67f923c85adf57aa78423eb45;hp=354cbd91f764a1509a45484532ade491ac0c530b;hpb=4dfe6ac6feb4515960e05c7c4a428b54318c75a3;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-cr16.c b/bfd/elf32-cr16.c index 354cbd91f7..20015a4e3e 100644 --- a/bfd/elf32-cr16.c +++ b/bfd/elf32-cr16.c @@ -1,5 +1,5 @@ /* BFD back-end for National Semiconductor's CR16 ELF - Copyright 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 2007-2016 Free Software Foundation, Inc. Written by M R Swami Reddy. This file is part of BFD, the Binary File Descriptor library. @@ -115,8 +115,8 @@ static reloc_howto_type cr16_elf_howto_table[] = { HOWTO (R_CR16_NONE, /* type */ 0, /* rightshift */ - 2, /* size */ - 32, /* bitsize */ + 3, /* size */ + 0, /* bitsize */ FALSE, /* pc_relative */ 0, /* bitpos */ complain_overflow_dont, /* complain_on_overflow */ @@ -585,7 +585,7 @@ _bfd_cr16_elf_create_got_section (bfd * abfd, struct bfd_link_info * info) int ptralign; /* This function may be called more than once. */ - if (bfd_get_section_by_name (abfd, ".got") != NULL) + if (bfd_get_linker_section (abfd, ".got") != NULL) return TRUE; switch (bed->s->arch_size) @@ -606,14 +606,14 @@ _bfd_cr16_elf_create_got_section (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, ".got", flags); + s = bfd_make_section_anyway_with_flags (abfd, ".got", flags); 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); if (s == NULL || ! bfd_set_section_alignment (abfd, s, ptralign)) return FALSE; @@ -673,7 +673,13 @@ elf_cr16_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr, { unsigned int r_type = ELF32_R_TYPE (dst->r_info); - BFD_ASSERT (r_type < (unsigned int) R_CR16_MAX); + if (r_type >= R_CR16_MAX) + { + (*_bfd_error_handler) (_("%B: unrecognised CR16 reloc number: %d"), + abfd, r_type); + bfd_set_error (bfd_error_bad_value); + r_type = R_CR16_NONE; + } cache_ptr->howto = cr16_elf_howto_table + r_type; } @@ -699,7 +705,7 @@ cr16_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, srelgot = NULL; bfd_boolean result = FALSE; - if (info->relocatable) + if (bfd_link_relocatable (info)) return TRUE; symtab_hdr = &elf_tdata (abfd)->symtab_hdr; @@ -725,6 +731,10 @@ cr16_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, 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; } /* Some relocs require a global offset table. */ @@ -752,24 +762,22 @@ cr16_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, if (sgot == NULL) { - sgot = bfd_get_section_by_name (dynobj, ".got"); + sgot = bfd_get_linker_section (dynobj, ".got"); BFD_ASSERT (sgot != NULL); } if (srelgot == NULL - && (h != NULL || info->executable)) + && (h != NULL || bfd_link_executable (info))) { - 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; @@ -820,7 +828,7 @@ cr16_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, asection *sec, local_got_offsets[r_symndx] = sgot->size; - if (info->executable) + if (bfd_link_executable (info)) /* If we are generating a shared object, we need to output a R_CR16_RELATIVE reloc so that the dynamic linker can adjust this GOT entry. */ @@ -862,10 +870,8 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto, bfd_byte *hit_data = contents + offset; bfd_vma reloc_bits, check, Rvalue1; bfd * dynobj; - bfd_vma * local_got_offsets; dynobj = elf_hash_table (info)->dynobj; - local_got_offsets = elf_local_got_offsets (input_bfd); switch (r_type) { @@ -916,7 +922,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto, /* We only care about the addend, where the difference between expressions is kept. */ Rvalue = 0; - + default: break; } @@ -1047,9 +1053,9 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto, | ((Rvalue >> 16) & 0xf)), hit_data); bfd_put_16 (input_bfd, (Rvalue) & 0xffff, hit_data + 2); } - else if (r_type == R_CR16_GOT_REGREL20) + else if (r_type == R_CR16_GOT_REGREL20) { - asection * sgot = bfd_get_section_by_name (dynobj, ".got"); + asection * sgot = bfd_get_linker_section (dynobj, ".got"); if (h != NULL) { @@ -1064,7 +1070,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto, -Bsymbolic link and the symbol is defined locally, or the symbol was forced to be local because of a version file. We must initialize - this entry in the global offset table. + this entry in the global offset table. When doing a dynamic link, we create a .rela.got relocation entry to initialize the value. This is done in the finish_dynamic_symbol routine. */ @@ -1084,7 +1090,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto, Rvalue += addend; - /* REVISIT: if ((long) Rvalue > 0xffffff || + /* REVISIT: if ((long) Rvalue > 0xffffff || (long) Rvalue < -0x800000). */ if ((long) Rvalue > 0xffffff || (long) Rvalue < 0) return bfd_reloc_overflow; @@ -1098,7 +1104,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto, else if (r_type == R_CR16_GOTC_REGREL20) { asection * sgot; - sgot = bfd_get_section_by_name (dynobj, ".got"); + sgot = bfd_get_linker_section (dynobj, ".got"); if (h != NULL) { @@ -1115,7 +1121,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto, -Bsymbolic link and the symbol is defined locally, or the symbol was forced to be local because of a version file. We must initialize - this entry in the global offset table. + this entry in the global offset table. When doing a dynamic link, we create a .rela.got relocation entry to initialize the value. This is done in the finish_dynamic_symbol routine. */ @@ -1146,7 +1152,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto, Rvalue += Rvalue1; /* Check for range. */ - /* REVISIT: if ((long) Rvalue > 0xffffff + /* REVISIT: if ((long) Rvalue > 0xffffff || (long) Rvalue < -0x800000). */ if ((long) Rvalue > 0xffffff || (long) Rvalue < 0) return bfd_reloc_overflow; @@ -1228,7 +1234,7 @@ cr16_elf_final_link_relocate (reloc_howto_type *howto, } else if (r_type == R_CR16_NUM32) { - Rvalue1 = (bfd_get_32 (input_bfd, hit_data)); + Rvalue1 = (bfd_get_32 (input_bfd, hit_data)); /* Add or subtract the offset value */ if (Rvalue1 & 0x80000000) @@ -1262,7 +1268,6 @@ elf32_cr16_relax_delete_bytes (struct bfd_link_info *link_info, bfd *abfd, unsigned int sec_shndx; bfd_byte *contents; Elf_Internal_Rela *irel, *irelend; - Elf_Internal_Rela *irelalign; bfd_vma toaddr; Elf_Internal_Sym *isym; Elf_Internal_Sym *isymend; @@ -1275,9 +1280,6 @@ elf32_cr16_relax_delete_bytes (struct bfd_link_info *link_info, bfd *abfd, contents = elf_section_data (sec)->this_hdr.contents; - /* The deletion must stop at the next ALIGN reloc for an aligment - power larger than the number of bytes we are deleting. */ - irelalign = NULL; toaddr = sec->size; irel = elf_section_data (sec)->relocs; @@ -1317,7 +1319,7 @@ elf32_cr16_relax_delete_bytes (struct bfd_link_info *link_info, bfd *abfd, && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH16 && ELF32_R_TYPE (irel->r_info) != (int) R_CR16_SWITCH32) continue; - + r_symndx = ELF32_R_SYM (irel->r_info); rsym = (Elf_Internal_Sym *) symtab_hdr->contents + r_symndx; @@ -1429,26 +1431,19 @@ elf32_cr16_relocate_section (bfd *output_bfd, struct bfd_link_info *info, } else { - bfd_boolean unresolved_reloc, warned; + bfd_boolean unresolved_reloc, warned, ignored; RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, r_symndx, symtab_hdr, sym_hashes, h, sec, relocation, - unresolved_reloc, warned); + unresolved_reloc, warned, ignored); } - if (sec != NULL && elf_discarded_section (sec)) - { - /* For relocs against symbols from removed linkonce sections, - or sections discarded by a linker script, we just want the - section contents zeroed. Avoid any special processing. */ - _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset); - rel->r_info = 0; - rel->r_addend = 0; - continue; - } - - if (info->relocatable) + if (sec != NULL && discarded_section (sec)) + RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section, + rel, 1, relend, howto, 0, contents); + + if (bfd_link_relocatable (info)) continue; r = cr16_elf_final_link_relocate (howto, input_bfd, output_bfd, @@ -1675,7 +1670,7 @@ elf32_cr16_link_hash_table_create (bfd *abfd) struct elf_link_hash_table *ret; bfd_size_type amt = sizeof (struct elf_link_hash_table); - ret = (struct elf_link_hash_table *) bfd_malloc (amt); + ret = (struct elf_link_hash_table *) bfd_zmalloc (amt); if (ret == (struct elf_link_hash_table *) NULL) return NULL; @@ -1691,18 +1686,6 @@ elf32_cr16_link_hash_table_create (bfd *abfd) return &ret->root; } -/* Free an cr16 ELF linker hash table. */ - -static void -elf32_cr16_link_hash_table_free (struct bfd_link_hash_table *hash) -{ - struct elf_link_hash_table *ret - = (struct elf_link_hash_table *) hash; - - _bfd_generic_link_hash_table_free - ((struct bfd_link_hash_table *) ret); -} - static unsigned long elf_cr16_mach (flagword flags) { @@ -1793,7 +1776,7 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec, /* We don't have to do anything for a relocatable link, if this section does not have relocs, or if this is not a code section. */ - if (link_info->relocatable + if (bfd_link_relocatable (link_info) || (sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0 || (sec->flags & SEC_CODE) == 0) @@ -1996,7 +1979,7 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec, bfd_vma value = symval; unsigned short is_add_mov = 0; bfd_vma value1 = 0; - + /* Get the existing value from the mcode */ value1 = ((bfd_get_32 (abfd, contents + irel->r_offset + 2) >> 16) |(((bfd_get_32 (abfd, contents + irel->r_offset + 2) & 0xffff) << 16))); @@ -2011,7 +1994,7 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec, /* Verify it's a 'arithmetic ADDD or MOVD instruction'. For ADDD and MOVD only, convert to IMM32 -> IMM20. */ - + if (((code & 0xfff0) == 0x0070) || ((code & 0xfff0) == 0x0020)) is_add_mov = 1; @@ -2031,7 +2014,7 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec, bfd_put_8 (abfd, (code & 0xf) << 4, contents + irel->r_offset); - /* If existing value is nagavive adjust approriately + /* If existing value is nagavive adjust approriately place the 16-20bits (ie 4 bit) in new opcode, as the 0xffffxxxx, the higher 2 byte values removed. */ if (value1 & 0x80000000) @@ -2055,7 +2038,7 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec, } /* See if the value will fit in 16 bits. */ - if ((!is_add_mov) + if ((!is_add_mov) && ((long)(value + value1) < 0x7fff && (long)(value + value1) > 0)) { unsigned short code; @@ -2080,7 +2063,7 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec, bfd_put_8 (abfd, 0xb0 | (code & 0xf), contents + irel->r_offset); - /* If existing value is nagavive adjust approriately + /* If existing value is nagavive adjust approriately place the 12-16bits (ie 4 bit) in new opcode, as the 0xfffffxxx, the higher 2 byte values removed. */ if (value1 & 0x80000000) @@ -2107,7 +2090,7 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec, #if 0 /* Try to turn a 16bit immediate address into a 4bit immediate address. */ - if ((ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM20) + if ((ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM20) || (ELF32_R_TYPE (irel->r_info) == (int) R_CR16_IMM16)) { bfd_vma value = symval; @@ -2215,7 +2198,7 @@ elf32_cr16_relax_section (bfd *abfd, asection *sec, else /* Cache the section contents for elf_link_input_bfd. */ elf_section_data (sec)->this_hdr.contents = contents; - + } if (internal_relocs != NULL @@ -2291,10 +2274,10 @@ _bfd_cr16_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); if (s == NULL || ! bfd_set_section_alignment (abfd, s, ptralign)) return FALSE; @@ -2302,32 +2285,6 @@ _bfd_cr16_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) if (! _bfd_cr16_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 = (char *) 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 @@ -2336,8 +2293,8 @@ _bfd_cr16_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; @@ -2352,12 +2309,12 @@ _bfd_cr16_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) be needed, we can discard it later. We will never need this section when generating a shared object, since they do not use copy relocs. */ - if (! info->executable) + if (! bfd_link_executable (info)) { - 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; @@ -2396,7 +2353,7 @@ _bfd_cr16_elf_adjust_dynamic_symbol (struct bfd_link_info * info, if (h->type == STT_FUNC || h->needs_plt) { - if (! info->executable + if (! bfd_link_executable (info) && !h->def_dynamic && !h->ref_dynamic) { @@ -2419,13 +2376,13 @@ _bfd_cr16_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 = bfd_get_linker_section (dynobj, ".got.plt"); 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); @@ -2451,7 +2408,7 @@ _bfd_cr16_elf_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->executable) + if (bfd_link_executable (info)) return TRUE; /* If there are no references to this symbol that do not use the @@ -2459,13 +2416,6 @@ _bfd_cr16_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 @@ -2476,24 +2426,24 @@ _bfd_cr16_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_CR16_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. */ @@ -2514,10 +2464,10 @@ _bfd_cr16_elf_size_dynamic_sections (bfd * output_bfd, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (info->executable) + if (bfd_link_executable (info) && !info->nointerp) { #if 0 - 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; @@ -2531,7 +2481,7 @@ _bfd_cr16_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 = bfd_get_linker_section (dynobj, ".rela.got"); if (s != NULL) s->size = 0; } @@ -2631,7 +2581,7 @@ _bfd_cr16_elf_size_dynamic_sections (bfd * output_bfd, but we 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 (!_bfd_elf_add_dynamic_entry (info, DT_DEBUG, 0)) return FALSE; @@ -2686,8 +2636,8 @@ _bfd_cr16_elf_finish_dynamic_symbol (bfd * output_bfd, /* 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 = bfd_get_linker_section (dynobj, ".got"); + srel = bfd_get_linker_section (dynobj, ".rela.got"); BFD_ASSERT (sgot != NULL && srel != NULL); rel.r_offset = (sgot->output_section->vma @@ -2699,7 +2649,7 @@ _bfd_cr16_elf_finish_dynamic_symbol (bfd * output_bfd, the symbol was forced to be local because of a version file. The entry in the global offset table will already have been initialized in the relocate_section function. */ - if (info->executable + if (bfd_link_executable (info) && (info->symbolic || h->dynindx == -1) && h->def_regular) { @@ -2731,8 +2681,7 @@ _bfd_cr16_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 @@ -2747,7 +2696,7 @@ _bfd_cr16_elf_finish_dynamic_symbol (bfd * output_bfd, } /* Mark _DYNAMIC and _GLOBAL_OFFSET_TABLE_ as absolute. */ - if (strcmp (h->root.root.string, "_DYNAMIC") == 0 + if (h == elf_hash_table (info)->hdynamic || h == elf_hash_table (info)->hgot) sym->st_shndx = SHN_ABS; @@ -2766,9 +2715,9 @@ _bfd_cr16_elf_finish_dynamic_sections (bfd * output_bfd, dynobj = elf_hash_table (info)->dynobj; - sgot = bfd_get_section_by_name (dynobj, ".got.plt"); + sgot = bfd_get_linker_section (dynobj, ".got.plt"); 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) { @@ -2794,21 +2743,19 @@ _bfd_cr16_elf_finish_dynamic_sections (bfd * output_bfd, break; case DT_PLTGOT: - name = ".got"; + name = ".got.plt"; goto get_vma; case DT_JMPREL: name = ".rela.plt"; get_vma: - s = bfd_get_section_by_name (output_bfd, name); - BFD_ASSERT (s != NULL); - dyn.d_un.d_ptr = s->vma; + s = bfd_get_linker_section (dynobj, name); + dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); break; case DT_PLTRELSZ: - s = bfd_get_section_by_name (output_bfd, ".rela.plt"); - BFD_ASSERT (s != NULL); + s = bfd_get_linker_section (dynobj, ".rela.plt"); dyn.d_un.d_val = s->size; bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); break; @@ -2823,7 +2770,7 @@ _bfd_cr16_elf_finish_dynamic_sections (bfd * output_bfd, the linker script arranges for .rela.plt to follow all other relocation sections, we don't have to worry about changing the DT_RELA entry. */ - s = bfd_get_section_by_name (output_bfd, ".rela.plt"); + s = bfd_get_linker_section (dynobj, ".rela.plt"); if (s != NULL) dyn.d_un.d_val -= s->size; bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); @@ -2870,7 +2817,7 @@ bfd_cr16_elf32_create_embedded_relocs (bfd *abfd, bfd_byte *p; bfd_size_type amt; - BFD_ASSERT (! info->relocatable); + BFD_ASSERT (! bfd_link_relocatable (info)); *errmsg = NULL; @@ -2977,7 +2924,9 @@ error_return: properly. */ static enum elf_reloc_type_class -_bfd_cr16_elf_reloc_type_class (const Elf_Internal_Rela *rela) +_bfd_cr16_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)) { @@ -2990,7 +2939,7 @@ _bfd_cr16_elf_reloc_type_class (const Elf_Internal_Rela *rela) } /* Definitions for setting CR16 target vector. */ -#define TARGET_LITTLE_SYM bfd_elf32_cr16_vec +#define TARGET_LITTLE_SYM cr16_elf32_vec #define TARGET_LITTLE_NAME "elf32-cr16" #define ELF_ARCH bfd_arch_cr16 #define ELF_MACHINE_CODE EM_CR16 @@ -3022,8 +2971,6 @@ _bfd_cr16_elf_reloc_type_class (const Elf_Internal_Rela *rela) #define bfd_elf32_bfd_link_hash_table_create \ elf32_cr16_link_hash_table_create -#define bfd_elf32_bfd_link_hash_table_free \ - elf32_cr16_link_hash_table_free #define elf_backend_create_dynamic_sections \ _bfd_cr16_elf_create_dynamic_sections