rm -f e${EMULATION_NAME}.c
(echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
fragment <<EOF
-/* Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
- 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+/* Copyright 1995-2013 Free Software Foundation, Inc.
This file is part of the GNU Binutils.
#include "bfdlink.h"
#include "getopt.h"
#include "libiberty.h"
+#include "filenames.h"
#include "ld.h"
#include "ldmain.h"
#include "ldexp.h"
#if defined(TARGET_IS_i386pe) \
|| defined(TARGET_IS_shpe) \
- || defined(TARGET_IS_mipspe) \
|| defined(TARGET_IS_armpe) \
|| defined(TARGET_IS_arm_epoc_pe) \
|| defined(TARGET_IS_arm_wince_pe)
extern const char *output_filename;
-static void
-gld_${EMULATION_NAME}_before_parse (void)
+static int is_underscoring (void)
{
- int u;
- /* 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))
+ int u = 0;
+ if (pe_leading_underscore != -1)
+ return pe_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 ();
- pe_leading_underscore = u;
+ pe_leading_underscore = (u != 0 ? 1 : 0);
+ return pe_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;
+ input_flags.dynamic = TRUE;
config.has_shared = 1;
EOF
# Cygwin no longer wants these noisy warnings. Other PE
# targets might like to consider adding themselves here.
+# See also the mail thread starting here for the reason why
+# merge_rdata defaults to 0 for cygwin:
+# http://cygwin.com/ml/cygwin-apps/2013-04/msg00187.html
case ${target} in
*-*-cygwin*)
default_auto_import=1
+ default_merge_rdata=0
+ ;;
+ i[3-7]86-*-mingw* | x86_64-*-mingw*)
+ default_auto_import=1
+ default_merge_rdata=0
;;
*)
default_auto_import=-1
+ default_merge_rdata=1
;;
esac
#endif
}
\f
+/* Indicates if RDATA shall be merged into DATA when pseudo-relocation
+ version 2 is used and auto-import is enabled. */
+#define MERGE_RDATA_V2 ${default_merge_rdata}
+
/* PE format extra command line options. */
/* Used for setting flags in the PE header. */
#define OPTION_DYNAMIC_BASE (OPTION_DISABLE_LONG_SECTION_NAMES + 1)
#define OPTION_FORCE_INTEGRITY (OPTION_DYNAMIC_BASE + 1)
#define OPTION_NX_COMPAT (OPTION_FORCE_INTEGRITY + 1)
-#define OPTION_NO_ISOLATION (OPTION_NX_COMPAT + 1)
+#define OPTION_NO_ISOLATION (OPTION_NX_COMPAT + 1)
#define OPTION_NO_SEH (OPTION_NO_ISOLATION + 1)
#define OPTION_NO_BIND (OPTION_NO_SEH + 1)
#define OPTION_WDM_DRIVER (OPTION_NO_BIND + 1)
int nrl ATTRIBUTE_UNUSED,
struct option **really_longopts ATTRIBUTE_UNUSED)
{
- static const struct option xtra_long[] = {
- /* PE options */
+ static const struct option xtra_long[] =
+ {
+ /* PE options. */
{"base-file", required_argument, NULL, OPTION_BASE_FILE},
{"dll", no_argument, NULL, OPTION_DLL},
{"file-alignment", required_argument, NULL, OPTION_FILE_ALIGNMENT},
underscore. */
#define GET_INIT_SYMBOL_NAME(IDX) \
(init[(IDX)].symbol \
- + ((init[(IDX)].is_c_symbol == FALSE || pe_leading_underscore != 0) ? 0 : 1))
+ + ((init[(IDX)].is_c_symbol == FALSE || (is_underscoring () != 0)) ? 0 : 1))
/* Decorates the C visible symbol by underscore, if target requires. */
#define U(CSTR) \
- (pe_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) + pe_leading_underscore == 0 ? 0 : 1)
+ (sizeof (CSTR) + (is_underscoring () == 0 ? 0 : 1))
#define D(field,symbol,def,usc) {&pe.field,sizeof(pe.field), def, symbol, 0, usc}
fprintf (file, _(" --dll-search-prefix=<string> When linking dynamically to a dll without\n\
an importlib, use <string><basename>.dll\n\
in preference to lib<basename>.dll \n"));
- fprintf (file, _(" --enable-auto-import Do sophistcated linking of _sym to\n\
+ fprintf (file, _(" --enable-auto-import Do sophisticated linking of _sym to\n\
__imp_sym for DATA references\n"));
fprintf (file, _(" --disable-auto-import Do not auto-import DATA items from DLLs\n"));
fprintf (file, _(" --enable-runtime-pseudo-reloc Work around auto-import limitations by\n\
static void
set_pe_name (char *name, long val)
{
- int i, u;
-
- /* 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 == -1)
- abort ();
- pe_leading_underscore = u;
+ 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
{
entry = default_entry;
}
- /* 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 == -1)
- abort ();
- initial_symbol_char = (u == 1 ? "_" : "");
- pe_leading_underscore = u;
+ initial_symbol_char = (is_underscoring () != 0 ? "_" : "");
if (*initial_symbol_char != '\0')
{
case OPTION_BASE_FILE:
link_info.base_file = fopen (optarg, FOPEN_WB);
if (link_info.base_file == NULL)
- {
- /* xgettext:c-format */
- fprintf (stderr, _("%s: Can't open base file %s\n"),
- program_name, optarg);
- xexit (1);
- }
+ einfo (_("%F%P: cannot open base file %s\n"), optarg);
break;
/* PE options. */
{
/* Run through and invent symbols for all the
names and insert the defaults. */
- int j, u;
- /* 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);
+ int j;
- if (u == -1)
- abort ();
- pe_leading_underscore = u;
+ is_underscoring ();
if (!init[IMAGEBASEOFF].inited)
{
long val = init[j].value;
lang_assignment_statement_type *rv;
- rv = lang_add_assignment (exp_assop ('=', GET_INIT_SYMBOL_NAME (j),
- exp_intop (val)));
+ rv = lang_add_assignment (exp_assign (GET_INIT_SYMBOL_NAME (j),
+ exp_intop (val), FALSE));
if (init[j].size == sizeof (short))
*(short *) init[j].ptr = val;
else if (init[j].size == sizeof (int))
static bfd_boolean
pr_sym (struct bfd_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
{
- if (pe_dll_extra_pe_debug)
- printf ("+%s\n", h->string);
+ printf ("+%s\n", h->string);
return TRUE;
}
#endif /* DLL_SUPPORT */
-static void
+static void
debug_section_p (bfd *abfd ATTRIBUTE_UNUSED, asection *sect, void *obj)
{
int *found = (int *) obj;
static void
gld_${EMULATION_NAME}_after_open (void)
{
+ after_open_default ();
+
#ifdef DLL_SUPPORT
if (pe_dll_extra_pe_debug)
{
? bfd_get_filename (blhe->u.def.section->owner->my_archive)
: bfd_get_filename (blhe->u.def.section->owner);
- if (strcmp (bfd_get_filename (is->the_bfd->my_archive),
- other_bfd_filename) == 0)
+ if (filename_cmp (bfd_get_filename
+ (is->the_bfd->my_archive),
+ other_bfd_filename) == 0)
continue;
/* Rename this implib to match the other one. */
extension, and use that for the remainder of the
comparisons. */
pnt = strrchr (is3->the_bfd->filename, '.');
- if (pnt != NULL && strcmp (pnt, ".dll") == 0)
+ if (pnt != NULL && filename_cmp (pnt, ".dll") == 0)
break;
}
/* Skip static members, ie anything with a .obj
extension. */
pnt = strrchr (is2->the_bfd->filename, '.');
- if (pnt != NULL && strcmp (pnt, ".obj") == 0)
+ if (pnt != NULL && filename_cmp (pnt, ".obj") == 0)
continue;
- if (strcmp (is3->the_bfd->filename,
- is2->the_bfd->filename))
+ if (filename_cmp (is3->the_bfd->filename,
+ is2->the_bfd->filename))
{
is_ms_arch = 0;
break;
then leave the filename alone. */
pnt = strrchr (is->the_bfd->filename, '.');
- if (is_ms_arch && (strcmp (pnt, ".dll") == 0))
+ if (is_ms_arch && (filename_cmp (pnt, ".dll") == 0))
{
int idata2 = 0, reloc_count=0;
asection *sec;
/* If the symbol in the stub section has no other
undefined references, exclude the stub section
from the final link. */
- if (blhe && (blhe->type == bfd_link_hash_defined)
- && (blhe->u.undef.next == NULL))
+ if (blhe != NULL
+ && blhe->type == bfd_link_hash_defined
+ && blhe->u.undef.next == NULL
+ && blhe != link_info.hash->undefs_tail)
stub_sec->flags |= SEC_EXCLUDE;
}
}
#ifdef DLL_SUPPORT
const char *ext = entry->filename + strlen (entry->filename) - 4;
- if (strcmp (ext, ".def") == 0 || strcmp (ext, ".DEF") == 0)
+ if (filename_cmp (ext, ".def") == 0 || filename_cmp (ext, ".DEF") == 0)
{
pe_def_file = def_file_parse (entry->filename, pe_def_file);
= pe_def_file->base_address;
init[IMAGEBASEOFF].inited = 1;
if (image_base_statement)
- image_base_statement->exp = exp_assop ('=', "__image_base__",
- exp_intop (pe.ImageBase));
+ image_base_statement->exp
+ = exp_assign ("__image_base__", exp_intop (pe.ImageBase),
+ FALSE);
}
if (pe_def_file->stack_reserve != -1
#ifdef TARGET_IS_shpe
pe_dll_id_target ("pei-shl");
#endif
-#ifdef TARGET_IS_mipspe
- pe_dll_id_target ("pei-mips");
-#endif
#ifdef TARGET_IS_armpe
pe_dll_id_target ("pei-arm-little");
#endif
#ifdef DLL_SUPPORT
if (link_info.shared
-#if !defined(TARGET_IS_shpe) && !defined(TARGET_IS_mipspe)
+#if !defined(TARGET_IS_shpe)
|| (!link_info.relocatable && pe_def_file->num_exports != 0)
#endif
)
if (pe_implib_filename)
pe_dll_generate_implib (pe_def_file, pe_implib_filename, &link_info);
}
-#if defined(TARGET_IS_shpe) || defined(TARGET_IS_mipspe)
+#if defined(TARGET_IS_shpe)
/* ARM doesn't need relocs. */
else
{
If the section already exists but does not have any flags set,
then it has been created by the linker, probably as a result of
a --section-start command line switch. */
- lang_add_section (&add_child, s, os);
+ lang_add_section (&add_child, s, NULL, os);
break;
}
unused one and use that. */
if (os == NULL && match_by_name)
{
- lang_add_section (&match_by_name->children, s, match_by_name);
+ lang_add_section (&match_by_name->children, s, NULL, match_by_name);
return match_by_name;
}
{ ".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];
->output_section_statement);
}
- /* All sections in an executable must be aligned to a page boundary. */
+ /* All sections in an executable must be aligned to a page boundary.
+ In a relocatable link, just preserve the incoming alignment; the
+ address is discarded by lang_insert_orphan in that case, anyway. */
address = exp_unop (ALIGN_K, exp_nameop (NAME, "__section_alignment__"));
os = lang_insert_orphan (s, secname, constraint, after, place, address,
&add_child);
+ if (link_info.relocatable)
+ {
+ os->section_alignment = s->alignment_power;
+ os->bfd_section->alignment_power = s->alignment_power;
+ }
}
/* If the section name has a '\$', sort it with the other '\$'
unsigned int i;
- if (! entry->is_archive)
+ if (! entry->flags.maybe_archive)
return FALSE;
filename = entry->filename;
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 && (MERGE_RDATA_V2 || 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