#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};
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,
{"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. */
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}
};
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"));
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
}
/* 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;
}
}
{
const char *entry;
const char *initial_symbol_char;
- int i;
+ int i, u = -1;
static const struct
{
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;
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);
{
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;
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;
}
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;
}
{
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)
char *dollar = NULL;
lang_output_section_statement_type *os;
lang_statement_list_type add_child;
+ lang_output_section_statement_type *match_by_name = NULL;
lang_statement_union_type **pl;
/* Look through the script to see where to place this section. */
lang_add_section (&add_child, s, os);
break;
}
+
+ /* Save unused output sections in case we can match them
+ against orphans later. */
+ if (os->bfd_section == NULL)
+ match_by_name = os;
}
+ /* If we didn't match an active output section, see if we matched an
+ unused one and use that. */
+ if (os == NULL && match_by_name)
+ {
+ lang_add_section (&match_by_name->children, s, match_by_name);
+ return match_by_name;
+ }
+
if (os == NULL)
{
static struct orphan_save hold[] =