From 522f09cd4c88911ec7e2c6a8a9a8375af605be21 Mon Sep 17 00:00:00 2001 From: Kai Tietz Date: Mon, 5 Apr 2010 09:04:09 +0000 Subject: 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/emultempl/pe.em | 113 ++++++++++++++++++++++++++++++++++++---------------- ld/emultempl/pep.em | 104 ++++++++++++++++++++++++++++++++--------------- 2 files changed, 151 insertions(+), 66 deletions(-) (limited to 'ld/emultempl') 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) -- cgit v1.2.1