Index: src/ld/emultempl/pe.em =================================================================== --- src.orig/ld/emultempl/pe.em 2010-05-15 10:01:35.959567200 +0200 +++ src/ld/emultempl/pe.em 2010-05-15 11:43:33.517523700 +0200 @@ -142,20 +142,24 @@ extern const char *output_filename; -static void -gld_${EMULATION_NAME}_before_parse (void) +static int is_underscoring (void) { - int u; - /* Now we check target's default for getting proper symbol_char. */ - u = pe_leading_underscore; - if (u == -1 - && !bfd_get_target_info ("${OUTPUT_FORMAT}", NULL, NULL, &u, NULL)) + int u = 0; + if (pe_leading_underscore != -1) + return pe_leading_underscore; + if (!bfd_get_target_info ("${OUTPUT_FORMAT}", NULL, NULL, &u, NULL)) bfd_get_target_info ("${RELOCATEABLE_OUTPUT_FORMAT}", NULL, NULL, &u, NULL); if (u == -1) abort (); - pe_leading_underscore = u; + pe_leading_underscore = (u != 0 ? 1 : 0); + return pe_leading_underscore; +} +static void +gld_${EMULATION_NAME}_before_parse (void) +{ + is_underscoring (); ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`); output_filename = "${EXECUTABLE_NAME:-a.exe}"; #ifdef DLL_SUPPORT @@ -353,16 +357,16 @@ underscore. */ #define GET_INIT_SYMBOL_NAME(IDX) \ (init[(IDX)].symbol \ - + ((init[(IDX)].is_c_symbol == FALSE || pe_leading_underscore != 0) ? 0 : 1)) + + ((init[(IDX)].is_c_symbol == FALSE || (is_underscoring () != 0)) ? 0 : 1)) /* Decorates the C visible symbol by underscore, if target requires. */ #define U(CSTR) \ - (pe_leading_underscore == 0 ? CSTR : "_" CSTR) + ((is_underscoring () == 0) ? CSTR : "_" CSTR) /* Get size of constant string for a possible underscore prefixed C visible symbol. */ #define U_SIZE(CSTR) \ - (sizeof (CSTR) + pe_leading_underscore == 0 ? 0 : 1) + (sizeof (CSTR) + (is_underscoring () == 0 ? 0 : 1)) #define D(field,symbol,def,usc) {&pe.field,sizeof(pe.field), def, symbol, 0, usc} @@ -474,17 +478,8 @@ static void set_pe_name (char *name, long val) { - int i, u; - - /* Now we check target's default for getting proper symbol_char. */ - u = pe_leading_underscore; - if (u == -1 - && !bfd_get_target_info ("${OUTPUT_FORMAT}", NULL, NULL, &u, NULL)) - bfd_get_target_info ("${RELOCATEABLE_OUTPUT_FORMAT}", NULL, NULL, &u, NULL); - - if (u == -1) - abort (); - pe_leading_underscore = u; + int i; + is_underscoring (); /* Find the name and set it. */ for (i = 0; init[i].ptr; i++) @@ -506,7 +501,7 @@ { const char *entry; const char *initial_symbol_char; - int i, u = -1; + int i; static const struct { @@ -549,16 +544,7 @@ entry = default_entry; } - /* Now we check target's default for getting proper symbol_char. */ - u = pe_leading_underscore; - if (u == -1 - && !bfd_get_target_info ("${OUTPUT_FORMAT}", NULL, NULL, &u, NULL)) - bfd_get_target_info ("${RELOCATEABLE_OUTPUT_FORMAT}", NULL, NULL, &u, NULL); - - if (u == -1) - abort (); - initial_symbol_char = (u == 1 ? "_" : ""); - pe_leading_underscore = u; + initial_symbol_char = (is_underscoring () != 0 ? "_" : ""); if (*initial_symbol_char != '\0') { @@ -915,16 +901,9 @@ { /* Run through and invent symbols for all the names and insert the defaults. */ - int j, u; - /* Now we check target's default for getting proper symbol_char. */ - u = pe_leading_underscore; - if (u == -1 - && !bfd_get_target_info ("${OUTPUT_FORMAT}", NULL, NULL, &u, NULL)) - bfd_get_target_info ("${RELOCATEABLE_OUTPUT_FORMAT}", NULL, NULL, &u, NULL); + int j; - if (u == -1) - abort (); - pe_leading_underscore = u; + is_underscoring (); if (!init[IMAGEBASEOFF].inited) { Index: src/ld/emultempl/pep.em =================================================================== --- src.orig/ld/emultempl/pep.em 2010-05-15 10:01:35.959567200 +0200 +++ src/ld/emultempl/pep.em 2010-05-15 11:31:30.827053600 +0200 @@ -115,20 +115,25 @@ extern const char *output_filename; -static void -gld_${EMULATION_NAME}_before_parse (void) +static int is_underscoring (void) { - int u; - /* Now we check target's default for getting proper symbol_char. */ - u = pep_leading_underscore; - if (u == -1 - && !bfd_get_target_info ("${OUTPUT_FORMAT}", NULL, NULL, &u, NULL)) + int u = 0; + if (pep_leading_underscore != -1) + return pep_leading_underscore; + if (!bfd_get_target_info ("${OUTPUT_FORMAT}", NULL, NULL, &u, NULL)) bfd_get_target_info ("${RELOCATEABLE_OUTPUT_FORMAT}", NULL, NULL, &u, NULL); if (u == -1) abort (); - pep_leading_underscore = u; + pep_leading_underscore = (u != 0 ? 1 : 0); + return pep_leading_underscore; +} + +static void +gld_${EMULATION_NAME}_before_parse (void) +{ + is_underscoring (); ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`); output_filename = "${EXECUTABLE_NAME:-a.exe}"; #ifdef DLL_SUPPORT @@ -297,16 +302,16 @@ #define GET_INIT_SYMBOL_NAME(IDX) \ (init[(IDX)].symbol \ - + ((init[(IDX)].is_c_symbol == FALSE || pep_leading_underscore == 1) ? 0 : 1)) + + ((init[(IDX)].is_c_symbol == FALSE || (is_underscoring () == 1)) ? 0 : 1)) /* Decorates the C visible symbol by underscore, if target requires. */ #define U(CSTR) \ - (pep_leading_underscore != 1 ? CSTR : "_" CSTR) + ((is_underscoring () == 0) ? CSTR : "_" CSTR) /* Get size of constant string for a possible underscore prefixed C visible symbol. */ #define U_SIZE(CSTR) \ - (sizeof (CSTR) + pep_leading_underscore == 1 ? 0 : 1) + (sizeof (CSTR) + (is_underscoring () == 0 ? 0 : 1)) #define D(field,symbol,def,usc) {&pep.field,sizeof(pep.field), def, symbol,0, usc} @@ -411,18 +416,8 @@ static void set_pep_name (char *name, bfd_vma val) { - int i, u; - - /* Now we check target's default for getting proper symbol_char. */ - u = pep_leading_underscore; - if (u == -1 - && !bfd_get_target_info ("${OUTPUT_FORMAT}", NULL, NULL, &u, NULL)) - bfd_get_target_info ("${RELOCATEABLE_OUTPUT_FORMAT}", NULL, NULL, &u, NULL); - - if (u == -1) - abort (); - pep_leading_underscore = u; - + int i; + is_underscoring (); /* Find the name and set it. */ for (i = 0; init[i].ptr; i++) { @@ -443,7 +438,7 @@ { const char *entry; const char *initial_symbol_char; - int i, u = -1; + int i; static const struct { @@ -482,15 +477,7 @@ } /* Now we check target's default for getting proper symbol_char. */ - u = pep_leading_underscore; - if (u == -1 - && !bfd_get_target_info ("${OUTPUT_FORMAT}", NULL, NULL, &u, NULL)) - bfd_get_target_info ("${RELOCATEABLE_OUTPUT_FORMAT}", NULL, NULL, &u, NULL); - - if (u == -1) - abort (); - initial_symbol_char = (u == 1 ? "_" : ""); - pep_leading_underscore = u; + initial_symbol_char = (is_underscoring () != 0 ? "_" : ""); if (*initial_symbol_char != '\0') { @@ -616,6 +603,7 @@ static bfd_boolean gld${EMULATION_NAME}_handle_option (int optc) { + is_underscoring (); switch (optc) { default: @@ -840,16 +828,9 @@ { /* Run through and invent symbols for all the names and insert the defaults. */ - int j, u; - /* Now we check target's default for getting proper symbol_char. */ - u = pep_leading_underscore; - if (u == -1 - && !bfd_get_target_info ("${OUTPUT_FORMAT}", NULL, NULL, &u, NULL)) - bfd_get_target_info ("${RELOCATEABLE_OUTPUT_FORMAT}", NULL, NULL, &u, NULL); + int j; - if (u == -1) - abort (); - pep_leading_underscore = u; + is_underscoring (); if (!init[IMAGEBASEOFF].inited) { @@ -1191,6 +1172,7 @@ static void gld_${EMULATION_NAME}_after_open (void) { + is_underscoring (); #ifdef DLL_SUPPORT if (pep_dll_extra_pe_debug) { @@ -1485,6 +1467,7 @@ static void gld_${EMULATION_NAME}_before_allocation (void) { + is_underscoring (); before_allocation_default (); } @@ -1497,6 +1480,8 @@ { int i; + is_underscoring (); + for (i = 0; init[i].ptr; i++) if (strcmp (GET_INIT_SYMBOL_NAME (i), option) == 0) return init[i].inited; @@ -1587,6 +1572,7 @@ static bfd_boolean gld_${EMULATION_NAME}_recognized_file (lang_input_statement_type *entry ATTRIBUTE_UNUSED) { + is_underscoring (); #ifdef DLL_SUPPORT #ifdef TARGET_IS_i386pep pep_dll_id_target ("pei-x86-64"); @@ -1600,6 +1586,7 @@ static void gld_${EMULATION_NAME}_finish (void) { + is_underscoring (); finish_default (); #ifdef DLL_SUPPORT Index: src/ld/pe-dll.c =================================================================== --- src.orig/ld/pe-dll.c 2010-05-15 10:01:35.959567200 +0200 +++ src/ld/pe-dll.c 2010-05-15 11:51:27.399156600 +0200 @@ -185,7 +185,7 @@ int pe_arch; int bfd_arch; bfd_boolean underscored; - const autofilter_entry_type* autofilter_symbollist; + const autofilter_entry_type* autofilter_symbollist; } pe_details_type; @@ -222,7 +222,7 @@ { STRING_COMMA_LEN ("_cygwin_crt0_common@8") }, { STRING_COMMA_LEN ("_cygwin_noncygwin_dll_entry@12") }, { STRING_COMMA_LEN ("cygwin_attach_dll") }, -#endif +#endif { STRING_COMMA_LEN ("cygwin_premain0") }, { STRING_COMMA_LEN ("cygwin_premain1") }, { STRING_COMMA_LEN ("cygwin_premain2") }, @@ -261,7 +261,11 @@ #endif PE_ARCH_i386, bfd_arch_i386, +#ifdef pe_use_x86_64 + FALSE, +#else TRUE, +#endif autofilter_symbollist_i386 }, { @@ -416,9 +420,11 @@ int u = pe_leading_underscore; /* Underscoring mode. -1 for use default. */ if (u == -1) bfd_get_target_info (target, NULL, NULL, &u, NULL); - if (u != -1) - pe_detail_list[i].underscored = (u != 0 ? TRUE : FALSE); + if (u == -1) + abort (); + pe_detail_list[i].underscored = (u != 0 ? TRUE : FALSE); pe_details = pe_detail_list + i; + pe_leading_underscore = (u != 0 ? 1 : 0); return; } einfo (_("%XUnsupported PEI architecture: %s\n"), target); @@ -573,7 +579,7 @@ that begin with '__'; this was tried and it is too restrictive. Instead we have a target specific list to use: */ - afptr = pe_details->autofilter_symbollist; + afptr = pe_details->autofilter_symbollist; while (afptr->name) { @@ -1365,7 +1371,7 @@ bfd_vma sym_vma; struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr; - /* Don't create relocs for undefined weak symbols. */ + /* Don't create relocs for undefined weak symbols. */ if (sym->flags == BSF_WEAK) { struct bfd_link_hash_entry *blhe @@ -2422,7 +2428,7 @@ quick_symbol (abfd, "__nm_thnk_", name, "", UNDSEC, BSF_GLOBAL, 0); quick_symbol (abfd, U (""), symname, "_iname", UNDSEC, BSF_GLOBAL, 0); - /* For relocator v2 we have to use the .idata$5 element and not + /* For relocator v2 we have to use the .idata$5 element and not fixup_name. */ if (link_info.pei386_runtime_pseudo_reloc == 2) quick_symbol (abfd, "__imp_", name, "", UNDSEC, BSF_GLOBAL, 0);