X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Femultempl%2Felf32.em;h=9b8971eac486898322c7dd4cfd64777a12b28f01;hb=dc12032bca08554cf0a72d224e44f755f7789ff3;hp=dd4d35ab110c3edb086b49e3e32d81bfd2e42636;hpb=76359541825cf36ecd14ab6b5974ee56e1c59eff;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index dd4d35ab11..9b8971eac4 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -12,7 +12,7 @@ fragment < ELF support by Ian Lance Taylor @@ -104,8 +104,9 @@ gld${EMULATION_NAME}_before_parse (void) config.has_shared = `if test -n "$GENERATE_SHLIB_SCRIPT" ; then echo TRUE ; else echo FALSE ; fi`; config.separate_code = `if test "x${SEPARATE_CODE}" = xyes ; then echo TRUE ; else echo FALSE ; fi`; `if test -n "$CALL_NOP_BYTE" ; then echo link_info.call_nop_byte = $CALL_NOP_BYTE; fi`; - link_info.check_relocs_after_open_input = `if test "x${CHECK_RELOCS_AFTER_OPEN_INPUT}" = xyes ; then echo TRUE ; else echo FALSE ; fi`; + link_info.check_relocs_after_open_input = TRUE; link_info.relro = DEFAULT_LD_Z_RELRO; + link_info.separate_code = DEFAULT_LD_Z_SEPARATE_CODE; } EOF @@ -120,6 +121,13 @@ gld${EMULATION_NAME}_after_parse (void) if (bfd_link_pie (&link_info)) link_info.flags_1 |= (bfd_vma) DF_1_PIE; + if (bfd_link_executable (&link_info) + && link_info.nointerp) + { + if (link_info.dynamic_undefined_weak > 0) + einfo (_("%P: warning: -z dynamic-undefined-weak ignored\n")); + link_info.dynamic_undefined_weak = 0; + } after_parse_default (); } @@ -149,7 +157,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 @@ -272,7 +280,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; } @@ -312,7 +320,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); } @@ -337,7 +345,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; @@ -370,7 +382,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) { @@ -427,7 +439,7 @@ fragment <filename); @@ -463,12 +475,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; @@ -538,41 +699,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; @@ -990,7 +1194,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; } @@ -1008,8 +1212,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; } @@ -1020,6 +1224,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 (); @@ -1036,20 +1242,19 @@ gld${EMULATION_NAME}_after_open (void) if (link_info.out_implib_bfd == NULL) { - einfo ("%F%s: Can't open for writing: %E\n", + einfo (_("%F%P: %s: can't open for writing: %E\n"), command_line.out_implib_filename); } } if (emit_note_gnu_build_id != NULL) { - bfd *abfd; - /* 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 @@ -1062,6 +1267,8 @@ gld${EMULATION_NAME}_after_open (void) } } + 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) @@ -1080,14 +1287,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); @@ -1108,8 +1318,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; } @@ -1126,9 +1336,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) { @@ -1146,8 +1353,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 @@ -1201,7 +1408,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. */ @@ -1228,9 +1435,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) { - const char *tmpname = rp->name; - - if (IS_ABSOLUTE_PATH (tmpname)) - tmpname = gld${EMULATION_NAME}_add_sysroot (tmpname); + 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)); - if (tmpname != rp->name) - free ((char *) tmpname); + free ((char *) path); } if (found) break; @@ -1333,13 +1542,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 @@ -1359,7 +1569,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 @@ -1374,7 +1584,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); @@ -1499,34 +1709,36 @@ gld${EMULATION_NAME}_before_allocation (void) /* Make __ehdr_start hidden if it has been referenced, to prevent the symbol from being dynamic. */ if (!bfd_link_relocatable (&link_info)) - { - 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; - } - } + { + 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; + 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 we are going to make any variable assignments, we need to let the ELF backend know about them in case the variables are @@ -1575,7 +1787,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. */ @@ -1609,7 +1821,7 @@ ${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'; (*link_info.callbacks->warning) (&link_info, msg, @@ -1637,7 +1849,7 @@ ${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) { @@ -1729,7 +1941,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); } @@ -1807,6 +2019,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. */ @@ -1863,8 +2098,9 @@ 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; @@ -1872,7 +2108,7 @@ gld${EMULATION_NAME}_place_orphan (asection *s, && link_info.combreloc && (s->flags & SEC_ALLOC)) { - if (iself) + if (elfinput) switch (sh_type) { case SHT_RELA: @@ -1893,7 +2129,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; @@ -1903,19 +2185,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 || (((s->flags ^ os->bfd_section->flags) & (SEC_LOAD | SEC_ALLOC)) == 0 - && _bfd_elf_match_sections_by_type (link_info.output_bfd, - os->bfd_section, - s->owner, s)))) + && (!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; } @@ -1991,8 +2273,8 @@ gld${EMULATION_NAME}_place_orphan (asection *s, else if ((flags & SEC_ALLOC) == 0) ; else if ((flags & SEC_LOAD) != 0 - && ((iself && sh_type == SHT_NOTE) - || (!iself && CONST_STRNEQ (secname, ".note")))) + && ((elfinput && sh_type == SHT_NOTE) + || (!elfinput && CONST_STRNEQ (secname, ".note")))) place = &hold[orphan_interp]; else if ((flags & (SEC_LOAD | SEC_HAS_CONTENTS | SEC_THREAD_LOCAL)) == 0) place = &hold[orphan_bss]; @@ -2002,8 +2284,8 @@ gld${EMULATION_NAME}_place_orphan (asection *s, place = &hold[orphan_tdata]; 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"))) + else if (((elfinput && (sh_type == SHT_RELA || sh_type == SHT_REL)) + || (!elfinput && CONST_STRNEQ (secname, ".rel"))) && (flags & SEC_LOAD) != 0) place = &hold[orphan_rel]; else if ((flags & SEC_CODE) == 0) @@ -2045,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); } @@ -2086,35 +2368,71 @@ if test -n "$GENERATE_PIE_SCRIPT" ; then if test -n "$GENERATE_COMBRELOC_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.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 (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 +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 fi +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 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 (bfd_link_dll (&link_info) && 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 (bfd_link_dll (&link_info) && link_info.combreloc) return' >> 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) return' >> e${EMULATION_NAME}.c +sed $sc ldscripts/${EMULATION_NAME}.xsce >> e${EMULATION_NAME}.c +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 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 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 +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 echo ' ; else if (link_info.combreloc) return' >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.xc >> 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 echo ' ; else return' >> e${EMULATION_NAME}.c sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c echo '; }' >> e${EMULATION_NAME}.c @@ -2147,15 +2465,30 @@ fragment <