From 522f09cd4c88911ec7e2c6a8a9a8375af605be21 Mon Sep 17 00:00:00 2001 From: Kai Tietz Date: Mon, 5 Apr 2010 09:04:09 +0000 Subject: [PATCH] 2010-04-05 Kai Tietz * emultempl/pep.em (U): Macro modified. (U_SIZE): New helper macro. (GET_INIT_SYMBOL_NAME): Likewise. (enum options): Add OPTION_NO_LEADING_UNDERSCORE and OPTION_LEADING_UNDERSCORE enumerator-values. (gld${EMULATION_NAME}_add_options): Add --(no-)leading-underscore option. (definfo): Add new member is_c_symbol. (D): Add to macro underscore mode parameter. (init): Add definition for is_c_symbol. (gld_${EMULATION_NAME}_list_options): Display new options. (set_pep_name): Adjust underscoring dependent fixed symbol handling. (gld_${EMULATION_NAME}_set_symbols): Likewise. (saw_option): Likewise. (gld_${EMULATION_NAME}_unrecognized_file): Likewise. (set_entry_point): Initial initial_symbol_char dependent to target's default and new option flag pep_leading_underscore. * emultempl/pe.em (U): Macro modified. (U_SIZE): New helper macro. (GET_INIT_SYMBOL_NAME): Likewise. (OPTION_LEADING_UNDERSCORE): Add new option define. (OPTION_NO_LEADING_UNDERSCORE): Likewise. (gld${EMULATION_NAME}_add_options): Add --(no-)leading-underscore option. (definfo): Add new member is_c_symbol. (D): Add to macro underscore mode parameter. (init): Add definition for is_c_symbol. (gld_${EMULATION_NAME}_list_options): Display new options. (set_pep_name): Adjust underscoring dependent fixed symbol handling. (gld_${EMULATION_NAME}_set_symbols): Likewise. (saw_option): Likewise. (gld_${EMULATION_NAME}_unrecognized_file): Likewise. (set_entry_point): Initial initial_symbol_char dependent to target's default and new option flag pep_leading_underscore. * pe-dll.c (pe_leading_underscore): New flag variable. (pe_detail_list): Remove const to allow modify of member underscore. (pe_dll_id_target): Initialize pe_details' underscore variable dependent to target's default and flag pe_leading_underscore. * pe-dll.h (pe_leading_underscore): Add extern declaration of option flag. * pep-dll.c (pe_leading_underscore): Add alias define for pep_leading_underscore. * pep-dll.h (pep_leading_underscore) Add extern declaration of option flag. * ld.texinfo: Add documentation for --(no-)leading-underscore option. --- ld/ChangeLog | 52 ++++++++++++++++++++ ld/emultempl/pe.em | 113 +++++++++++++++++++++++++++++++------------- ld/emultempl/pep.em | 104 +++++++++++++++++++++++++++------------- ld/ld.texinfo | 8 ++++ ld/pe-dll.c | 10 +++- ld/pe-dll.h | 1 + ld/pep-dll.c | 1 + ld/pep-dll.h | 1 + 8 files changed, 223 insertions(+), 67 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index a604b218cf..1d8c9f61ec 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,55 @@ +2010-04-05 Kai Tietz + + * emultempl/pep.em (U): Macro modified. + (U_SIZE): New helper macro. + (GET_INIT_SYMBOL_NAME): Likewise. + (enum options): Add OPTION_NO_LEADING_UNDERSCORE + and OPTION_LEADING_UNDERSCORE enumerator-values. + (gld${EMULATION_NAME}_add_options): Add --(no-)leading-underscore + option. + (definfo): Add new member is_c_symbol. + (D): Add to macro underscore mode parameter. + (init): Add definition for is_c_symbol. + (gld_${EMULATION_NAME}_list_options): Display new options. + (set_pep_name): Adjust underscoring dependent fixed + symbol handling. + (gld_${EMULATION_NAME}_set_symbols): Likewise. + (saw_option): Likewise. + (gld_${EMULATION_NAME}_unrecognized_file): Likewise. + (set_entry_point): Initial initial_symbol_char dependent to + target's default and new option flag pep_leading_underscore. + * emultempl/pe.em (U): Macro modified. + (U_SIZE): New helper macro. + (GET_INIT_SYMBOL_NAME): Likewise. + (OPTION_LEADING_UNDERSCORE): Add new option define. + (OPTION_NO_LEADING_UNDERSCORE): Likewise. + (gld${EMULATION_NAME}_add_options): Add --(no-)leading-underscore + option. + (definfo): Add new member is_c_symbol. + (D): Add to macro underscore mode parameter. + (init): Add definition for is_c_symbol. + (gld_${EMULATION_NAME}_list_options): Display new options. + (set_pep_name): Adjust underscoring dependent fixed + symbol handling. + (gld_${EMULATION_NAME}_set_symbols): Likewise. + (saw_option): Likewise. + (gld_${EMULATION_NAME}_unrecognized_file): Likewise. + (set_entry_point): Initial initial_symbol_char dependent to + target's default and new option flag pep_leading_underscore. + * pe-dll.c (pe_leading_underscore): New flag variable. + (pe_detail_list): Remove const to allow modify of + member underscore. + (pe_dll_id_target): Initialize pe_details' underscore variable + dependent to target's default and flag pe_leading_underscore. + * pe-dll.h (pe_leading_underscore): Add extern declaration of + option flag. + * pep-dll.c (pe_leading_underscore): Add alias define for + pep_leading_underscore. + * pep-dll.h (pep_leading_underscore) Add extern declaration of + option flag. + * ld.texinfo: Add documentation for --(no-)leading-underscore + option. + 2010-03-26 Alan Modra PR ld/11426 diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index 79b30d3299..ec893b9e5e 100644 --- a/ld/emultempl/pe.em +++ b/ld/emultempl/pe.em @@ -123,8 +123,6 @@ fragment < Set size of the initial stack\n")); fprintf (file, _(" --subsystem [:] 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, _(" --thumb-entry= Set the entry point to be Thumb \n")); #ifdef DLL_SUPPORT fprintf (file, _(" --add-stdcall-alias Export symbols with and without @nn\n")); @@ -432,7 +456,7 @@ gld_${EMULATION_NAME}_list_options (FILE *file) 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, _(" --tsaware Image is Terminal Server aware\n")); } @@ -444,7 +468,7 @@ set_pe_name (char *name, long val) /* Find the name and set it. */ for (i = 0; init[i].ptr; i++) { - if (strcmp (name, init[i].symbol) == 0) + if (strcmp (name, GET_INIT_SYMBOL_NAME (i)) == 0) { init[i].value = val; init[i].inited = 1; @@ -461,7 +485,7 @@ set_entry_point (void) { const char *entry; const char *initial_symbol_char; - int i; + int i, u = -1; static const struct { @@ -504,7 +528,19 @@ set_entry_point (void) entry = default_entry; } - initial_symbol_char = ${INITIAL_SYMBOL_CHAR}; + /* 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 == 0) + initial_symbol_char = ""; + else if (u != -1) + initial_symbol_char = "_"; + else + abort (); + pe_leading_underscore = u; + if (*initial_symbol_char != '\0') { char *alc_entry; @@ -694,6 +730,12 @@ gld${EMULATION_NAME}_handle_option (int optc) case OPTION_USE_NUL_PREFIXED_IMPORT_TABLES: pe_use_nul_prefixed_import_tables = TRUE; break; + case OPTION_NO_LEADING_UNDERSCORE: + pe_leading_underscore = 0; + break; + case OPTION_LEADING_UNDERSCORE: + pe_leading_underscore = 1; + break; #ifdef DLL_SUPPORT case OPTION_OUT_DEF: pe_out_def_filename = xstrdup (optarg); @@ -886,7 +928,8 @@ gld_${EMULATION_NAME}_set_symbols (void) { long val = init[j].value; lang_assignment_statement_type *rv; - rv = lang_add_assignment (exp_assop ('=', init[j].symbol, + + rv = lang_add_assignment (exp_assop ('=', GET_INIT_SYMBOL_NAME (j), exp_intop (val))); if (init[j].size == sizeof (short)) *(short *) init[j].ptr = val; @@ -1110,14 +1153,15 @@ This should work unless it involves constant data structures referencing symbols for (i = 0; i < nsyms; i++) { - if (! CONST_STRNEQ (symbols[i]->name, U ("_head_"))) + 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 + - sizeof (U ("_head_")) - 1); + pe_data_import_dll = (char *) (symbols[i]->name + + U_SIZE ("_head_") - 1); break; } @@ -1598,7 +1642,7 @@ saw_option (char *option) int i; for (i = 0; init[i].ptr; i++) - if (strcmp (init[i].symbol, option) == 0) + if (strcmp (GET_INIT_SYMBOL_NAME (i), option) == 0) return init[i].inited; return 0; } @@ -1632,7 +1676,8 @@ gld_${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry ATTRIB { struct bfd_link_hash_entry *h; - sprintf (buf, "%s%s", U (""), pe_def_file->exports[i].internal_name); + sprintf (buf, "%s%s", U (""), + pe_def_file->exports[i].internal_name); h = bfd_link_hash_lookup (link_info.hash, buf, TRUE, TRUE, TRUE); if (h == (struct bfd_link_hash_entry *) NULL) diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em index bcc959e95d..a315fd6343 100644 --- a/ld/emultempl/pep.em +++ b/ld/emultempl/pep.em @@ -97,8 +97,6 @@ fragment < Set size of the initial stack\n")); fprintf (file, _(" --subsystem [:] 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")); #ifdef DLL_SUPPORT fprintf (file, _(" --add-stdcall-alias Export symbols with and without @nn\n")); fprintf (file, _(" --disable-stdcall-fixup Don't link _sym to _sym@nn\n")); @@ -372,7 +392,7 @@ gld_${EMULATION_NAME}_list_options (FILE *file) 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, _(" --tsaware Image is Terminal Server aware\n")); #endif } @@ -385,12 +405,12 @@ set_pep_name (char *name, bfd_vma val) /* Find the name and set it. */ for (i = 0; init[i].ptr; i++) { - if (strcmp (name, init[i].symbol) == 0) + if (strcmp (name, GET_INIT_SYMBOL_NAME (i)) == 0) { init[i].value = val; init[i].inited = 1; if (strcmp (name,"__image_base__") == 0) - set_pep_name ("___ImageBase", val); + set_pep_name (U ("__ImageBase"), val); return; } } @@ -402,7 +422,7 @@ set_entry_point (void) { const char *entry; const char *initial_symbol_char; - int i; + int i, u = -1; static const struct { @@ -440,7 +460,19 @@ set_entry_point (void) entry = default_entry; } - initial_symbol_char = ${INITIAL_SYMBOL_CHAR}; + /* 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 == 0) + initial_symbol_char = ""; + else if (u != -1) + initial_symbol_char = "_"; + else + abort (); + pep_leading_underscore = u; + if (*initial_symbol_char != '\0') { char *alc_entry; @@ -627,6 +659,12 @@ gld${EMULATION_NAME}_handle_option (int optc) case OPTION_USE_NUL_PREFIXED_IMPORT_TABLES: pep_use_nul_prefixed_import_tables = TRUE; break; + case OPTION_NO_LEADING_UNDERSCORE: + pep_leading_underscore = 0; + break; + case OPTION_LEADING_UNDERSCORE: + pep_leading_underscore = 1; + break; #ifdef DLL_SUPPORT case OPTION_OUT_DEF: pep_out_def_filename = xstrdup (optarg); @@ -815,7 +853,8 @@ gld_${EMULATION_NAME}_set_symbols (void) { bfd_vma val = init[j].value; lang_assignment_statement_type *rv; - rv = lang_add_assignment (exp_assop ('=', init[j].symbol, + + rv = lang_add_assignment (exp_assop ('=', GET_INIT_SYMBOL_NAME (j), exp_intop (val))); if (init[j].size == sizeof (short)) *(short *) init[j].ptr = (short) val; @@ -1076,14 +1115,14 @@ This should work unless it involves constant data structures referencing symbols for (i = 0; i < nsyms; i++) { - if (! CONST_STRNEQ (symbols[i]->name, "__head_")) + 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 + - sizeof ("__head_") - 1); + U_SIZE ("_head_") - 1); break; } @@ -1431,7 +1470,7 @@ saw_option (char *option) int i; for (i = 0; init[i].ptr; i++) - if (strcmp (init[i].symbol, option) == 0) + if (strcmp (GET_INIT_SYMBOL_NAME (i), option) == 0) return init[i].inited; return 0; } @@ -1465,7 +1504,8 @@ gld_${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry ATTRIB { struct bfd_link_hash_entry *h; - sprintf (buf, "_%s", pep_def_file->exports[i].internal_name); + sprintf (buf, "%s%s", U (""), + pep_def_file->exports[i].internal_name); h = bfd_link_hash_lookup (link_info.hash, buf, TRUE, TRUE, TRUE); if (h == (struct bfd_link_hash_entry *) NULL) diff --git a/ld/ld.texinfo b/ld/ld.texinfo index 130e06d42b..6bcc6ff634 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -2218,6 +2218,14 @@ feature is fully enabled and warnings are not printed. If you specify mismatches are considered to be errors. [This option is specific to the i386 PE targeted port of the linker] +@kindex --leading-underscore +@kindex --no-leading-underscore +@item --leading-underscore +@itemx --no-leading-underscore +For most targets default symbol-prefix is an underscore and is defined +in target's description. By this option it is possible to +disable/enable the default underscore symbol-prefix. + @cindex DLLs, creating @kindex --export-all-symbols @item --export-all-symbols diff --git a/ld/pe-dll.c b/ld/pe-dll.c index ad5f82a4f0..21717fc5ce 100644 --- a/ld/pe-dll.c +++ b/ld/pe-dll.c @@ -158,6 +158,7 @@ int pe_dll_compat_implib = 0; int pe_dll_extra_pe_debug = 0; int pe_use_nul_prefixed_import_tables = 0; int pe_use_coff_long_section_names = -1; +int pe_leading_underscore = -1; /* Static variables and types. */ @@ -244,7 +245,9 @@ static const autofilter_entry_type autofilter_symbollist_i386[] = #define PE_ARCH_arm_epoc 5 #define PE_ARCH_arm_wince 6 -static const pe_details_type pe_detail_list[] = +/* Don't make it constant as underscore mode gets possibly overriden + by target or -(no-)leading-underscore option. */ +static pe_details_type pe_detail_list[] = { { #ifdef pe_use_x86_64 @@ -410,6 +413,11 @@ pe_dll_id_target (const char *target) if (strcmp (pe_detail_list[i].target_name, target) == 0 || strcmp (pe_detail_list[i].object_target, target) == 0) { + 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); pe_details = pe_detail_list + i; return; } diff --git a/ld/pe-dll.h b/ld/pe-dll.h index a5ae9fb508..469739081e 100644 --- a/ld/pe-dll.h +++ b/ld/pe-dll.h @@ -38,6 +38,7 @@ extern int pe_dll_compat_implib; extern int pe_dll_extra_pe_debug; extern int pe_use_nul_prefixed_import_tables; extern int pe_use_coff_long_section_names; +extern int pe_leading_underscore; typedef enum { EXCLUDESYMS, EXCLUDELIBS, EXCLUDEFORIMPLIB } exclude_type; diff --git a/ld/pep-dll.c b/ld/pep-dll.c index 3d8882dcb4..0e5e8b1523 100644 --- a/ld/pep-dll.c +++ b/ld/pep-dll.c @@ -38,6 +38,7 @@ pep_use_nul_prefixed_import_tables #define pe_use_coff_long_section_names \ pep_use_coff_long_section_names +#define pe_leading_underscore pep_leading_underscore /* External globals. */ #define pe_data_import_dll pep_data_import_dll diff --git a/ld/pep-dll.h b/ld/pep-dll.h index 7d441ea22a..1e7e3d65d4 100644 --- a/ld/pep-dll.h +++ b/ld/pep-dll.h @@ -38,6 +38,7 @@ extern int pep_dll_compat_implib; extern int pep_dll_extra_pe_debug; extern int pep_use_nul_prefixed_import_tables; extern int pep_use_coff_long_section_names; +extern int pep_leading_underscore; typedef enum { EXCLUDESYMS, EXCLUDELIBS, EXCLUDEFORIMPLIB } exclude_type; -- 2.34.1