X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=bfd%2Felf32-nios2.c;h=bfb6fd16325666ed508be3dff46f009675bf6d0a;hb=41977d16e4ee5b9ad01abf2cfce6edbfb6d79541;hp=e160054fa8943ef75bbc222c81bf9139b6c0282e;hpb=f3185997ac0951edac802e29df03dfc0844fda34;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-nios2.c b/bfd/elf32-nios2.c index e160054fa8..bfb6fd1632 100644 --- a/bfd/elf32-nios2.c +++ b/bfd/elf32-nios2.c @@ -1,5 +1,5 @@ /* 32-bit ELF support for Nios II. - Copyright (C) 2012-2018 Free Software Foundation, Inc. + Copyright (C) 2012-2020 Free Software Foundation, Inc. Contributed by Nigel Gray (ngray@altera.com). Contributed by Mentor Graphics, Inc. @@ -2228,7 +2228,7 @@ nios2_elf32_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info) unsigned int top_id, top_index; asection *section; asection **input_list, **list; - bfd_size_type amt; + size_t amt; struct elf32_nios2_link_hash_table *htab = elf32_nios2_hash_table (info); /* Count the number of input BFDs and find the top input section id. */ @@ -2490,6 +2490,17 @@ nios2_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg ATTRIBUTE_U = (struct elf32_nios2_stub_hash_entry *) gen_entry; asection *stub_sec = hsh->stub_sec; bfd_vma sym_value; + struct bfd_link_info *info; + + info = (struct bfd_link_info *) in_arg; + + /* Fail if the target section could not be assigned to an output + section. The user should fix his linker script. */ + if (hsh->target_section->output_section == NULL + && info->non_contiguous_regions) + info->callbacks->einfo (_("%F%P: Could not assign '%pA' to an output section. " + "Retry without --enable-non-contiguous-regions.\n"), + hsh->target_section); /* Make a note of the offset within the stubs for this entry. */ hsh->stub_offset = stub_sec->size; @@ -2560,7 +2571,7 @@ get_local_syms (bfd *output_bfd ATTRIBUTE_UNUSED, bfd *input_bfd, /* We want to read in symbol extension records only once. To do this we need to read in the local symbols in parallel and save them for later use; so hold pointers to the local symbols in an array. */ - bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count; + size_t amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count; all_local_syms = bfd_zmalloc (amt); htab->all_local_syms = all_local_syms; if (all_local_syms == NULL) @@ -3062,7 +3073,7 @@ nios2_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp, struct bfd_link_info *info) h = bfd_hash_lookup (&info->hash->table, "_gp", FALSE, FALSE); lh = (struct bfd_link_hash_entry *) h; -lookup: + lookup: if (lh) { switch (lh->type) @@ -3720,8 +3731,8 @@ nios2_elf32_relocate_section (bfd *output_bfd, const char *name = NULL; int r_type; const char *format; - char msgbuf[256]; - const char* msg = (const char*) NULL; + char *msgbuf = NULL; + char *msg = NULL; bfd_boolean unresolved_reloc; bfd_vma off; int use_plt; @@ -3820,8 +3831,10 @@ nios2_elf32_relocate_section (bfd *output_bfd, reloc_address = 0; format = _("global pointer relative relocation at address " - "0x%08x when _gp not defined\n"); - sprintf (msgbuf, format, reloc_address); + "%#" PRIx64 " when _gp not defined\n"); + if (asprintf (&msgbuf, format, + (uint64_t) reloc_address) == -1) + msgbuf = NULL; msg = msgbuf; r = bfd_reloc_dangerous; } @@ -3838,13 +3851,23 @@ nios2_elf32_relocate_section (bfd *output_bfd, { if (h) name = h->root.root.string; + else + { + name = (bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, + sym->st_name)); + if (name == NULL || *name == '\0') + name = bfd_section_name (sec); + } /* xgettext:c-format */ - format = _("unable to reach %s (at 0x%08x) from the " - "global pointer (at 0x%08x) because the " - "offset (%d) is out of the allowed range, " - "-32678 to 32767\n" ); - sprintf (msgbuf, format, name, symbol_address, gp, - (signed)relocation); + format = _("unable to reach %s (at %#" PRIx64 ") from " + "the global pointer (at %#" PRIx64 ") " + "because the offset (%" PRId64 ") is out of " + "the allowed range, -32678 to 32767\n" ); + if (asprintf (&msgbuf, format, name, + (uint64_t) symbol_address, (uint64_t) gp, + (int64_t) relocation) == -1) + msgbuf = NULL; msg = msgbuf; r = bfd_reloc_outofrange; } @@ -4472,7 +4495,7 @@ nios2_elf32_relocate_section (bfd *output_bfd, symtab_hdr->sh_link, sym->st_name); if (name == NULL || *name == '\0') - name = bfd_section_name (input_bfd, sec); + name = bfd_section_name (sec); } switch (r) @@ -4515,6 +4538,8 @@ nios2_elf32_relocate_section (bfd *output_bfd, { (*info->callbacks->warning) (info, msg, name, input_bfd, input_section, rel->r_offset); + if (msgbuf) + free (msgbuf); return FALSE; } } @@ -4525,10 +4550,10 @@ nios2_elf32_relocate_section (bfd *output_bfd, /* Implement elf-backend_section_flags: Convert NIOS2 specific section flags to bfd internal section flags. */ static bfd_boolean -nios2_elf32_section_flags (flagword *flags, const Elf_Internal_Shdr *hdr) +nios2_elf32_section_flags (const Elf_Internal_Shdr *hdr) { if (hdr->sh_flags & SHF_NIOS2_GPREL) - *flags |= SEC_SMALL_DATA; + hdr->bfd_section->flags |= SEC_SMALL_DATA; return TRUE; } @@ -4540,7 +4565,7 @@ static bfd_boolean nios2_elf32_fake_sections (bfd *abfd ATTRIBUTE_UNUSED, Elf_Internal_Shdr *hdr, asection *sec) { - register const char *name = bfd_get_section_name (abfd, sec); + const char *name = bfd_section_name (sec); if ((sec->flags & SEC_SMALL_DATA) || strcmp (name, ".sdata") == 0 @@ -4566,7 +4591,7 @@ create_got_section (bfd *dynobj, struct bfd_link_info *info) /* In order for the two loads in .PLTresolve to share the same %hiadj, _GLOBAL_OFFSET_TABLE_ must be aligned to a 16-byte boundary. */ - if (!bfd_set_section_alignment (dynobj, htab->root.sgotplt, 4)) + if (!bfd_set_section_alignment (htab->root.sgotplt, 4)) return FALSE; /* The Nios II ABI specifies that GOT-relative relocations are relative @@ -4602,7 +4627,7 @@ nios2_elf32_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) same %hiadj, the start of the PLT (as well as the GOT) must be aligned to a 16-byte boundary. This is because the addresses for these loads include the -(.plt+4) PIC correction. */ - return bfd_set_section_alignment (dynobj, htab->root.splt, 4); + return bfd_set_section_alignment (htab->root.splt, 4); } /* Implement elf_backend_copy_indirect_symbol: @@ -4929,7 +4954,7 @@ nios2_elf32_check_relocs (bfd *abfd, struct bfd_link_info *info, p = *head; if (p == NULL || p->sec != sec) { - bfd_size_type amt = sizeof *p; + size_t amt = sizeof *p; p = ((struct elf_dyn_relocs *) bfd_alloc (htab->root.dynobj, amt)); if (p == NULL) @@ -5415,8 +5440,8 @@ nios2_elf32_adjust_dynamic_symbol (struct bfd_link_info *info, /* Align dynbss. */ s->size = BFD_ALIGN (s->size, (bfd_size_type)1 << align2); - if (align2 > bfd_get_section_alignment (dynobj, s) - && !bfd_set_section_alignment (dynobj, s, align2)) + if (align2 > bfd_section_alignment (s) + && !bfd_set_section_alignment (s, align2)) return FALSE; /* Define the symbol as being at this point in the section. */ @@ -5839,7 +5864,7 @@ nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, /* It's OK to base decisions on the section name, because none of the dynobj section names depend upon the input files. */ - name = bfd_get_section_name (dynobj, s); + name = bfd_section_name (s); if (CONST_STRNEQ (name, ".rela")) { @@ -5947,7 +5972,7 @@ static struct bfd_link_hash_table * nios2_elf32_link_hash_table_create (bfd *abfd) { struct elf32_nios2_link_hash_table *ret; - bfd_size_type amt = sizeof (struct elf32_nios2_link_hash_table); + size_t amt = sizeof (struct elf32_nios2_link_hash_table); ret = bfd_zmalloc (amt); if (ret == NULL)