X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Femultempl%2Felf32.em;h=3e8ee4693e67851e9f497a7393784a8c17bbf8bd;hb=3d7d6a6ff4678685f86976f08ab4c9c639e262e1;hp=8a41347d81d5b4f5e01dfc036921e513e06efd64;hpb=19a7fe52ae3d0971e67a134bcb1648899e21ae1c;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index 8a41347d81..3e8ee4693e 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -12,7 +12,7 @@ fragment < ELF support by Ian Lance Taylor @@ -60,6 +60,7 @@ fragment < 0) + einfo (_("%P: warning: -z dynamic-undefined-weak ignored\n")); + link_info.dynamic_undefined_weak = 0; + } + after_parse_default (); } EOF @@ -130,7 +156,7 @@ gld${EMULATION_NAME}_load_symbols (lang_input_statement_type *entry) if (entry->flags.just_syms && (bfd_get_file_flags (entry->the_bfd) & DYNAMIC) != 0) - einfo (_("%P%F: --just-symbols may not be used on DSO: %B\n"), + einfo (_("%F%P: %pB: --just-symbols may not be used on DSO\n"), entry->the_bfd); if (link_class == 0 @@ -253,7 +279,7 @@ gld${EMULATION_NAME}_stat_needed (lang_input_statement_type *s) if (bfd_stat (s->the_bfd, &st) != 0) { - einfo ("%P:%B: bfd_stat failed: %E\n", s->the_bfd); + einfo (_("%P: %pB: bfd_stat failed: %E\n"), s->the_bfd); return; } @@ -293,7 +319,7 @@ gld${EMULATION_NAME}_stat_needed (lang_input_statement_type *s) soname = lbasename (s->filename); if (filename_ncmp (soname, global_needed->name, suffix - global_needed->name) == 0) - einfo ("%P: warning: %s, needed by %B, may conflict with %s\n", + einfo (_("%P: warning: %s, needed by %pB, may conflict with %s\n"), global_needed->name, global_needed->by, soname); } @@ -318,7 +344,11 @@ gld${EMULATION_NAME}_try_needed (struct dt_needed *needed, abfd = bfd_openr (name, bfd_get_target (link_info.output_bfd)); if (abfd == NULL) - return FALSE; + { + if (verbose) + info_msg (_("attempt to open %s failed\n"), name); + return FALSE; + } /* Linker needs to decompress sections. */ abfd->flags |= BFD_DECOMPRESS; @@ -351,7 +381,7 @@ gld${EMULATION_NAME}_try_needed (struct dt_needed *needed, struct bfd_link_needed_list *needs; if (! bfd_elf_get_bfd_needed_list (abfd, &needs)) - einfo ("%F%P:%B: bfd_elf_get_bfd_needed_list failed: %E\n", abfd); + einfo (_("%F%P: %pB: bfd_elf_get_bfd_needed_list failed: %E\n"), abfd); if (needs != NULL) { @@ -408,7 +438,7 @@ fragment <filename); @@ -444,12 +474,11 @@ fragment < header file which loads the + system header file, which conflicts with the + "include/elf/mips.h" header file. */ + /* Fall through. */ + default: + break; + } + + if (replacement) + { + char * filename2 = xmalloc (flen + strlen (replacement)); + + if (end) + { + sprintf (filename2, "%.*s%s/%s", + (int)(var - filename), filename, + replacement, end + 1); + offset = (var - filename) + 1 + strlen (replacement); + } + else + { + sprintf (filename2, "%.*s%s", + (int)(var - filename), filename, + replacement); + offset = var - filename + strlen (replacement); + } + + free (filename); + filename = filename2; + /* There is no need to restore the path separator (when + end != NULL) as we have replaced the entire string. */ + } + else + { + if (verbose) + /* We only issue an "unrecognised" message in verbose mode + as the $ token might be a legitimate component of + a path name in the target's file system. */ + info_msg (_("unrecognised or unsupported token '%s' in search path\n"), var); + + if (end) + /* Restore the path separator. */ + * end = '/'; + + /* PR 20784: Make sure that we resume the scan *after* + the token that we could not replace. */ + offset = (var + 1) - filename; + } + + free (freeme); + } + needed.name = filename; + if (gld${EMULATION_NAME}_try_needed (&needed, force)) return TRUE; @@ -519,41 +698,85 @@ EOF if [ "x${USE_LIBPATH}" = xyes ] ; then fragment <output_section)) { einfo (_("%P: warning: .note.gnu.build-id section discarded," - " --build-id ignored.\n")); + " --build-id ignored\n")); return TRUE; } i_shdr = &elf_section_data (asec->output_section)->this_hdr; @@ -971,7 +1193,7 @@ setup_build_id (bfd *ibfd) size = id_note_section_size (ibfd); if (size == 0) { - einfo ("%P: warning: unrecognized --build-id style ignored.\n"); + einfo (_("%P: warning: unrecognized --build-id style ignored\n")); return FALSE; } @@ -989,8 +1211,8 @@ setup_build_id (bfd *ibfd) return TRUE; } - einfo ("%P: warning: Cannot create .note.gnu.build-id section," - " --build-id ignored.\n"); + einfo (_("%P: warning: cannot create .note.gnu.build-id section," + " --build-id ignored\n")); return FALSE; } @@ -1001,6 +1223,8 @@ gld${EMULATION_NAME}_after_open (void) { struct bfd_link_needed_list *needed, *l; struct elf_link_hash_table *htab; + asection *s; + bfd *abfd; after_open_default (); @@ -1008,15 +1232,28 @@ gld${EMULATION_NAME}_after_open (void) if (!is_elf_hash_table (htab)) return; - if (emit_note_gnu_build_id != NULL) + if (command_line.out_implib_filename) { - bfd *abfd; + unlink_if_ordinary (command_line.out_implib_filename); + link_info.out_implib_bfd + = bfd_openw (command_line.out_implib_filename, + bfd_get_target (link_info.output_bfd)); + + if (link_info.out_implib_bfd == NULL) + { + einfo (_("%F%P: %s: can't open for writing: %E\n"), + command_line.out_implib_filename); + } + } + if (emit_note_gnu_build_id != NULL) + { /* Find an ELF input. */ for (abfd = link_info.input_bfds; abfd != (bfd *) NULL; abfd = abfd->link.next) if (bfd_get_flavour (abfd) == bfd_target_elf_flavour - && bfd_count_sections (abfd) != 0) + && bfd_count_sections (abfd) != 0 + && !((lang_input_statement_type *) abfd->usrdata)->flags.just_syms) break; /* PR 10555: If there are no ELF input files do not try to @@ -1029,7 +1266,9 @@ gld${EMULATION_NAME}_after_open (void) } } - if (link_info.relocatable) + get_elf_backend_data (link_info.output_bfd)->setup_gnu_properties (&link_info); + + if (bfd_link_relocatable (&link_info)) { if (link_info.execstack == ! link_info.noexecstack) /* PR ld/16744: If "-z [no]execstack" has been specified on the @@ -1047,14 +1286,17 @@ gld${EMULATION_NAME}_after_open (void) if (!link_info.traditional_format) { - bfd *abfd, *elfbfd = NULL; + bfd *elfbfd = NULL; bfd_boolean warn_eh_frame = FALSE; - asection *s; int seen_type = 0; for (abfd = link_info.input_bfds; abfd; abfd = abfd->link.next) { int type = 0; + + if (((lang_input_statement_type *) abfd->usrdata)->flags.just_syms) + continue; + for (s = abfd->sections; s && type < COMPACT_EH_HDR; s = s->next) { const char *name = bfd_get_section_name (abfd, s); @@ -1075,8 +1317,8 @@ gld${EMULATION_NAME}_after_open (void) } else if (seen_type != type) { - einfo (_("%P%F: compact frame descriptions incompatible with" - " DWARF2 .eh_frame from %B\n"), + einfo (_("%F%P: compact frame descriptions incompatible with" + " DWARF2 .eh_frame from %pB\n"), type == DWARF2_EH_HDR ? abfd : elfbfd); break; } @@ -1093,9 +1335,6 @@ gld${EMULATION_NAME}_after_open (void) if (seen_type == COMPACT_EH_HDR) link_info.eh_frame_hdr_type = COMPACT_EH_HDR; - - if (bfd_count_sections (abfd) == 0) - continue; } if (elfbfd) { @@ -1113,8 +1352,8 @@ gld${EMULATION_NAME}_after_open (void) } } if (warn_eh_frame) - einfo ("%P: warning: Cannot create .eh_frame_hdr section," - " --eh-frame-hdr ignored.\n"); + einfo (_("%P: warning: cannot create .eh_frame_hdr section," + " --eh-frame-hdr ignored\n")); } /* Get the list of files which appear in DT_NEEDED entries in @@ -1168,7 +1407,7 @@ gld${EMULATION_NAME}_after_open (void) n.name = l->name; nn.by = l->by; if (verbose) - info_msg (_("%s needed by %B\n"), l->name, l->by); + info_msg (_("%s needed by %pB\n"), l->name, l->by); /* As-needed libs specified on the command line (or linker script) take priority over libs found in search dirs. */ @@ -1195,9 +1434,9 @@ gld${EMULATION_NAME}_after_open (void) size_t len; search_dirs_type *search; EOF -if [ "x${NATIVE}" = xyes ] ; then +if [ "x${NATIVE}" = xyes ] || [ "x${USE_LIBPATH}" = xyes ] ; then fragment <next) { - char *tmpname = gld${EMULATION_NAME}_add_sysroot (rp->name); + path = gld${EMULATION_NAME}_add_sysroot (rp->name); found = (rp->by == l->by - && gld${EMULATION_NAME}_search_needed (tmpname, - &n, + && gld${EMULATION_NAME}_search_needed (path, &n, force)); - free (tmpname); + free ((char *) path); } if (found) break; @@ -1296,13 +1541,14 @@ fragment <name, l->by); } if (link_info.eh_frame_hdr_type == COMPACT_EH_HDR) - if (bfd_elf_parse_eh_frame_entries (NULL, &link_info) == FALSE) - einfo (_("%P%F: Failed to parse EH frame entries.\n")); + if (!bfd_elf_parse_eh_frame_entries (NULL, &link_info)) + einfo (_("%F%P: failed to parse EH frame entries\n")); } EOF @@ -1322,7 +1568,7 @@ gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp) case etree_provide: case etree_provided: provide = TRUE; - /* Fall thru */ + /* Fallthru */ case etree_assign: /* We call record_link_assignment even if the symbol is defined. This is because if it is defined by a dynamic object, we @@ -1337,7 +1583,7 @@ gld${EMULATION_NAME}_find_exp_assignment (etree_type *exp) &link_info, exp->assign.dst, provide, exp->assign.hidden)) - einfo ("%P%F: failed to record assignment to %s: %E\n", + einfo (_("%F%P: failed to record assignment to %s: %E\n"), exp->assign.dst); } gld${EMULATION_NAME}_find_exp_assignment (exp->assign.src); @@ -1442,13 +1688,10 @@ gld${EMULATION_NAME}_before_allocation (void) const char *rpath; asection *sinterp; bfd *abfd; - struct elf_link_hash_entry *ehdr_start = NULL; -#if defined(__GNUC__) && GCC_VERSION < 4006 - /* Work around a GCC uninitialized warning bug fixed in GCC 4.6. */ - struct bfd_link_hash_entry ehdr_start_save = ehdr_start_save; -#else - struct bfd_link_hash_entry ehdr_start_save; -#endif + struct bfd_link_hash_entry *ehdr_start = NULL; + unsigned char ehdr_start_save_type = 0; + char ehdr_start_save_u[sizeof ehdr_start->u + - sizeof ehdr_start->u.def.next] = ""; if (is_elf_hash_table (link_info.hash)) { @@ -1456,35 +1699,40 @@ gld${EMULATION_NAME}_before_allocation (void) /* Make __ehdr_start hidden if it has been referenced, to prevent the symbol from being dynamic. */ - if (!link_info.relocatable) - { - struct elf_link_hash_entry *h - = elf_link_hash_lookup (elf_hash_table (&link_info), "__ehdr_start", - FALSE, FALSE, TRUE); - - /* Only adjust the export class if the symbol was referenced - and not defined, otherwise leave it alone. */ - if (h != NULL - && (h->root.type == bfd_link_hash_new - || h->root.type == bfd_link_hash_undefined - || h->root.type == bfd_link_hash_undefweak - || h->root.type == bfd_link_hash_common)) - { - _bfd_elf_link_hash_hide_symbol (&link_info, h, TRUE); - if (ELF_ST_VISIBILITY (h->other) != STV_INTERNAL) - h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN; - /* Don't leave the symbol undefined. Undefined hidden - symbols typically won't have dynamic relocations, but - we most likely will need dynamic relocations for - __ehdr_start if we are building a PIE or shared - library. */ - ehdr_start = h; - ehdr_start_save = h->root; - h->root.type = bfd_link_hash_defined; - h->root.u.def.section = bfd_abs_section_ptr; - h->root.u.def.value = 0; - } - } + if (!bfd_link_relocatable (&link_info)) + { + struct elf_link_hash_table *htab = elf_hash_table (&link_info); + struct elf_link_hash_entry *h + = elf_link_hash_lookup (htab, "__ehdr_start", FALSE, FALSE, TRUE); + + /* Only adjust the export class if the symbol was referenced + and not defined, otherwise leave it alone. */ + if (h != NULL + && (h->root.type == bfd_link_hash_new + || h->root.type == bfd_link_hash_undefined + || h->root.type == bfd_link_hash_undefweak + || h->root.type == bfd_link_hash_common)) + { + const struct elf_backend_data *bed; + bed = get_elf_backend_data (link_info.output_bfd); + (*bed->elf_backend_hide_symbol) (&link_info, h, TRUE); + if (ELF_ST_VISIBILITY (h->other) != STV_INTERNAL) + h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN; + /* Don't leave the symbol undefined. Undefined hidden + symbols typically won't have dynamic relocations, but + we most likely will need dynamic relocations for + __ehdr_start if we are building a PIE or shared + library. */ + ehdr_start = &h->root; + ehdr_start_save_type = ehdr_start->type; + memcpy (ehdr_start_save_u, + (char *) &ehdr_start->u + sizeof ehdr_start->u.def.next, + sizeof ehdr_start_save_u); + ehdr_start->type = bfd_link_hash_defined; + ehdr_start->u.def.section = bfd_abs_section_ptr; + ehdr_start->u.def.value = 0; + } + } /* If we are going to make any variable assignments, we need to let the ELF backend know about them in case the variables are @@ -1533,7 +1781,7 @@ gld${EMULATION_NAME}_before_allocation (void) command_line.filter_shlib, audit, depaudit, (const char * const *) command_line.auxiliary_filters, &link_info, &sinterp))) - einfo ("%P%F: failed to set dynamic section sizes: %E\n"); + einfo (_("%F%P: failed to set dynamic section sizes: %E\n")); ${ELF_INTERPRETER_SET_DEFAULT} /* Let the user override the dynamic linker we are using. */ @@ -1555,7 +1803,6 @@ ${ELF_INTERPRETER_SET_DEFAULT} asection *s; bfd_size_type sz; char *msg; - bfd_boolean ret; if (is->flags.just_syms) continue; @@ -1568,14 +1815,12 @@ ${ELF_INTERPRETER_SET_DEFAULT} msg = (char *) xmalloc ((size_t) (sz + 1)); if (! bfd_get_section_contents (is->the_bfd, s, msg, (file_ptr) 0, sz)) - einfo ("%F%B: Can't read contents of section .gnu.warning: %E\n", + einfo (_("%F%P: %pB: can't read contents of section .gnu.warning: %E\n"), is->the_bfd); msg[sz] = '\0'; - ret = link_info.callbacks->warning (&link_info, msg, - (const char *) NULL, - is->the_bfd, (asection *) NULL, - (bfd_vma) 0); - ASSERT (ret); + (*link_info.callbacks->warning) (&link_info, msg, + (const char *) NULL, is->the_bfd, + (asection *) NULL, (bfd_vma) 0); free (msg); /* Clobber the section size, so that we don't waste space @@ -1598,14 +1843,16 @@ ${ELF_INTERPRETER_SET_DEFAULT} before_allocation_default (); if (!bfd_elf_size_dynsym_hash_dynstr (link_info.output_bfd, &link_info)) - einfo ("%P%F: failed to set dynamic section sizes: %E\n"); + einfo (_("%F%P: failed to set dynamic section sizes: %E\n")); if (ehdr_start != NULL) { /* If we twiddled __ehdr_start to defined earlier, put it back as it was. */ - ehdr_start->root.type = ehdr_start_save.type; - ehdr_start->root.u = ehdr_start_save.u; + ehdr_start->type = ehdr_start_save_type; + memcpy ((char *) &ehdr_start->u + sizeof ehdr_start->u.def.next, + ehdr_start_save_u, + sizeof ehdr_start_save_u); } } @@ -1690,7 +1937,7 @@ gld${EMULATION_NAME}_open_dynamic_archive filename we recorded earlier. */ if (!entry->flags.full_name_provided) - filename = lbasename (entry->filename); + filename = lbasename (entry->filename); bfd_elf_set_dt_needed_name (entry->the_bfd, filename); } @@ -1706,7 +1953,7 @@ fragment <name[4] == 'a'; for (lookup = &lang_output_section_statement.head->output_section_statement; lookup != NULL; @@ -1768,6 +2014,29 @@ output_rel_find (asection *sec, int isdyn) return last; } +/* Return whether IN is suitable to be part of OUT. */ + +static bfd_boolean +elf_orphan_compatible (asection *in, asection *out) +{ + /* Non-zero sh_info implies a section with SHF_INFO_LINK with + unknown semantics for the generic linker, or a SHT_REL/SHT_RELA + section where sh_info specifies a symbol table. (We won't see + SHT_GROUP, SHT_SYMTAB or SHT_DYNSYM sections here.) We clearly + can't merge SHT_REL/SHT_RELA using differing symbol tables, and + shouldn't merge sections with differing unknown semantics. */ + if (elf_section_data (out)->this_hdr.sh_info + != elf_section_data (in)->this_hdr.sh_info) + return FALSE; + /* We can't merge two sections with differing SHF_EXCLUDE when doing + a relocatable link. */ + if (bfd_link_relocatable (&link_info) + && ((elf_section_flags (out) ^ elf_section_flags (in)) & SHF_EXCLUDE) != 0) + return FALSE; + return _bfd_elf_match_sections_by_type (link_info.output_bfd, out, + in->owner, in); +} + /* Place an orphan section. We use this to put random SHF_ALLOC sections in the right segment. */ @@ -1824,14 +2093,17 @@ gld${EMULATION_NAME}_place_orphan (asection *s, lang_output_section_statement_type *os; lang_output_section_statement_type *match_by_name = NULL; int isdyn = 0; - int iself = s->owner->xvec->flavour == bfd_target_elf_flavour; - unsigned int sh_type = iself ? elf_section_type (s) : SHT_NULL; + int elfinput = s->owner->xvec->flavour == bfd_target_elf_flavour; + int elfoutput = link_info.output_bfd->xvec->flavour == bfd_target_elf_flavour; + unsigned int sh_type = elfinput ? elf_section_type (s) : SHT_NULL; + flagword flags; + asection *nexts; - if (! link_info.relocatable + if (!bfd_link_relocatable (&link_info) && link_info.combreloc && (s->flags & SEC_ALLOC)) { - if (iself) + if (elfinput) switch (sh_type) { case SHT_RELA: @@ -1852,7 +2124,53 @@ gld${EMULATION_NAME}_place_orphan (asection *s, } } - /* Look through the script to see where to place this section. */ + if (!bfd_link_relocatable (&link_info) + && elfinput + && elfoutput + && (s->flags & SEC_ALLOC) != 0 + && (elf_section_flags (s) & SHF_GNU_MBIND) != 0) + { + /* Find the output mbind section with the same type, attributes + and sh_info field. */ + for (os = &lang_output_section_statement.head->output_section_statement; + os != NULL; + os = os->next) + if (os->bfd_section != NULL + && !bfd_is_abs_section (os->bfd_section) + && (elf_section_flags (os->bfd_section) & SHF_GNU_MBIND) != 0 + && ((s->flags & (SEC_ALLOC + | SEC_LOAD + | SEC_HAS_CONTENTS + | SEC_READONLY + | SEC_CODE)) + == (os->bfd_section->flags & (SEC_ALLOC + | SEC_LOAD + | SEC_HAS_CONTENTS + | SEC_READONLY + | SEC_CODE))) + && (elf_section_data (os->bfd_section)->this_hdr.sh_info + == elf_section_data (s)->this_hdr.sh_info)) + { + lang_add_section (&os->children, s, NULL, os); + return os; + } + + /* Create the output mbind section with the ".mbind." prefix + in section name. */ + if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0) + secname = ".mbind.bss"; + else if ((s->flags & SEC_READONLY) == 0) + secname = ".mbind.data"; + else if ((s->flags & SEC_CODE) == 0) + secname = ".mbind.rodata"; + else + secname = ".mbind.text"; + } + + /* Look through the script to see where to place this section. The + script includes entries added by previous lang_insert_orphan + calls, so this loop puts multiple compatible orphans of the same + name into a single output section. */ if (constraint == 0) for (os = lang_output_section_find (secname); os != NULL; @@ -1862,19 +2180,19 @@ gld${EMULATION_NAME}_place_orphan (asection *s, lang_insert_orphan to create a new output section. */ constraint = SPECIAL; + /* Check to see if we already have an output section statement + with this name, and its bfd section has compatible flags. + If the section already exists but does not have any flags + set, then it has been created by the linker, possibly as a + result of a --section-start command line switch. */ if (os->bfd_section != NULL && (os->bfd_section->flags == 0 - || (_bfd_elf_match_sections_by_type (link_info.output_bfd, - os->bfd_section, - s->owner, s) - && ((s->flags ^ os->bfd_section->flags) - & (SEC_LOAD | SEC_ALLOC)) == 0))) + || (((s->flags ^ os->bfd_section->flags) + & (SEC_LOAD | SEC_ALLOC)) == 0 + && (!elfinput + || !elfoutput + || elf_orphan_compatible (s, os->bfd_section))))) { - /* We already have an output section statement with this - name, and its bfd section has compatible flags. - If the section already exists but does not have any flags - set, then it has been created by the linker, probably as a - result of a --section-start command line switch. */ lang_add_section (&os->children, s, NULL, os); return os; } @@ -1909,8 +2227,7 @@ gld${EMULATION_NAME}_place_orphan (asection *s, /* If this is a final link, then always put .gnu.warning.SYMBOL sections into the .text section to get them out of the way. */ - if (link_info.executable - && ! link_info.relocatable + if (bfd_link_executable (&link_info) && CONST_STRNEQ (s->name, ".gnu.warning.") && hold[orphan_text].os != NULL) { @@ -1919,6 +2236,26 @@ gld${EMULATION_NAME}_place_orphan (asection *s, return os; } + flags = s->flags; + if (!bfd_link_relocatable (&link_info)) + { + nexts = s; + while ((nexts = bfd_get_next_section_by_name (nexts->owner, nexts)) + != NULL) + if (nexts->output_section == NULL + && (nexts->flags & SEC_EXCLUDE) == 0 + && ((nexts->flags ^ flags) & (SEC_LOAD | SEC_ALLOC)) == 0 + && (nexts->owner->flags & DYNAMIC) == 0 + && nexts->owner->usrdata != NULL + && !(((lang_input_statement_type *) nexts->owner->usrdata) + ->flags.just_syms) + && _bfd_elf_match_sections_by_type (nexts->owner, nexts, + s->owner, s)) + flags = (((flags ^ SEC_READONLY) + | (nexts->flags ^ SEC_READONLY)) + ^ SEC_READONLY); + } + /* Decide which segment the section should go in based on the section name and section flags. We put loadable .note sections right after the .interp section, so that the PT_NOTE segment is @@ -1926,27 +2263,29 @@ gld${EMULATION_NAME}_place_orphan (asection *s, in the first page. */ place = NULL; - if ((s->flags & (SEC_ALLOC | SEC_DEBUGGING)) == 0) + if ((flags & (SEC_ALLOC | SEC_DEBUGGING)) == 0) place = &hold[orphan_nonalloc]; - else if ((s->flags & SEC_ALLOC) == 0) + else if ((flags & SEC_ALLOC) == 0) ; - else if ((s->flags & SEC_LOAD) != 0 - && ((iself && sh_type == SHT_NOTE) - || (!iself && CONST_STRNEQ (secname, ".note")))) + else if ((flags & SEC_LOAD) != 0 + && (elfinput + ? sh_type == SHT_NOTE + : CONST_STRNEQ (secname, ".note"))) place = &hold[orphan_interp]; - else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) == 0) + else if ((flags & (SEC_LOAD | SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) == 0) place = &hold[orphan_bss]; - else if ((s->flags & SEC_SMALL_DATA) != 0) + else if ((flags & SEC_SMALL_DATA) != 0) place = &hold[orphan_sdata]; - else if ((s->flags & SEC_THREAD_LOCAL) != 0) + else if ((flags & SEC_THREAD_LOCAL) != 0) place = &hold[orphan_tdata]; - else if ((s->flags & SEC_READONLY) == 0) + else if ((flags & SEC_READONLY) == 0) place = &hold[orphan_data]; - else if (((iself && (sh_type == SHT_RELA || sh_type == SHT_REL)) - || (!iself && CONST_STRNEQ (secname, ".rel"))) - && (s->flags & SEC_LOAD) != 0) + else if ((flags & SEC_LOAD) != 0 + && (elfinput + ? sh_type == SHT_RELA || sh_type == SHT_REL + : CONST_STRNEQ (secname, ".rel"))) place = &hold[orphan_rel]; - else if ((s->flags & SEC_CODE) == 0) + else if ((flags & SEC_CODE) == 0) place = &hold[orphan_rodata]; else place = &hold[orphan_text]; @@ -1959,12 +2298,16 @@ gld${EMULATION_NAME}_place_orphan (asection *s, if (place->name != NULL) place->os = lang_output_section_find (place->name); else - place->os = output_rel_find (s, isdyn); + { + int rela = elfinput ? sh_type == SHT_RELA : secname[4] == 'a'; + place->os = output_rel_find (isdyn, rela); + } } after = place->os; if (after == NULL) - after = lang_output_section_find_by_flags - (s, &place->os, _bfd_elf_match_sections_by_type); + after + = lang_output_section_find_by_flags (s, flags, &place->os, + _bfd_elf_match_sections_by_type); if (after == NULL) /* *ABS* is always the first output section statement. */ after = &lang_output_section_statement.head->output_section_statement; @@ -1984,7 +2327,7 @@ gld${EMULATION_NAME}_after_allocation (void) int need_layout = bfd_elf_discard_info (link_info.output_bfd, &link_info); if (need_layout < 0) - einfo ("%X%P: .eh_frame/.stab edit: %E\n"); + einfo (_("%X%P: .eh_frame/.stab edit: %E\n")); else gld${EMULATION_NAME}_map_segments (need_layout); } @@ -2009,11 +2352,11 @@ fragment <> e${EMULATION_NAME}.c -echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c +echo ' ; else if (bfd_link_relocatable (&link_info)) return' >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c @@ -2023,35 +2366,141 @@ sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c fi if test -n "$GENERATE_PIE_SCRIPT" ; then if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then -echo ' ; else if (link_info.pie && link_info.combreloc' >> e${EMULATION_NAME}.c -echo ' && link_info.relro' >> e${EMULATION_NAME}.c +echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c +echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c +echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c +echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xdwe >> e${EMULATION_NAME}.c +echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c +echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c +echo ' && link_info.relro' >> e${EMULATION_NAME}.c echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.xdw >> e${EMULATION_NAME}.c -echo ' ; else if (link_info.pie && link_info.combreloc) return' >> e${EMULATION_NAME}.c +if test -n "$GENERATE_RELRO_SCRIPT" ; then +echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c +echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c +echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c +echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xdceo >> e${EMULATION_NAME}.c +fi +echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c +echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c +echo ' && link_info.combreloc) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xdce >> e${EMULATION_NAME}.c +if test -n "$GENERATE_RELRO_SCRIPT" ; then +echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c +echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c +echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xdco >> e${EMULATION_NAME}.c +fi +echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c +echo ' && link_info.combreloc) return' >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.xdc >> e${EMULATION_NAME}.c +if test -n "$GENERATE_RELRO_SCRIPT" ; then +echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c +echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c +echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xdeo >> e${EMULATION_NAME}.c +fi fi -echo ' ; else if (link_info.pie) return' >> e${EMULATION_NAME}.c +echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c +echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xde >> e${EMULATION_NAME}.c +if test -n "$GENERATE_RELRO_SCRIPT" ; then +echo ' ; else if (bfd_link_pie (&link_info)' >> e${EMULATION_NAME}.c +echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xdo >> e${EMULATION_NAME}.c +fi +echo ' ; else if (bfd_link_pie (&link_info)) return' >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.xd >> e${EMULATION_NAME}.c fi if test -n "$GENERATE_SHLIB_SCRIPT" ; then if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then -echo ' ; else if (link_info.shared && link_info.combreloc' >> e${EMULATION_NAME}.c -echo ' && link_info.relro' >> e${EMULATION_NAME}.c +echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c +echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c +echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c +echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xswe >> e${EMULATION_NAME}.c +echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c +echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c +echo ' && link_info.relro' >> e${EMULATION_NAME}.c echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.xsw >> e${EMULATION_NAME}.c -echo ' ; else if (link_info.shared && link_info.combreloc) return' >> e${EMULATION_NAME}.c +if test -n "$GENERATE_RELRO_SCRIPT" ; then +echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c +echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c +echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c +echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xsceo >> e${EMULATION_NAME}.c +fi +echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c +echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c +echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xsce >> e${EMULATION_NAME}.c +if test -n "$GENERATE_RELRO_SCRIPT" ; then +echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c +echo ' && link_info.combreloc' >> e${EMULATION_NAME}.c +echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xsco >> e${EMULATION_NAME}.c +fi +echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c +echo ' && link_info.combreloc) return' >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.xsc >> e${EMULATION_NAME}.c +if test -n "$GENERATE_RELRO_SCRIPT" ; then +echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c +echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c +echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xseo >> e${EMULATION_NAME}.c +fi +fi +echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c +echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xse >> e${EMULATION_NAME}.c +if test -n "$GENERATE_RELRO_SCRIPT" ; then +echo ' ; else if (bfd_link_dll (&link_info)' >> e${EMULATION_NAME}.c +echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xso >> e${EMULATION_NAME}.c fi -echo ' ; else if (link_info.shared) return' >> e${EMULATION_NAME}.c +echo ' ; else if (bfd_link_dll (&link_info)) return' >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.xs >> e${EMULATION_NAME}.c fi if test -n "$GENERATE_COMBRELOC_SCRIPT" ; then -echo ' ; else if (link_info.combreloc && link_info.relro' >> e${EMULATION_NAME}.c +echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c +echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c +echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xwe >> e${EMULATION_NAME}.c +echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c +echo ' && link_info.relro' >> e${EMULATION_NAME}.c echo ' && (link_info.flags & DF_BIND_NOW)) return' >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.xw >> e${EMULATION_NAME}.c +if test -n "$GENERATE_RELRO_SCRIPT" ; then +echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c +echo ' && link_info.separate_code' >> e${EMULATION_NAME}.c +echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xceo >> e${EMULATION_NAME}.c +fi +echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c +echo ' && link_info.separate_code) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xce >> e${EMULATION_NAME}.c +if test -n "$GENERATE_RELRO_SCRIPT" ; then +echo ' ; else if (link_info.combreloc' >> e${EMULATION_NAME}.c +echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xco >> e${EMULATION_NAME}.c +fi echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.xc >> e${EMULATION_NAME}.c fi +if test -n "$GENERATE_RELRO_SCRIPT" ; then +echo ' ; else if (link_info.separate_code' >> e${EMULATION_NAME}.c +echo ' && link_info.relro) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xeo >> e${EMULATION_NAME}.c +fi +echo ' ; else if (link_info.separate_code) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xe >> e${EMULATION_NAME}.c +if test -n "$GENERATE_RELRO_SCRIPT" ; then +echo ' ; else if (link_info.relro) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xo >> e${EMULATION_NAME}.c +fi echo ' ; else return' >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c echo '; }' >> e${EMULATION_NAME}.c @@ -2063,9 +2512,9 @@ fragment <