extern const char *output_filename;
+static int is_underscoring (void)
+{
+ 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 != 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
config.dynamic_link = TRUE;
config.has_shared = 1;
- link_info.pei386_auto_import = -1;
+ link_info.pei386_auto_import = 1;
link_info.pei386_runtime_pseudo_reloc = 2; /* Use by default version 2. */
#endif
}
OPTION_EXCLUDE_LIBS,
OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC,
OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC,
- OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V1,
OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2,
OPTION_EXCLUDE_MODULES_FOR_IMPLIB,
OPTION_USE_NUL_PREFIXED_IMPORT_TABLES,
{"enable-extra-pep-debug", no_argument, NULL, OPTION_ENABLE_EXTRA_PE_DEBUG},
{"enable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC},
{"disable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC},
- {"enable-runtime-pseudo-reloc-v1", no_argument, NULL, OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V1},
{"enable-runtime-pseudo-reloc-v2", no_argument, NULL, OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2},
#endif
{"enable-long-section-names", no_argument, NULL, OPTION_ENABLE_LONG_SECTION_NAMES},
#define GET_INIT_SYMBOL_NAME(IDX) \
(init[(IDX)].symbol \
- + ((init[(IDX)].is_c_symbol == FALSE || pep_leading_underscore != 0) ? 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 == 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) + pep_leading_underscore == 0 ? 0 : 1)
+ (sizeof (CSTR) + (is_underscoring () == 0 ? 0 : 1))
#define D(field,symbol,def,usc) {&pep.field,sizeof(pep.field), def, symbol,0, usc}
set_pep_name (char *name, bfd_vma val)
{
int i;
-
+ is_underscoring ();
/* Find the name and set it. */
for (i = 0; init[i].ptr; i++)
{
{
const char *entry;
const char *initial_symbol_char;
- int i, u = -1;
+ int i;
static const struct
{
}
/* 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;
+ initial_symbol_char = (is_underscoring () != 0 ? "_" : "");
if (*initial_symbol_char != '\0')
{
static bfd_boolean
gld${EMULATION_NAME}_handle_option (int optc)
{
+ is_underscoring ();
switch (optc)
{
default:
case OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC:
link_info.pei386_runtime_pseudo_reloc = 0;
break;
- case OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V1:
- link_info.pei386_runtime_pseudo_reloc = 1;
- break;
case OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2:
link_info.pei386_runtime_pseudo_reloc = 2;
break;
names and insert the defaults. */
int j;
+ is_underscoring ();
+
if (!init[IMAGEBASEOFF].inited)
{
if (link_info.relocatable)
asymbol **symbols;
int nsyms, i;
- if (link_info.pei386_auto_import == -1)
- {
- static bfd_boolean warned = FALSE;
-
- info_msg (_("Info: resolving %s by linking to %s (auto-import)\n"),
- undef->root.string, buf);
-
- /* PR linker/4844. */
- if (! warned)
- {
- warned = TRUE;
- einfo (_("%P: warning: auto-importing has been activated without --enable-auto-import specified on the command line.\n\
-This should work unless it involves constant data structures referencing symbols from auto-imported DLLs.\n"));
- }
- }
-
if (!bfd_generic_link_read_symbols (b))
{
einfo (_("%B%F: could not read symbols: %E\n"), b);
static void
gld_${EMULATION_NAME}_after_open (void)
{
+ is_underscoring ();
#ifdef DLL_SUPPORT
if (pep_dll_extra_pe_debug)
{
static void
gld_${EMULATION_NAME}_before_allocation (void)
{
+ is_underscoring ();
before_allocation_default ();
}
\f
{
int i;
+ is_underscoring ();
+
for (i = 0; init[i].ptr; i++)
if (strcmp (GET_INIT_SYMBOL_NAME (i), option) == 0)
return init[i].inited;
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");
static void
gld_${EMULATION_NAME}_finish (void)
{
+ is_underscoring ();
finish_default ();
#ifdef DLL_SUPPORT
{ ".text",
SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
0, 0, 0, 0 },
+ { ".idata",
+ SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
+ 0, 0, 0, 0 },
{ ".rdata",
SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
0, 0, 0, 0 },
enum orphan_save_index
{
orphan_text = 0,
+ orphan_idata,
orphan_rodata,
orphan_data,
orphan_bss
else if ((s->flags & SEC_READONLY) == 0)
place = &hold[orphan_data];
else if ((s->flags & SEC_CODE) == 0)
- place = &hold[orphan_rodata];
+ {
+ place = (!strncmp (secname, ".idata\$", 7) ? &hold[orphan_idata]
+ : &hold[orphan_rodata]);
+ }
else
place = &hold[orphan_text];
echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
if test -n "$GENERATE_AUTO_IMPORT_SCRIPT" ; then
-echo ' ; else if (link_info.pei386_auto_import == 1) return' >> e${EMULATION_NAME}.c
+echo ' ; else if (link_info.pei386_auto_import == 1 && link_info.pei386_runtime_pseudo_reloc != 2) return' >> e${EMULATION_NAME}.c
sed $sc ldscripts/${EMULATION_NAME}.xa >> e${EMULATION_NAME}.c
fi
echo ' ; else return' >> e${EMULATION_NAME}.c