X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=ld%2Femultempl%2Fpep.em;h=3e03eb3a6e0f40135f67abfc3355d5aadc1fabea;hb=c578f16ef18fde35d5887909d5faaf0bd0118e9d;hp=6e3ecd80011cbfb1fef92ffa731c34dfbc668166;hpb=c72f2fb2bb6a3e1850b081dbfce4040970fae8e6;p=binutils-gdb.git diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em index 6e3ecd80011..3e03eb3a6e0 100644 --- a/ld/emultempl/pep.em +++ b/ld/emultempl/pep.em @@ -18,7 +18,7 @@ esac rm -f e${EMULATION_NAME}.c (echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-) fragment <[:] Set required OS subsystem [& version]\n")); fprintf (file, _(" --support-old-code Support interworking with old code\n")); fprintf (file, _(" --[no-]leading-underscore Set explicit symbol underscore prefix mode\n")); - fprintf (file, _(" --insert-timestamp Use a real timestamp rather than zero.\n")); + fprintf (file, _(" --[no-]insert-timestamp Use a real timestamp rather than zero (default)\n")); fprintf (file, _(" This makes binaries non-deterministic\n")); #ifdef DLL_SUPPORT fprintf (file, _(" --add-stdcall-alias Export symbols with and without @nn\n")); @@ -420,17 +419,16 @@ gld_${EMULATION_NAME}_list_options (FILE *file) fprintf (file, _(" --exclude-libs lib,lib,... Exclude libraries from automatic export\n")); fprintf (file, _(" --exclude-modules-for-implib mod,mod,...\n")); fprintf (file, _(" Exclude objects, archive members from auto\n")); - fprintf (file, _(" export, place into import library instead.\n")); + fprintf (file, _(" export, place into import library instead\n")); fprintf (file, _(" --export-all-symbols Automatically export all globals to DLL\n")); fprintf (file, _(" --kill-at Remove @nn from exported symbols\n")); - fprintf (file, _(" --out-implib Generate import library\n")); fprintf (file, _(" --output-def Generate a .DEF file for the built DLL\n")); - fprintf (file, _(" --warn-duplicate-exports Warn about duplicate exports.\n")); + fprintf (file, _(" --warn-duplicate-exports Warn about duplicate exports\n")); fprintf (file, _(" --compat-implib Create backward compatible import libs;\n\ - create __imp_ as well.\n")); + create __imp_ as well\n")); fprintf (file, _(" --enable-auto-image-base Automatically choose image base for DLLs\n\ unless user specifies one\n")); - fprintf (file, _(" --disable-auto-image-base Do not auto-choose image base. (default)\n")); + fprintf (file, _(" --disable-auto-image-base Do not auto-choose image base (default)\n")); fprintf (file, _(" --dll-search-prefix= When linking dynamically to a dll without\n\ an importlib, use .dll\n\ in preference to lib.dll \n")); @@ -439,24 +437,27 @@ gld_${EMULATION_NAME}_list_options (FILE *file) fprintf (file, _(" --disable-auto-import Do not auto-import DATA items from DLLs\n")); fprintf (file, _(" --enable-runtime-pseudo-reloc Work around auto-import limitations by\n\ adding pseudo-relocations resolved at\n\ - runtime.\n")); + runtime\n")); fprintf (file, _(" --disable-runtime-pseudo-reloc Do not add runtime pseudo-relocations for\n\ - auto-imported DATA.\n")); + auto-imported DATA\n")); fprintf (file, _(" --enable-extra-pep-debug Enable verbose debug output when building\n\ or linking to DLLs (esp. auto-import)\n")); fprintf (file, _(" --enable-long-section-names Use long COFF section names even in\n\ executable image files\n")); fprintf (file, _(" --disable-long-section-names Never use long COFF section names, even\n\ in object files\n")); - fprintf (file, _(" --dynamicbase Image base address may be relocated using\n\ - address space layout randomization (ASLR)\n")); - fprintf (file, _(" --forceinteg Code integrity checks are enforced\n")); - fprintf (file, _(" --nxcompat Image is compatible with data execution prevention\n")); - fprintf (file, _(" --no-isolation Image understands isolation but do not isolate the image\n")); - fprintf (file, _(" --no-seh Image does not use SEH. No SE handler may\n\ - be called in this image\n")); - fprintf (file, _(" --no-bind Do not bind this image\n")); - fprintf (file, _(" --wdmdriver Driver uses the WDM model\n")); + fprintf (file, _(" --high-entropy-va Image is compatible with 64-bit address space\n\ + layout randomization (ASLR)\n")); + fprintf (file, _(" --dynamicbase Image base address may be relocated using\n\ + address space layout randomization (ASLR)\n")); + fprintf (file, _(" --enable-reloc-section Create the base relocation table\n")); + fprintf (file, _(" --forceinteg Code integrity checks are enforced\n")); + fprintf (file, _(" --nxcompat Image is compatible with data execution prevention\n")); + fprintf (file, _(" --no-isolation Image understands isolation but do not isolate the image\n")); + fprintf (file, _(" --no-seh Image does not use SEH; no SE handler may\n\ + be called in this image\n")); + fprintf (file, _(" --no-bind Do not bind this image\n")); + fprintf (file, _(" --wdmdriver Driver uses the WDM model\n")); fprintf (file, _(" --tsaware Image is Terminal Server aware\n")); fprintf (file, _(" --build-id[=STYLE] Generate build ID\n")); #endif @@ -491,10 +492,10 @@ set_entry_point (void) int i; static const struct - { - const int value; - const char *entry; - } + { + const int value; + const char *entry; + } v[] = { { 1, "NtProcessStartup" }, @@ -509,21 +510,21 @@ set_entry_point (void) /* Entry point name for arbitrary subsystem numbers. */ static const char default_entry[] = "mainCRTStartup"; - if (link_info.shared || dll) + if (bfd_link_pic (&link_info) || dll) { entry = "DllMainCRTStartup"; } else { for (i = 0; v[i].entry; i++) - if (v[i].value == pep_subsystem) - break; + if (v[i].value == pep_subsystem) + break; /* If no match, use the default. */ if (v[i].entry != NULL) - entry = v[i].entry; + entry = v[i].entry; else - entry = default_entry; + entry = default_entry; } /* Now we check target's default for getting proper symbol_char. */ @@ -608,7 +609,7 @@ set_pep_subsystem (void) if (v[i].name == NULL) { - einfo (_("%P%F: invalid subsystem type %s\n"), optarg); + einfo (_("%F%P: invalid subsystem type %s\n"), optarg); return; } @@ -629,7 +630,7 @@ set_pep_value (char *name) set_pep_name (name, (bfd_vma) strtoull (optarg, &end, 0)); if (end == optarg) - einfo (_("%P%F: invalid hex number for PE parameter '%s'\n"), optarg); + einfo (_("%F%P: invalid hex number for PE parameter '%s'\n"), optarg); optarg = end; } @@ -646,7 +647,7 @@ set_pep_stack_heap (char *resname, char *comname) set_pep_value (comname); } else if (*optarg) - einfo (_("%P%F: strange hex info for PE parameter '%s'\n"), optarg); + einfo (_("%F%P: strange hex info for PE parameter '%s'\n"), optarg); } #define DEFAULT_BUILD_ID_STYLE "md5" @@ -721,6 +722,9 @@ gld${EMULATION_NAME}_handle_option (int optc) case OPTION_INSERT_TIMESTAMP: insert_timestamp = TRUE; break; + case OPTION_NO_INSERT_TIMESTAMP: + insert_timestamp = FALSE; + break; #ifdef DLL_SUPPORT case OPTION_OUT_DEF: pep_out_def_filename = xstrdup (optarg); @@ -752,9 +756,6 @@ gld${EMULATION_NAME}_handle_option (int optc) case OPTION_DISABLE_STDCALL_FIXUP: pep_enable_stdcall_fixup = 0; break; - case OPTION_IMPLIB_FILENAME: - pep_implib_filename = xstrdup (optarg); - break; case OPTION_WARN_DUPLICATE_EXPORTS: pep_dll_warn_dup_exports = 1; break; @@ -799,8 +800,14 @@ gld${EMULATION_NAME}_handle_option (int optc) pep_use_coff_long_section_names = 0; break; /* Get DLLCharacteristics bits */ + case OPTION_HIGH_ENTROPY_VA: + pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA; + /* fall through */ case OPTION_DYNAMIC_BASE: pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE; + /* fall through */ + case OPTION_ENABLE_RELOC_SECTION: + pep_dll_enable_reloc_section = 1; break; case OPTION_FORCE_INTEGRITY: pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY; @@ -891,9 +898,9 @@ gld_${EMULATION_NAME}_set_symbols (void) if (!init[IMAGEBASEOFF].inited) { - if (link_info.relocatable) + if (bfd_link_relocatable (&link_info)) init[IMAGEBASEOFF].value = 0; - else if (init[DLLOFF].value || (link_info.shared && !link_info.pie)) + else if (init[DLLOFF].value || bfd_link_dll (&link_info)) { #ifdef DLL_SUPPORT init[IMAGEBASEOFF].value = (pep_enable_auto_image_base @@ -909,7 +916,7 @@ gld_${EMULATION_NAME}_set_symbols (void) } /* Don't do any symbol assignments if this is a relocatable link. */ - if (link_info.relocatable) + if (bfd_link_relocatable (&link_info)) return; /* Glue the assignments into the abs section. */ @@ -940,7 +947,7 @@ gld_${EMULATION_NAME}_set_symbols (void) if (pep.FileAlignment > pep.SectionAlignment) { - einfo (_("%P: warning, file alignment > section alignment.\n")); + einfo (_("%P: warning, file alignment > section alignment\n")); } } @@ -961,13 +968,6 @@ gld_${EMULATION_NAME}_after_parse (void) after_parse_default (); } -/* pep-dll.c directly accesses pep_data_import_dll, - so it must be defined outside of #ifdef DLL_SUPPORT. - Note - this variable is deliberately not initialised. - This allows it to be treated as a common varaible, and only - exist in one incarnation in a multiple target enabled linker. */ -char * pep_data_import_dll; - #ifdef DLL_SUPPORT static struct bfd_link_hash_entry *pep_undef_found_sym; @@ -1028,7 +1028,7 @@ pep_fixup_stdcalls (void) if (pep_enable_stdcall_fixup == -1) { - einfo (_("Warning: resolving %s by linking to %s\n"), + einfo (_("warning: resolving %s by linking to %s\n"), undef->root.string, cname); if (! gave_warning_message) { @@ -1055,7 +1055,7 @@ pep_fixup_stdcalls (void) if (pep_enable_stdcall_fixup == -1) { - einfo (_("Warning: resolving %s by linking to %s\n"), + einfo (_("warning: resolving %s by linking to %s\n"), undef->root.string, sym->root.string); if (! gave_warning_message) { @@ -1069,8 +1069,8 @@ pep_fixup_stdcalls (void) } } -static int -make_import_fixup (arelent *rel, asection *s) +static void +make_import_fixup (arelent *rel, asection *s, char *name, const char *symname) { struct bfd_symbol *sym = *rel->sym_ptr_ptr; char addend[8]; @@ -1084,112 +1084,47 @@ make_import_fixup (arelent *rel, asection *s) memset (addend, 0, sizeof (addend)); switch ((rel->howto->bitsize)) { - case 8: - suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 1); - if (suc && rel->howto->pc_relative) - _addend = (bfd_vma) ((bfd_signed_vma) ((char) bfd_get_8 (s->owner, addend))); - else if (suc) - _addend = ((bfd_vma) bfd_get_8 (s->owner, addend)) & 0xff; - break; - case 16: - suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 2); - if (suc && rel->howto->pc_relative) - _addend = (bfd_vma) ((bfd_signed_vma) ((short) bfd_get_16 (s->owner, addend))); - else if (suc) - _addend = ((bfd_vma) bfd_get_16 (s->owner, addend)) & 0xffff; - break; - case 32: - suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 4); - if (suc && rel->howto->pc_relative) - _addend = (bfd_vma) ((bfd_signed_vma) ((int) bfd_get_32 (s->owner, addend))); - else if (suc) - _addend = ((bfd_vma) bfd_get_32 (s->owner, addend)) & 0xffffffff; - break; - case 64: - suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 8); - if (suc) - _addend = ((bfd_vma) bfd_get_64 (s->owner, addend)); - break; + case 8: + suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 1); + if (suc && rel->howto->pc_relative) + _addend = bfd_get_signed_8 (s->owner, addend); + else if (suc) + _addend = bfd_get_8 (s->owner, addend); + break; + case 16: + suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 2); + if (suc && rel->howto->pc_relative) + _addend = bfd_get_signed_16 (s->owner, addend); + else if (suc) + _addend = bfd_get_16 (s->owner, addend); + break; + case 32: + suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 4); + if (suc && rel->howto->pc_relative) + _addend = bfd_get_signed_32 (s->owner, addend); + else if (suc) + _addend = bfd_get_32 (s->owner, addend); + break; + case 64: + suc = bfd_get_section_contents (s->owner, s, addend, rel->address, 8); + if (suc) + _addend = bfd_get_64 (s->owner, addend); + break; } if (! suc) - einfo (_("%C: Cannot get section contents - auto-import exception\n"), + einfo (_("%P: %C: cannot get section contents - auto-import exception\n"), s->owner, s, rel->address); if (pep_dll_extra_pe_debug) { - printf ("import of 0x%lx(0x%lx) sec_addr=0x%lx", (long) _addend, (long) rel->addend, (long) rel->address); - if (rel->howto->pc_relative) printf (" pcrel"); - printf (" %d bit rel.\n",(int) rel->howto->bitsize); - } - pep_create_import_fixup (rel, s, _addend); - - return 1; -} - -static void -pep_find_data_imports (void) -{ - struct bfd_link_hash_entry *undef, *sym; - - if (link_info.pei386_auto_import == 0) - return; - - for (undef = link_info.hash->undefs; undef; undef=undef->u.undef.next) - { - if (undef->type == bfd_link_hash_undefined) - { - /* C++ symbols are *long*. */ - char buf[4096]; - - if (pep_dll_extra_pe_debug) - printf ("%s:%s\n", __FUNCTION__, undef->root.string); - - sprintf (buf, "__imp_%s", undef->root.string); - - sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1); - - if (sym && sym->type == bfd_link_hash_defined) - { - bfd *b = sym->u.def.section->owner; - asymbol **symbols; - int nsyms, i; - - if (!bfd_generic_link_read_symbols (b)) - { - einfo (_("%B%F: could not read symbols: %E\n"), b); - return; - } - - symbols = bfd_get_outsymbols (b); - nsyms = bfd_get_symcount (b); - - for (i = 0; i < nsyms; i++) - { - if (! CONST_STRNEQ (symbols[i]->name, U ("_head_"))) - continue; - - if (pep_dll_extra_pe_debug) - printf ("->%s\n", symbols[i]->name); - - pep_data_import_dll = (char*) (symbols[i]->name + - U_SIZE ("_head_") - 1); - break; - } - - pep_walk_relocs_of_symbol (&link_info, undef->root.string, - make_import_fixup); - - /* Let's differentiate it somehow from defined. */ - undef->type = bfd_link_hash_defweak; - /* We replace original name with __imp_ prefixed, this - 1) may trash memory 2) leads to duplicate symbol generation. - Still, IMHO it's better than having name poluted. */ - undef->root.string = sym->root.string; - undef->u.def.value = sym->u.def.value; - undef->u.def.section = sym->u.def.section; - } - } + printf ("import of 0x%lx(0x%lx) sec_addr=0x%lx", + (long) _addend, (long) rel->addend, (long) rel->address); + if (rel->howto->pc_relative) + printf (" pcrel"); + printf (" %d bit rel.\n", (int) rel->howto->bitsize); } + + pep_create_import_fixup (rel, s, _addend, name, symname); } static bfd_boolean @@ -1227,9 +1162,9 @@ pecoff_checksum_contents (bfd *abfd, status = bfd_bread (&b, (bfd_size_type) 1, abfd); if (status < 1) - { - break; - } + { + break; + } (*process) (&b, 1, arg); filepos += 1; @@ -1249,30 +1184,30 @@ write_build_id (bfd *abfd) bfd_size_type build_id_size; unsigned char *build_id; - /* Find the section the .build-id output section has been merged info. */ + /* Find the section the .buildid output section has been merged info. */ for (asec = abfd->sections; asec != NULL; asec = asec->next) { struct bfd_link_order *l = NULL; for (l = asec->map_head.link_order; l != NULL; l = l->next) - { - if ((l->type == bfd_indirect_link_order)) - { - if (l->u.indirect.section == t->build_id.sec) - { - link_order = l; - break; - } - } - } + { + if (l->type == bfd_indirect_link_order) + { + if (l->u.indirect.section == t->build_id.sec) + { + link_order = l; + break; + } + } + } if (link_order) - break; + break; } if (!link_order) { - einfo (_("%P: warning: .build-id section discarded," - " --build-id ignored.\n")); + einfo (_("%P: warning: .buildid section discarded," + " --build-id ignored\n")); return TRUE; } @@ -1307,7 +1242,7 @@ write_build_id (bfd *abfd) if (bfd_seek (abfd, asec->filepos + link_order->offset, SEEK_SET) != 0) return 0; - if ((bfd_bwrite (contents, size, abfd) != size)) + if (bfd_bwrite (contents, size, abfd) != size) return 0; /* Construct the CodeView record. */ @@ -1335,7 +1270,7 @@ write_build_id (bfd *abfd) return TRUE; } -/* Make .build-id section, and set up coff_tdata->build_id. */ +/* Make .buildid section, and set up coff_tdata->build_id. */ static bfd_boolean setup_build_id (bfd *ibfd) { @@ -1344,13 +1279,13 @@ setup_build_id (bfd *ibfd) if (!validate_build_id_style (emit_build_id)) { - einfo ("%P: warning: unrecognized --build-id style ignored.\n"); + einfo (_("%P: warning: unrecognized --build-id style ignored\n")); return FALSE; } flags = (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_IN_MEMORY | SEC_LINKER_CREATED | SEC_READONLY | SEC_DATA); - s = bfd_make_section_anyway_with_flags (ibfd, ".build-id", flags); + s = bfd_make_section_anyway_with_flags (ibfd, ".buildid", flags); if (s != NULL) { struct pe_tdata *t = pe_data (link_info.output_bfd); @@ -1368,8 +1303,8 @@ setup_build_id (bfd *ibfd) return TRUE; } - einfo ("%P: warning: Cannot create .build-id section," - " --build-id ignored.\n"); + einfo (_("%P: warning: cannot create .buildid section," + " --build-id ignored\n")); return FALSE; } @@ -1420,15 +1355,19 @@ gld_${EMULATION_NAME}_after_open (void) FIXME: This should be done via a function, rather than by including an internal BFD header. */ - if (coff_data (link_info.output_bfd) == NULL + if (bfd_get_flavour (link_info.output_bfd) != bfd_target_coff_flavour + || coff_data (link_info.output_bfd) == NULL || coff_data (link_info.output_bfd)->pe == 0) - einfo (_("%F%P: cannot perform PE operations on non PE output file '%B'.\n"), + einfo (_("%F%P: cannot perform PE operations on non PE output file '%pB'\n"), link_info.output_bfd); pe_data (link_info.output_bfd)->pe_opthdr = pep; pe_data (link_info.output_bfd)->dll = init[DLLOFF].value; pe_data (link_info.output_bfd)->real_flags |= real_flags; - pe_data (link_info.output_bfd)->insert_timestamp = insert_timestamp; + if (insert_timestamp) + pe_data (link_info.output_bfd)->timestamp = -1; + else + pe_data (link_info.output_bfd)->timestamp = 0; /* At this point we must decide whether to use long section names in the output or not. If the user hasn't explicitly specified @@ -1438,7 +1377,7 @@ gld_${EMULATION_NAME}_after_open (void) find it, so enable it in that case. */ if (pep_use_coff_long_section_names < 0 && link_info.strip == strip_none) { - if (link_info.relocatable) + if (bfd_link_relocatable (&link_info)) pep_use_coff_long_section_names = 1; else { @@ -1461,22 +1400,21 @@ gld_${EMULATION_NAME}_after_open (void) pep_output_file_set_long_section_names (link_info.output_bfd); #ifdef DLL_SUPPORT - if (pep_enable_stdcall_fixup) /* -1=warn or 1=disable */ - pep_fixup_stdcalls (); - pep_process_import_defs (link_info.output_bfd, &link_info); - pep_find_data_imports (); + if (link_info.pei386_auto_import) /* -1=warn or 1=enable */ + pep_find_data_imports (U ("_head_"), make_import_fixup); - /* As possibly new symbols are added by imports, we rerun - stdcall/fastcall fixup here. */ - if (pep_enable_stdcall_fixup) /* -1=warn or 1=disable */ + /* The implementation of the feature is rather dumb and would cause the + compilation time to go through the roof if there are many undefined + symbols in the link, so it needs to be run after auto-import. */ + if (pep_enable_stdcall_fixup) /* -1=warn or 1=enable */ pep_fixup_stdcalls (); #ifndef TARGET_IS_i386pep - if (link_info.shared) + if (bfd_link_pic (&link_info)) #else - if (!link_info.relocatable) + if (!bfd_link_relocatable (&link_info)) #endif pep_dll_build_sections (link_info.output_bfd, &link_info); @@ -1532,7 +1470,7 @@ gld_${EMULATION_NAME}_after_open (void) if (!bfd_generic_link_read_symbols (is->the_bfd)) { - einfo (_("%B%F: could not read symbols: %E\n"), + einfo (_("%F%P: %pB: could not read symbols: %E\n"), is->the_bfd); return; } @@ -1544,7 +1482,7 @@ gld_${EMULATION_NAME}_after_open (void) if (nrelocs < 0) { free (relocs); - einfo ("%X%P: unable to process relocs: %E\n"); + einfo (_("%X%P: unable to process relocs: %E\n")); return; } @@ -1552,7 +1490,7 @@ gld_${EMULATION_NAME}_after_open (void) { struct bfd_symbol *s; struct bfd_link_hash_entry * blhe; - char *other_bfd_filename; + const char *other_bfd_filename; char *n; s = (relocs[i]->sym_ptr_ptr)[0]; @@ -1582,7 +1520,7 @@ gld_${EMULATION_NAME}_after_open (void) /* Rename this implib to match the other one. */ n = xmalloc (strlen (other_bfd_filename) + 1); strcpy (n, other_bfd_filename); - is->the_bfd->my_archive->filename = n; + bfd_set_filename (is->the_bfd->my_archive, n); } free (relocs); @@ -1687,7 +1625,7 @@ gld_${EMULATION_NAME}_after_open (void) new_name = xmalloc (strlen (is->the_bfd->filename) + 3); sprintf (new_name, "%s.%c", is->the_bfd->filename, seq); - is->the_bfd->filename = new_name; + bfd_set_filename (is->the_bfd, new_name); new_name = xmalloc (strlen (is->filename) + 3); sprintf (new_name, "%s.%c", is->filename, seq); @@ -1756,7 +1694,7 @@ gld_${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry ATTRIB h = bfd_link_hash_lookup (link_info.hash, buf, TRUE, TRUE, TRUE); if (h == (struct bfd_link_hash_entry *) NULL) - einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n")); + einfo (_("%F%P: bfd_link_hash_lookup failed: %E\n")); if (h->type == bfd_link_hash_new) { h->type = bfd_link_hash_undefined; @@ -1768,7 +1706,7 @@ gld_${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry ATTRIB /* def_file_print (stdout, pep_def_file); */ if (pep_def_file->is_dll == 1) - link_info.shared = 1; + link_info.type = type_dll; if (pep_def_file->base_address != (bfd_vma)(-1)) { @@ -1825,12 +1763,15 @@ gld_${EMULATION_NAME}_finish (void) finish_default (); #ifdef DLL_SUPPORT - if (link_info.shared - || (!link_info.relocatable && pep_def_file->num_exports != 0)) + if (bfd_link_pic (&link_info) + || pep_dll_enable_reloc_section + || (!bfd_link_relocatable (&link_info) + && pep_def_file->num_exports != 0)) { pep_dll_fill_sections (link_info.output_bfd, &link_info); - if (pep_implib_filename) - pep_dll_generate_implib (pep_def_file, pep_implib_filename, &link_info); + if (command_line.out_implib_filename) + pep_dll_generate_implib (pep_def_file, + command_line.out_implib_filename, &link_info); } if (pep_out_def_filename) @@ -1876,7 +1817,7 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, lang_statement_union_type **pl; /* Look through the script to see where to place this section. */ - if (!link_info.relocatable + if (!bfd_link_relocatable (&link_info) && (dollar = strchr (secname, '\$')) != NULL) { size_t len = dollar - secname; @@ -1958,6 +1899,8 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, struct orphan_save *place; lang_output_section_statement_type *after; etree_type *address; + flagword flags; + asection *nexts; if (!orphan_init_done) { @@ -1972,17 +1915,33 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, orphan_init_done = 1; } + flags = s->flags; + if (!bfd_link_relocatable (&link_info)) + { + nexts = s; + while ((nexts = bfd_get_next_section_by_name (nexts->owner, + nexts))) + if (nexts->output_section == NULL + && (nexts->flags & SEC_EXCLUDE) == 0 + && ((nexts->flags ^ flags) & (SEC_LOAD | SEC_ALLOC)) == 0 + && (nexts->owner->flags & DYNAMIC) == 0 + && !bfd_input_just_syms (nexts->owner)) + flags = (((flags ^ SEC_READONLY) + | (nexts->flags ^ SEC_READONLY)) + ^ SEC_READONLY); + } + /* Try to put the new output section in a reasonable place based on the section name and section flags. */ place = NULL; - if ((s->flags & SEC_ALLOC) == 0) + if ((flags & SEC_ALLOC) == 0) ; - else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0) + else if ((flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0) place = &hold[orphan_bss]; - else if ((s->flags & SEC_READONLY) == 0) + else if ((flags & SEC_READONLY) == 0) place = &hold[orphan_data]; - else if ((s->flags & SEC_CODE) == 0) + else if ((flags & SEC_CODE) == 0) { place = (!strncmp (secname, ".idata\$", 7) ? &hold[orphan_idata] : &hold[orphan_rodata]); @@ -1997,11 +1956,11 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, place->os = lang_output_section_find (place->name); after = place->os; if (after == NULL) - after = lang_output_section_find_by_flags (s, &place->os, NULL); + after = lang_output_section_find_by_flags (s, flags, &place->os, + NULL); if (after == NULL) /* *ABS* is always the first output section statement. */ - after = (&lang_output_section_statement.head - ->output_section_statement); + after = (void *) lang_os_list.head; } /* All sections in an executable must be aligned to a page boundary. @@ -2010,9 +1969,9 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, address = exp_unop (ALIGN_K, exp_nameop (NAME, "__section_alignment__")); os = lang_insert_orphan (s, secname, constraint, after, place, address, &add_child); - if (link_info.relocatable) + if (bfd_link_relocatable (&link_info)) { - os->section_alignment = s->alignment_power; + os->section_alignment = exp_intop (1U << s->alignment_power); os->bfd_section->alignment_power = s->alignment_power; } } @@ -2029,7 +1988,7 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, ls = &(*pl)->input_section; - lname = bfd_get_section_name (ls->section->owner, ls->section); + lname = bfd_section_name (ls->section); if (strchr (lname, '\$') != NULL && (dollar == NULL || strcmp (orig_secname, lname) < 0)) break; @@ -2062,11 +2021,13 @@ gld_${EMULATION_NAME}_open_dynamic_archive /* Alternate explicit import library for dll's. */ { "%s.dll.a", FALSE }, /* "libfoo.a" could be either an import lib or a static lib. - For backwards compatibility, libfoo.a needs to precede - libfoo.dll and foo.dll in the search. */ + For backwards compatibility, libfoo.a needs to precede + libfoo.dll and foo.dll in the search. */ { "lib%s.a", FALSE }, /* The 'native' spelling of an import lib name is "foo.lib". */ { "%s.lib", FALSE }, + /* PR 22948 - Check for an import library. */ + { "lib%s.lib", FALSE }, #ifdef DLL_SUPPORT /* Try "foo.dll" (preferred dll name, if specified). */ { "%s%s.dll", TRUE }, @@ -2166,11 +2127,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 @@ -2194,6 +2155,8 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = hll_default, gld_${EMULATION_NAME}_after_parse, gld_${EMULATION_NAME}_after_open, + after_check_relocs_default, + before_place_orphans_default, after_allocation_default, set_output_arch_default, ldemul_default_target, @@ -2214,6 +2177,8 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = gld_${EMULATION_NAME}_recognized_file, gld_${EMULATION_NAME}_find_potential_libraries, NULL, /* new_vers_pattern. */ - NULL /* extra_map_file_text */ + NULL, /* extra_map_file_text */ + ${LDEMUL_EMIT_CTF_EARLY-NULL}, + ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL} }; EOF