X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Femultempl%2Fpe.em;h=3899c9d92c8d43ce6596adef4092628f8bd6ba6c;hb=d27c357a5b83773054e85ff3ea5dbfe18b9dd3c0;hp=06934831dd7b3ecae1c36e66608006f65c9c93fe;hpb=6c19b93bcd0d136f7be4d1e1e3f2e8d7b5917009;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index 06934831dd..3899c9d92c 100644 --- a/ld/emultempl/pe.em +++ b/ld/emultempl/pe.em @@ -8,7 +8,7 @@ fi rm -f e${EMULATION_NAME}.c (echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-) fragment < pe.SectionAlignment) { - einfo (_("%P: warning, file alignment > section alignment.\n")); + einfo (_("%P: warning, file alignment > section alignment\n")); } } @@ -1022,13 +1018,6 @@ gld_${EMULATION_NAME}_after_parse (void) after_parse_default (); } -/* pe-dll.c directly accesses pe_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 * pe_data_import_dll; - #ifdef DLL_SUPPORT static struct bfd_link_hash_entry *pe_undef_found_sym; @@ -1066,7 +1055,7 @@ change_undef (struct bfd_link_hash_entry * undef, if (pe_enable_stdcall_fixup == -1) { - einfo (_("Warning: resolving %s by linking to %s\n"), + einfo (_("%P: warning: resolving %s by linking to %s\n"), undef->root.string, sym->root.string); if (! gave_warning_message) @@ -1129,131 +1118,23 @@ pe_fixup_stdcalls (void) } } -static int -make_import_fixup (arelent *rel, asection *s, char *name) +static void +make_import_fixup (arelent *rel, asection *s, char *name, const char *symname) { struct bfd_symbol *sym = *rel->sym_ptr_ptr; char addend[4]; + bfd_vma _addend; if (pe_dll_extra_pe_debug) printf ("arelent: %s@%#lx: add=%li\n", sym->name, (unsigned long) rel->address, (long) rel->addend); if (! bfd_get_section_contents (s->owner, s, addend, rel->address, sizeof (addend))) - 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); - pe_create_import_fixup (rel, s, bfd_get_32 (s->owner, addend), name); - - return 1; -} - -static void -pe_find_data_imports (void) -{ - struct bfd_link_hash_entry *undef, *sym; - size_t namelen; - char *buf, *name; - - if (link_info.pei386_auto_import == 0) - return; - - namelen = 0; - for (undef = link_info.hash->undefs; undef; undef = undef->u.undef.next) - { - if (undef->type == bfd_link_hash_undefined) - { - size_t len = strlen (undef->root.string); - if (namelen < len) - namelen = len; - } - } - if (namelen == 0) - return; - - /* We are being a bit cunning here. The buffer will have space for - prefixes at the beginning. The prefix is modified here and in a - number of functions called from this function. */ -#define PREFIX_LEN 32 - buf = xmalloc (PREFIX_LEN + namelen + 1); - name = buf + PREFIX_LEN; - - for (undef = link_info.hash->undefs; undef; undef = undef->u.undef.next) - { - if (undef->type == bfd_link_hash_undefined) - { - char *impname; - - if (pe_dll_extra_pe_debug) - printf ("%s:%s\n", __FUNCTION__, undef->root.string); - - strcpy (name, undef->root.string); - impname = name - (sizeof "__imp_" - 1); - memcpy (impname, "__imp_", sizeof "__imp_" - 1); - - sym = bfd_link_hash_lookup (link_info.hash, impname, 0, 0, 1); - - if (sym && sym->type == bfd_link_hash_defined) - { - bfd *b = sym->u.def.section->owner; - asymbol **symbols; - int nsyms, i; - - if (link_info.pei386_auto_import == -1) - { - static bfd_boolean warned = FALSE; - - info_msg (_("Info: resolving %s by linking to %s " - "(auto-import)\n"), name, impname); - - /* PR linker/4844. */ - if (! warned) - { - warned = TRUE; - einfo (_("%P: warning: auto-importing has been activated " - "without --enable-auto-import specified on the " - "command line.\nThis should work unless it " - "involves constant data structures referencing " - "symbols from auto-imported DLLs.\n")); - } - } - - 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 (pe_dll_extra_pe_debug) - printf ("->%s\n", symbols[i]->name); - - pe_data_import_dll = (char *) (symbols[i]->name - + U_SIZE ("_head_") - 1); - break; - } - - pe_walk_relocs_of_symbol (&link_info, name, 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 polluted. */ - undef->root.string = sym->root.string; - undef->u.def.value = sym->u.def.value; - undef->u.def.section = sym->u.def.section; - } - } - } - free (buf); + _addend = bfd_get_32 (s->owner, addend); + pe_create_import_fixup (rel, s, _addend, name, symname); } static bfd_boolean @@ -1335,7 +1216,7 @@ write_build_id (bfd *abfd) if (!link_order) { einfo (_("%P: warning: .buildid section discarded," - " --build-id ignored.\n")); + " --build-id ignored\n")); return TRUE; } @@ -1407,7 +1288,7 @@ 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; } @@ -1431,8 +1312,8 @@ setup_build_id (bfd *ibfd) return TRUE; } - einfo (_("%P: warning: Cannot create .buildid section," - " --build-id ignored.\n")); + einfo (_("%P: warning: cannot create .buildid section," + " --build-id ignored\n")); return FALSE; } @@ -1454,7 +1335,7 @@ gld_${EMULATION_NAME}_after_open (void) bfd_hash_traverse (&link_info.hash->table, pr_sym, NULL); for (a = link_info.input_bfds; a; a = a->link.next) - printf ("*%s\n",a->filename); + printf ("*%s\n", bfd_get_filename (a)); } #endif @@ -1482,15 +1363,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 = pe; 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 @@ -1523,21 +1408,19 @@ gld_${EMULATION_NAME}_after_open (void) pe_output_file_set_long_section_names (link_info.output_bfd); #ifdef DLL_SUPPORT - if (pe_enable_stdcall_fixup) /* -1=warn or 1=disable */ - pe_fixup_stdcalls (); - pe_process_import_defs (link_info.output_bfd, &link_info); - pe_find_data_imports (); + if (link_info.pei386_auto_import) /* -1=warn or 1=enable */ + pe_find_data_imports (U ("_head_"), make_import_fixup); - /* As possibly new symbols are added by imports, we rerun - stdcall/fastcall fixup here. */ - if (pe_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 (pe_enable_stdcall_fixup) /* -1=warn or 1=enable */ pe_fixup_stdcalls (); #if defined (TARGET_IS_i386pe) \ || defined (TARGET_IS_armpe) \ - || defined (TARGET_IS_arm_epoc_pe) \ || defined (TARGET_IS_arm_wince_pe) if (!bfd_link_relocatable (&link_info)) pe_dll_build_sections (link_info.output_bfd, &link_info); @@ -1549,15 +1432,15 @@ gld_${EMULATION_NAME}_after_open (void) #endif #endif /* DLL_SUPPORT */ -#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe) +#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_wince_pe) if (strstr (bfd_get_target (link_info.output_bfd), "arm") == NULL) { /* The arm backend needs special fields in the output hash structure. These will only be created if the output format is an arm format, hence we do not support linking and changing output formats at the same time. Use a link followed by objcopy to change output formats. */ - einfo (_("%F%X%P: error: cannot change output format " - "whilst linking ARM binaries\n")); + einfo (_("%F%P: error: cannot change output format " + "whilst linking %s binaries\n"), "ARM"); return; } { @@ -1616,7 +1499,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; } @@ -1636,8 +1519,7 @@ gld_${EMULATION_NAME}_after_open (void) { struct bfd_symbol *s; struct bfd_link_hash_entry * blhe; - char *other_bfd_filename; - char *n; + const char *other_bfd_filename; s = (relocs[i]->sym_ptr_ptr)[0]; @@ -1664,9 +1546,9 @@ gld_${EMULATION_NAME}_after_open (void) continue; /* 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; + if (!bfd_set_filename (is->the_bfd->my_archive, + other_bfd_filename)) + einfo ("%F%P: %pB: %E\n", is->the_bfd); } free (relocs); @@ -1713,7 +1595,7 @@ gld_${EMULATION_NAME}_after_open (void) members, so look for the first element with a .dll extension, and use that for the remainder of the comparisons. */ - pnt = strrchr (is3->the_bfd->filename, '.'); + pnt = strrchr (bfd_get_filename (is3->the_bfd), '.'); if (pnt != NULL && filename_cmp (pnt, ".dll") == 0) break; } @@ -1730,12 +1612,12 @@ gld_${EMULATION_NAME}_after_open (void) { /* Skip static members, ie anything with a .obj extension. */ - pnt = strrchr (is2->the_bfd->filename, '.'); + pnt = strrchr (bfd_get_filename (is2->the_bfd), '.'); if (pnt != NULL && filename_cmp (pnt, ".obj") == 0) continue; - if (filename_cmp (is3->the_bfd->filename, - is2->the_bfd->filename)) + if (filename_cmp (bfd_get_filename (is3->the_bfd), + bfd_get_filename (is2->the_bfd))) { is_ms_arch = 0; break; @@ -1747,7 +1629,7 @@ gld_${EMULATION_NAME}_after_open (void) /* This fragment might have come from an .obj file in a Microsoft import, and not an actual import record. If this is the case, then leave the filename alone. */ - pnt = strrchr (is->the_bfd->filename, '.'); + pnt = strrchr (bfd_get_filename (is->the_bfd), '.'); if (is_ms_arch && (filename_cmp (pnt, ".dll") == 0)) { @@ -1769,13 +1651,14 @@ gld_${EMULATION_NAME}_after_open (void) else /* sentinel */ seq = 'c'; - 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; - - new_name = xmalloc (strlen (is->filename) + 3); - sprintf (new_name, "%s.%c", is->filename, seq); - is->filename = new_name; + new_name + = xmalloc (strlen (bfd_get_filename (is->the_bfd)) + 3); + sprintf (new_name, "%s.%c", + bfd_get_filename (is->the_bfd), seq); + is->filename = bfd_set_filename (is->the_bfd, new_name); + free (new_name); + if (!is->filename) + einfo ("%F%P: %pB: %E\n", is->the_bfd); } } } @@ -1823,7 +1706,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; } @@ -1866,7 +1749,7 @@ gld_${EMULATION_NAME}_before_allocation (void) if (!ppc_process_before_allocation (is->the_bfd, &link_info)) { /* xgettext:c-format */ - einfo (_("Errors encountered processing file %s\n"), is->filename); + einfo (_("%P: errors encountered processing file %s\n"), is->filename); } } } @@ -1875,7 +1758,7 @@ gld_${EMULATION_NAME}_before_allocation (void) ppc_allocate_toc_section (&link_info); #endif /* TARGET_IS_ppcpe */ -#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe) +#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_wince_pe) /* FIXME: we should be able to set the size of the interworking stub section. @@ -1889,7 +1772,7 @@ gld_${EMULATION_NAME}_before_allocation (void) (is->the_bfd, & link_info, support_old_code)) { /* xgettext:c-format */ - einfo (_("Errors encountered processing file %s for interworking\n"), + einfo (_("%P: errors encountered processing file %s for interworking\n"), is->filename); } } @@ -1897,7 +1780,7 @@ gld_${EMULATION_NAME}_before_allocation (void) /* We have seen it all. Allocate it, and carry on. */ bfd_arm_allocate_interworking_sections (& link_info); -#endif /* TARGET_IS_armpe || TARGET_IS_arm_epoc_pe || TARGET_IS_arm_wince_pe */ +#endif /* TARGET_IS_armpe || TARGET_IS_arm_wince_pe */ before_allocation_default (); } @@ -1951,7 +1834,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; @@ -2012,9 +1895,6 @@ gld_${EMULATION_NAME}_recognized_file (lang_input_statement_type *entry ATTRIBUT #ifdef TARGET_IS_armpe pe_dll_id_target ("pei-arm-little"); #endif -#ifdef TARGET_IS_arm_epoc_pe - pe_dll_id_target ("epoc-pei-arm-little"); -#endif #ifdef TARGET_IS_arm_wince_pe pe_dll_id_target ("pei-arm-wince-little"); #endif @@ -2027,7 +1907,7 @@ gld_${EMULATION_NAME}_recognized_file (lang_input_statement_type *entry ATTRIBUT static void gld_${EMULATION_NAME}_finish (void) { -#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe) +#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_wince_pe) struct bfd_link_hash_entry * h; if (thumb_entry_symbol != NULL) @@ -2046,8 +1926,7 @@ gld_${EMULATION_NAME}_finish (void) /* Special procesing is required for a Thumb entry symbol. The bottom bit of its address must be set. */ val = (h->u.def.value - + bfd_get_section_vma (link_info.output_bfd, - h->u.def.section->output_section) + + bfd_section_vma (h->u.def.section->output_section) + h->u.def.section->output_offset); val |= 1; @@ -2067,13 +1946,14 @@ gld_${EMULATION_NAME}_finish (void) else einfo (_("%P: warning: cannot find thumb start symbol %s\n"), thumb_entry_symbol); } -#endif /* defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe) */ +#endif /* defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_wince_pe) */ finish_default (); #ifdef DLL_SUPPORT if (bfd_link_pic (&link_info) #if !defined(TARGET_IS_shpe) + || pe_dll_enable_reloc_section || (!bfd_link_relocatable (&link_info) && pe_def_file->num_exports != 0) #endif @@ -2243,9 +2123,7 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, && (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_input_just_syms (nexts->owner)) flags = (((flags ^ SEC_READONLY) | (nexts->flags ^ SEC_READONLY)) ^ SEC_READONLY); @@ -2280,8 +2158,7 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, 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. @@ -2292,7 +2169,7 @@ gld_${EMULATION_NAME}_place_orphan (asection *s, &add_child); 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; } } @@ -2309,7 +2186,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; @@ -2347,6 +2224,8 @@ gld_${EMULATION_NAME}_open_dynamic_archive { "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 }, @@ -2474,6 +2353,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, @@ -2494,6 +2375,9 @@ 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}, + ${LDEMUL_PRINT_SYMBOL-NULL} }; EOF