X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Femultempl%2Fpe.em;h=3899c9d92c8d43ce6596adef4092628f8bd6ba6c;hb=d27c357a5b83773054e85ff3ea5dbfe18b9dd3c0;hp=ffa8b74b20449b3106d1d1916ae505464d30c1d9;hpb=df5f2391f7b2e3cab7e677ab7dadd02aef06e269;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index ffa8b74b20..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 <sym_ptr_ptr; char addend[4]; + bfd_vma _addend; if (pe_dll_extra_pe_debug) printf ("arelent: %s@%#lx: add=%li\n", sym->name, @@ -1143,117 +1133,8 @@ make_import_fixup (arelent *rel, asection *s, char *name) 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; this should work unless it " - "involves constant data structures referencing " - "symbols from auto-imported DLLs\n")); - } - } - - if (!bfd_generic_link_read_symbols (b)) - { - einfo (_("%F%P: %pB: 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 @@ -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,7 +1363,8 @@ 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 '%pB'\n"), link_info.output_bfd); @@ -1490,7 +1372,10 @@ gld_${EMULATION_NAME}_after_open (void) 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,7 +1432,7 @@ 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. @@ -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); } } } @@ -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. @@ -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 (); } @@ -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 }, @@ -2475,6 +2354,7 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = 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, @@ -2495,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