X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Felf32-nios2.c;h=cdc11f97159810584216c31ccc1695c965b8148b;hb=1e92785005ce880a5fac9d022f05cdcff91c3091;hp=947eaeba76f65a0ca7197800ec9846cee8813c71;hpb=b3adc24a0713411ab38a21dc894dd40dbc5c8f4f;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/elf32-nios2.c b/bfd/elf32-nios2.c index 947eaeba76..cdc11f9715 100644 --- a/bfd/elf32-nios2.c +++ b/bfd/elf32-nios2.c @@ -1737,9 +1737,6 @@ struct elf32_nios2_link_hash_entry symbol. */ struct elf32_nios2_stub_hash_entry *hsh_cache; - /* Track dynamic relocs copied for this symbol. */ - struct elf_dyn_relocs *dyn_relocs; - #define GOT_UNKNOWN 0 #define GOT_NORMAL 1 #define GOT_TLS_GD 2 @@ -2039,7 +2036,6 @@ link_hash_newfunc (struct bfd_hash_entry *entry, eh = (struct elf32_nios2_link_hash_entry *) entry; eh->hsh_cache = NULL; - eh->dyn_relocs = NULL; eh->tls_type = GOT_UNKNOWN; eh->got_types_used = 0; } @@ -2228,7 +2224,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 +2486,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 +2567,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 +3069,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) @@ -4527,8 +4534,7 @@ nios2_elf32_relocate_section (bfd *output_bfd, { (*info->callbacks->warning) (info, msg, name, input_bfd, input_section, rel->r_offset); - if (msgbuf) - free (msgbuf); + free (msgbuf); return FALSE; } } @@ -4539,10 +4545,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; } @@ -4631,37 +4637,6 @@ nios2_elf32_copy_indirect_symbol (struct bfd_link_info *info, edir = (struct elf32_nios2_link_hash_entry *) dir; eind = (struct elf32_nios2_link_hash_entry *) ind; - if (eind->dyn_relocs != NULL) - { - if (edir->dyn_relocs != NULL) - { - struct elf_dyn_relocs **pp; - struct elf_dyn_relocs *p; - - /* Add reloc counts against the indirect sym to the direct sym - list. Merge any entries against the same section. */ - for (pp = &eind->dyn_relocs; (p = *pp) != NULL; ) - { - struct elf_dyn_relocs *q; - - for (q = edir->dyn_relocs; q != NULL; q = q->next) - if (q->sec == p->sec) - { - q->pc_count += p->pc_count; - q->count += p->count; - *pp = p->next; - break; - } - if (q == NULL) - pp = &p->next; - } - *pp = edir->dyn_relocs; - } - - edir->dyn_relocs = eind->dyn_relocs; - eind->dyn_relocs = NULL; - } - if (ind->root.type == bfd_link_hash_indirect && dir->got.refcount <= 0) { @@ -4916,7 +4891,7 @@ nios2_elf32_check_relocs (bfd *abfd, struct bfd_link_info *info, /* If this is a global symbol, we count the number of relocations we need for this symbol. */ if (h != NULL) - head = &((struct elf32_nios2_link_hash_entry *) h)->dyn_relocs; + head = &h->dyn_relocs; else { /* Track dynamic relocs needed for local syms too. @@ -4943,7 +4918,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) @@ -5621,7 +5596,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf) else h->got.offset = (bfd_vma) -1; - if (eh->dyn_relocs == NULL) + if (h->dyn_relocs == NULL) return TRUE; /* In the shared -Bsymbolic case, discard space allocated for @@ -5637,7 +5612,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf) { struct elf_dyn_relocs **pp; - for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) + for (pp = &h->dyn_relocs; (p = *pp) != NULL; ) { p->count -= p->pc_count; p->pc_count = 0; @@ -5650,12 +5625,12 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf) /* Also discard relocs on undefined weak syms with non-default visibility. */ - if (eh->dyn_relocs != NULL + if (h->dyn_relocs != NULL && h->root.type == bfd_link_hash_undefweak) { if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) - eh->dyn_relocs = NULL; + h->dyn_relocs = NULL; /* Make sure undefined weak symbols are output as a dynamic symbol in PIEs. */ @@ -5690,13 +5665,13 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, PTR inf) goto keep; } - eh->dyn_relocs = NULL; + h->dyn_relocs = NULL; keep: ; } /* Finally, allocate space. */ - for (p = eh->dyn_relocs; p != NULL; p = p->next) + for (p = h->dyn_relocs; p != NULL; p = p->next) { asection *sreloc = elf_section_data (p->sec)->sreloc; sreloc->size += p->count * sizeof (Elf32_External_Rela); @@ -5777,8 +5752,6 @@ nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, { srel = elf_section_data (p->sec)->sreloc; srel->size += p->count * sizeof (Elf32_External_Rela); - if ((p->sec->output_section->flags & SEC_READONLY) != 0) - info->flags |= DF_TEXTREL; } } } @@ -5927,17 +5900,24 @@ nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, || !add_dynamic_entry (DT_JMPREL, 0))) return FALSE; - if (relocs - && (!add_dynamic_entry (DT_RELA, 0) + if (relocs) + { + if (!add_dynamic_entry (DT_RELA, 0) || !add_dynamic_entry (DT_RELASZ, 0) - || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))) - return FALSE; + || !add_dynamic_entry (DT_RELAENT, + sizeof (Elf32_External_Rela))) + return FALSE; - if (!bfd_link_pic (info) && !add_dynamic_entry (DT_NIOS2_GP, 0)) - return FALSE; + if ((info->flags & DF_TEXTREL) == 0) + elf_link_hash_traverse (&htab->root, + _bfd_elf_maybe_set_textrel, info); - if ((info->flags & DF_TEXTREL) != 0 - && !add_dynamic_entry (DT_TEXTREL, 0)) + if ((info->flags & DF_TEXTREL) != 0 + && !add_dynamic_entry (DT_TEXTREL, 0)) + return FALSE; + } + + if (!bfd_link_pic (info) && !add_dynamic_entry (DT_NIOS2_GP, 0)) return FALSE; } #undef add_dynamic_entry @@ -5961,7 +5941,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)