diff options
author | Kai Tietz <kai.tietz@onevision.com> | 2010-04-05 09:04:09 +0000 |
---|---|---|
committer | Kai Tietz <kai.tietz@onevision.com> | 2010-04-05 09:04:09 +0000 |
commit | 522f09cd4c88911ec7e2c6a8a9a8375af605be21 (patch) | |
tree | 3d22514cfaf059979802a2c0ddba4162025be6ba | |
parent | c51297b4700487f73272548c4a775d71e2ab7d2e (diff) | |
download | gdb-522f09cd4c88911ec7e2c6a8a9a8375af605be21.zip gdb-522f09cd4c88911ec7e2c6a8a9a8375af605be21.tar.gz gdb-522f09cd4c88911ec7e2c6a8a9a8375af605be21.tar.bz2 |
2010-04-05 Kai Tietz <kai.tietz@onevision.com>
* 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.
-rw-r--r-- | ld/ChangeLog | 52 | ||||
-rw-r--r-- | ld/emultempl/pe.em | 113 | ||||
-rw-r--r-- | ld/emultempl/pep.em | 104 | ||||
-rw-r--r-- | ld/ld.texinfo | 8 | ||||
-rw-r--r-- | ld/pe-dll.c | 10 | ||||
-rw-r--r-- | ld/pe-dll.h | 1 | ||||
-rw-r--r-- | ld/pep-dll.c | 1 | ||||
-rw-r--r-- | ld/pep-dll.h | 1 |
8 files changed, 223 insertions, 67 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index a604b21..1d8c9f6 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,55 @@ +2010-04-05 Kai Tietz <kai.tietz@onevision.com> + + * 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 <amodra@gmail.com> PR ld/11426 diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index 79b30d3..ec893b9 100644 --- a/ld/emultempl/pe.em +++ b/ld/emultempl/pe.em @@ -123,8 +123,6 @@ fragment <<EOF #define PE_DEF_FILE_ALIGNMENT 0x00000200 #endif -#define U(S) ${INITIAL_SYMBOL_CHAR} S - static struct internal_extra_pe_aouthdr pe; static int dll; static int pe_subsystem = ${SUBSYSTEM}; @@ -224,8 +222,12 @@ fragment <<EOF (OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2 + 1) #define OPTION_USE_NUL_PREFIXED_IMPORT_TABLES \ (OPTION_EXCLUDE_MODULES_FOR_IMPLIB + 1) -#define OPTION_ENABLE_LONG_SECTION_NAMES \ +#define OPTION_NO_LEADING_UNDERSCORE \ (OPTION_USE_NUL_PREFIXED_IMPORT_TABLES + 1) +#define OPTION_LEADING_UNDERSCORE \ + (OPTION_NO_LEADING_UNDERSCORE + 1) +#define OPTION_ENABLE_LONG_SECTION_NAMES \ + (OPTION_LEADING_UNDERSCORE + 1) #define OPTION_DISABLE_LONG_SECTION_NAMES \ (OPTION_ENABLE_LONG_SECTION_NAMES + 1) /* DLLCharacteristics flags */ @@ -267,6 +269,8 @@ gld${EMULATION_NAME}_add_options {"thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY}, {"use-nul-prefixed-import-tables", no_argument, NULL, OPTION_USE_NUL_PREFIXED_IMPORT_TABLES}, + {"no-leading-underscore", no_argument, NULL, OPTION_NO_LEADING_UNDERSCORE}, + {"leading-underscore", no_argument, NULL, OPTION_LEADING_UNDERSCORE}, #ifdef DLL_SUPPORT /* getopt allows abbreviations, so we do this to stop it from treating -o as an abbreviation for this option. */ @@ -328,39 +332,58 @@ typedef struct int value; char *symbol; int inited; + /* FALSE for an assembly level symbol and TRUE for a C visible symbol. + C visible symbols can be prefixed by underscore dependent to target's + settings. */ + bfd_boolean is_c_symbol; } definfo; -#define D(field,symbol,def) {&pe.field,sizeof(pe.field), def, symbol,0} +/* Get symbol name dependent to kind and C visible state of + underscore. */ +#define GET_INIT_SYMBOL_NAME(IDX) \ + (init[(IDX)].symbol \ + + ((init[(IDX)].is_c_symbol == FALSE || pe_leading_underscore != 0) ? 0 : 1)) + +/* Decorates the C visible symbol by underscore, if target requires. */ +#define U(CSTR) \ + (pe_leading_underscore == 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) + +#define D(field,symbol,def,usc) {&pe.field,sizeof(pe.field), def, symbol, 0, usc} static definfo init[] = { /* imagebase must be first */ #define IMAGEBASEOFF 0 - D(ImageBase,"__image_base__", NT_EXE_IMAGE_BASE), + D(ImageBase,"__image_base__", NT_EXE_IMAGE_BASE, FALSE), #define DLLOFF 1 - {&dll, sizeof(dll), 0, "__dll__", 0}, + {&dll, sizeof(dll), 0, "__dll__", 0, FALSE}, #define MSIMAGEBASEOFF 2 - D(ImageBase, U ("__ImageBase"), NT_EXE_IMAGE_BASE), - D(SectionAlignment,"__section_alignment__", PE_DEF_SECTION_ALIGNMENT), - D(FileAlignment,"__file_alignment__", PE_DEF_FILE_ALIGNMENT), - D(MajorOperatingSystemVersion,"__major_os_version__", 4), - D(MinorOperatingSystemVersion,"__minor_os_version__", 0), - D(MajorImageVersion,"__major_image_version__", 1), - D(MinorImageVersion,"__minor_image_version__", 0), + D(ImageBase, "___ImageBase", NT_EXE_IMAGE_BASE, TRUE), + D(SectionAlignment,"__section_alignment__", PE_DEF_SECTION_ALIGNMENT, FALSE), + D(FileAlignment,"__file_alignment__", PE_DEF_FILE_ALIGNMENT, FALSE), + D(MajorOperatingSystemVersion,"__major_os_version__", 4, FALSE), + D(MinorOperatingSystemVersion,"__minor_os_version__", 0, FALSE), + D(MajorImageVersion,"__major_image_version__", 1, FALSE), + D(MinorImageVersion,"__minor_image_version__", 0, FALSE), #if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_wince_pe) - D(MajorSubsystemVersion,"__major_subsystem_version__", 3), + D(MajorSubsystemVersion,"__major_subsystem_version__", 3, FALSE), #else - D(MajorSubsystemVersion,"__major_subsystem_version__", 4), + D(MajorSubsystemVersion,"__major_subsystem_version__", 4, FALSE), #endif - D(MinorSubsystemVersion,"__minor_subsystem_version__", 0), - D(Subsystem,"__subsystem__", ${SUBSYSTEM}), - D(SizeOfStackReserve,"__size_of_stack_reserve__", 0x200000), - D(SizeOfStackCommit,"__size_of_stack_commit__", 0x1000), - D(SizeOfHeapReserve,"__size_of_heap_reserve__", 0x100000), - D(SizeOfHeapCommit,"__size_of_heap_commit__", 0x1000), - D(LoaderFlags,"__loader_flags__", 0x0), - D(DllCharacteristics, "__dll_characteristics__", 0x0), - { NULL, 0, 0, NULL, 0 } + D(MinorSubsystemVersion,"__minor_subsystem_version__", 0, FALSE), + D(Subsystem,"__subsystem__", ${SUBSYSTEM}, FALSE), + D(SizeOfStackReserve,"__size_of_stack_reserve__", 0x200000, FALSE), + D(SizeOfStackCommit,"__size_of_stack_commit__", 0x1000, FALSE), + D(SizeOfHeapReserve,"__size_of_heap_reserve__", 0x100000, FALSE), + D(SizeOfHeapCommit,"__size_of_heap_commit__", 0x1000, FALSE), + D(LoaderFlags,"__loader_flags__", 0x0, FALSE), + D(DllCharacteristics, "__dll_characteristics__", 0x0, FALSE), + { NULL, 0, 0, NULL, 0 , FALSE} }; @@ -382,6 +405,7 @@ gld_${EMULATION_NAME}_list_options (FILE *file) fprintf (file, _(" --stack <size> Set size of the initial stack\n")); fprintf (file, _(" --subsystem <name>[:<version>] 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=<symbol> Set the entry point to be Thumb <symbol>\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 bcc959e..a315fd6 100644 --- a/ld/emultempl/pep.em +++ b/ld/emultempl/pep.em @@ -97,8 +97,6 @@ fragment <<EOF #define PE_DEF_SECTION_ALIGNMENT 0x00000400 #endif -#define U(S) ${INITIAL_SYMBOL_CHAR} S - static struct internal_extra_pe_aouthdr pep; static int dll; static int pep_subsystem = ${SUBSYSTEM}; @@ -175,6 +173,8 @@ enum options OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2, OPTION_EXCLUDE_MODULES_FOR_IMPLIB, OPTION_USE_NUL_PREFIXED_IMPORT_TABLES, + OPTION_NO_LEADING_UNDERSCORE, + OPTION_LEADING_UNDERSCORE, OPTION_ENABLE_LONG_SECTION_NAMES, OPTION_DISABLE_LONG_SECTION_NAMES, OPTION_DYNAMIC_BASE, @@ -216,6 +216,8 @@ gld${EMULATION_NAME}_add_options {"support-old-code", no_argument, NULL, OPTION_SUPPORT_OLD_CODE}, {"use-nul-prefixed-import-tables", no_argument, NULL, OPTION_USE_NUL_PREFIXED_IMPORT_TABLES}, + {"no-leading-underscore", no_argument, NULL, OPTION_NO_LEADING_UNDERSCORE}, + {"leading-underscore", no_argument, NULL, OPTION_LEADING_UNDERSCORE}, #ifdef DLL_SUPPORT /* getopt allows abbreviations, so we do this to stop it from treating -o as an abbreviation for this option. */ @@ -276,35 +278,52 @@ typedef struct bfd_vma value; char *symbol; int inited; + /* FALSE for an assembly level symbol and TRUE for a C visible symbol. + C visible symbols can be prefixed by underscore dependent on target's + settings. */ + bfd_boolean is_c_symbol; } definfo; -#define D(field,symbol,def) {&pep.field,sizeof(pep.field), def, symbol,0} +#define GET_INIT_SYMBOL_NAME(IDX) \ + (init[(IDX)].symbol \ + + ((init[(IDX)].is_c_symbol == FALSE || pep_leading_underscore != 0) ? 0 : 1)) + +/* Decorates the C visible symbol by underscore, if target requires. */ +#define U(CSTR) \ + (pep_leading_underscore == 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 == 0 ? 0 : 1) + +#define D(field,symbol,def,usc) {&pep.field,sizeof(pep.field), def, symbol,0, usc} static definfo init[] = { /* imagebase must be first */ #define IMAGEBASEOFF 0 - D(ImageBase,"__image_base__", NT_EXE_IMAGE_BASE), + D(ImageBase,"__image_base__", NT_EXE_IMAGE_BASE, FALSE), #define DLLOFF 1 - {&dll, sizeof(dll), 0, "__dll__", 0}, + {&dll, sizeof(dll), 0, "__dll__", 0, FALSE}, #define MSIMAGEBASEOFF 2 - D(ImageBase, U("__ImageBase"), NT_EXE_IMAGE_BASE), - D(SectionAlignment,"__section_alignment__", PE_DEF_SECTION_ALIGNMENT), - D(FileAlignment,"__file_alignment__", PE_DEF_FILE_ALIGNMENT), - D(MajorOperatingSystemVersion,"__major_os_version__", 4), - D(MinorOperatingSystemVersion,"__minor_os_version__", 0), - D(MajorImageVersion,"__major_image_version__", 0), - D(MinorImageVersion,"__minor_image_version__", 0), - D(MajorSubsystemVersion,"__major_subsystem_version__", 5), - D(MinorSubsystemVersion,"__minor_subsystem_version__", 2), - D(Subsystem,"__subsystem__", ${SUBSYSTEM}), - D(SizeOfStackReserve,"__size_of_stack_reserve__", 0x200000), - D(SizeOfStackCommit,"__size_of_stack_commit__", 0x1000), - D(SizeOfHeapReserve,"__size_of_heap_reserve__", 0x100000), - D(SizeOfHeapCommit,"__size_of_heap_commit__", 0x1000), - D(LoaderFlags,"__loader_flags__", 0x0), - D(DllCharacteristics, "__dll_characteristics__", 0x0), - { NULL, 0, 0, NULL, 0 } + D(ImageBase, "___ImageBase", NT_EXE_IMAGE_BASE, TRUE), + D(SectionAlignment,"__section_alignment__", PE_DEF_SECTION_ALIGNMENT, FALSE), + D(FileAlignment,"__file_alignment__", PE_DEF_FILE_ALIGNMENT, FALSE), + D(MajorOperatingSystemVersion,"__major_os_version__", 4, FALSE), + D(MinorOperatingSystemVersion,"__minor_os_version__", 0, FALSE), + D(MajorImageVersion,"__major_image_version__", 0, FALSE), + D(MinorImageVersion,"__minor_image_version__", 0, FALSE), + D(MajorSubsystemVersion,"__major_subsystem_version__", 5, FALSE), + D(MinorSubsystemVersion,"__minor_subsystem_version__", 2, FALSE), + D(Subsystem,"__subsystem__", ${SUBSYSTEM}, FALSE), + D(SizeOfStackReserve,"__size_of_stack_reserve__", 0x200000, FALSE), + D(SizeOfStackCommit,"__size_of_stack_commit__", 0x1000, FALSE), + D(SizeOfHeapReserve,"__size_of_heap_reserve__", 0x100000, FALSE), + D(SizeOfHeapCommit,"__size_of_heap_commit__", 0x1000, FALSE), + D(LoaderFlags,"__loader_flags__", 0x0, FALSE), + D(DllCharacteristics, "__dll_characteristics__", 0x0, FALSE), + { NULL, 0, 0, NULL, 0, FALSE} }; @@ -326,6 +345,7 @@ gld_${EMULATION_NAME}_list_options (FILE *file) fprintf (file, _(" --stack <size> Set size of the initial stack\n")); fprintf (file, _(" --subsystem <name>[:<version>] 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 130e06d..6bcc6ff 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 ad5f82a..21717fc 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 a5ae9fb..4697390 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 3d8882d..0e5e8b1 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 7d441ea..1e7e3d6 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; |