gas/
[deliverable/binutils-gdb.git] / ld / emultempl / pe.em
CommitLineData
252b5132
RH
1# This shell script emits a C file. -*- C -*-
2# It does some substitutions.
e60cc415 3test -z "${ENTRY}" && ENTRY="_mainCRTStartup"
3fc90ddb 4if [ -z "$MACHINE" ]; then
86af25fe
L
5 OUTPUT_ARCH=${ARCH}
6else
7 OUTPUT_ARCH=${ARCH}:${MACHINE}
8fi
361d94e7
ILT
9rm -f e${EMULATION_NAME}.c
10(echo;echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
92b93329 11fragment <<EOF
f96b4a7b 12/* Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
bde18da4 13 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
252b5132 14
f96b4a7b
NC
15 This file is part of the GNU Binutils.
16
2fa9fc65
NC
17 This program is free software; you can redistribute it and/or modify
18 it under the terms of the GNU General Public License as published by
f96b4a7b 19 the Free Software Foundation; either version 3 of the License, or
2fa9fc65 20 (at your option) any later version.
252b5132 21
2fa9fc65
NC
22 This program is distributed in the hope that it will be useful,
23 but WITHOUT ANY WARRANTY; without even the implied warranty of
24 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 GNU General Public License for more details.
252b5132 26
2fa9fc65
NC
27 You should have received a copy of the GNU General Public License
28 along with this program; if not, write to the Free Software
f96b4a7b
NC
29 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
30 MA 02110-1301, USA. */
31
252b5132
RH
32
33/* For WINDOWS_NT */
34/* The original file generated returned different default scripts depending
35 on whether certain switches were set, but these switches pertain to the
36 Linux system and that particular version of coff. In the NT case, we
37 only determine if the subsystem is console or windows in order to select
3fc90ddb
AJ
38 the correct entry point by default. */
39
db09f25b
AM
40#define TARGET_IS_${EMULATION_NAME}
41
42/* Do this before including bfd.h, so we prototype the right functions. */
db09f25b 43
7148cc28
NC
44#if defined(TARGET_IS_armpe) \
45 || defined(TARGET_IS_arm_epoc_pe) \
46 || defined(TARGET_IS_arm_wince_pe)
47#define bfd_arm_allocate_interworking_sections \
48 bfd_${EMULATION_NAME}_allocate_interworking_sections
49#define bfd_arm_get_bfd_for_interworking \
50 bfd_${EMULATION_NAME}_get_bfd_for_interworking
51#define bfd_arm_process_before_allocation \
52 bfd_${EMULATION_NAME}_process_before_allocation
53#endif
92b93329 54
252b5132 55#include "sysdep.h"
3db64b00 56#include "bfd.h"
252b5132
RH
57#include "bfdlink.h"
58#include "getopt.h"
59#include "libiberty.h"
60#include "ld.h"
61#include "ldmain.h"
252b5132
RH
62#include "ldexp.h"
63#include "ldlang.h"
b71e2778 64#include "ldfile.h"
252b5132 65#include "ldemul.h"
df2a7313 66#include <ldgram.h>
252b5132
RH
67#include "ldlex.h"
68#include "ldmisc.h"
69#include "ldctor.h"
252b5132 70#include "coff/internal.h"
71add731 71
26d2d8a2
BF
72/* FIXME: See bfd/peXXigen.c for why we include an architecture specific
73 header in generic PE code. */
74#include "coff/i386.h"
75#include "coff/pe.h"
76
71add731
ILT
77/* FIXME: This is a BFD internal header file, and we should not be
78 using it here. */
252b5132 79#include "../bfd/libcoff.h"
71add731 80
252b5132 81#include "deffile.h"
1069dd8d 82#include "pe-dll.h"
29e1a6e4 83#include "safe-ctype.h"
14fe918e 84
2be9b2c7
ILT
85/* Permit the emulation parameters to override the default section
86 alignment by setting OVERRIDE_SECTION_ALIGNMENT. FIXME: This makes
87 it seem that include/coff/internal.h should not define
88 PE_DEF_SECTION_ALIGNMENT. */
89#if PE_DEF_SECTION_ALIGNMENT != ${OVERRIDE_SECTION_ALIGNMENT:-PE_DEF_SECTION_ALIGNMENT}
90#undef PE_DEF_SECTION_ALIGNMENT
91#define PE_DEF_SECTION_ALIGNMENT ${OVERRIDE_SECTION_ALIGNMENT}
92#endif
93
7148cc28
NC
94#if defined(TARGET_IS_i386pe) \
95 || defined(TARGET_IS_shpe) \
96 || defined(TARGET_IS_mipspe) \
97 || defined(TARGET_IS_armpe) \
98 || defined(TARGET_IS_arm_epoc_pe) \
99 || defined(TARGET_IS_arm_wince_pe)
344a211f
NC
100#define DLL_SUPPORT
101#endif
c6c37250 102
344a211f 103#if defined(TARGET_IS_i386pe) || ! defined(DLL_SUPPORT)
c6c37250 104#define PE_DEF_SUBSYSTEM 3
344a211f
NC
105#else
106#undef NT_EXE_IMAGE_BASE
107#undef PE_DEF_SECTION_ALIGNMENT
108#undef PE_DEF_FILE_ALIGNMENT
109#define NT_EXE_IMAGE_BASE 0x00010000
7148cc28
NC
110
111#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_wince_pe)
344a211f
NC
112#define PE_DEF_SECTION_ALIGNMENT 0x00001000
113#define PE_DEF_SUBSYSTEM 9
114#else
115#define PE_DEF_SECTION_ALIGNMENT 0x00000400
116#define PE_DEF_SUBSYSTEM 2
117#endif
118#define PE_DEF_FILE_ALIGNMENT 0x00000200
119#endif
c6c37250 120
00479ba8 121#define U(S) ${INITIAL_SYMBOL_CHAR} S
252b5132
RH
122
123static struct internal_extra_pe_aouthdr pe;
124static int dll;
26d2d8a2 125static flagword real_flags = 0;
252b5132 126static int support_old_code = 0;
6f798e5c 127static char * thumb_entry_symbol = NULL;
252b5132 128static lang_assignment_statement_type *image_base_statement = 0;
2f563b51 129static unsigned short pe_dll_characteristics = 0;
252b5132 130
f0c87f88 131#ifdef DLL_SUPPORT
4cd89863 132static int pe_enable_stdcall_fixup = -1; /* 0=disable 1=enable. */
690a460e
NC
133static char *pe_out_def_filename = NULL;
134static char *pe_implib_filename = NULL;
5f577f7d 135static int pe_enable_auto_image_base = 0;
627427de 136static char *pe_dll_search_prefix = NULL;
f0c87f88 137#endif
252b5132
RH
138
139extern const char *output_filename;
140
141static void
0c7a8e5a 142gld_${EMULATION_NAME}_before_parse (void)
252b5132 143{
5e2f1575 144 ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
db8d4f23 145 output_filename = "${EXECUTABLE_NAME:-a.exe}";
c6c37250 146#ifdef DLL_SUPPORT
b34976b6 147 config.dynamic_link = TRUE;
252b5132 148 config.has_shared = 1;
5b9c6027
DK
149EOF
150
151# Cygwin no longer wants these noisy warnings. Other PE
152# targets might like to consider adding themselves here.
153case ${target} in
154 *-*-cygwin*)
155 default_auto_import=1
156 ;;
157 *)
158 default_auto_import=-1
159 ;;
160esac
161
162fragment <<EOF
163 link_info.pei386_auto_import = ${default_auto_import};
6cb442d3 164 link_info.pei386_runtime_pseudo_reloc = 1; /* Use by default version 1. */
344a211f
NC
165
166#if (PE_DEF_SUBSYSTEM == 9) || (PE_DEF_SUBSYSTEM == 2)
7148cc28 167#if defined TARGET_IS_mipspe || defined TARGET_IS_armpe || defined TARGET_IS_arm_wince_pe
a359509e 168 lang_default_entry ("WinMainCRTStartup");
344a211f 169#else
a359509e 170 lang_default_entry ("_WinMainCRTStartup");
344a211f 171#endif
e60cc415
DS
172#else
173 lang_default_entry ("${ENTRY}");
344a211f 174#endif
252b5132
RH
175#endif
176}
177\f
178/* PE format extra command line options. */
179
4cd89863 180/* Used for setting flags in the PE header. */
252b5132
RH
181#define OPTION_BASE_FILE (300 + 1)
182#define OPTION_DLL (OPTION_BASE_FILE + 1)
183#define OPTION_FILE_ALIGNMENT (OPTION_DLL + 1)
184#define OPTION_IMAGE_BASE (OPTION_FILE_ALIGNMENT + 1)
185#define OPTION_MAJOR_IMAGE_VERSION (OPTION_IMAGE_BASE + 1)
186#define OPTION_MAJOR_OS_VERSION (OPTION_MAJOR_IMAGE_VERSION + 1)
187#define OPTION_MAJOR_SUBSYSTEM_VERSION (OPTION_MAJOR_OS_VERSION + 1)
188#define OPTION_MINOR_IMAGE_VERSION (OPTION_MAJOR_SUBSYSTEM_VERSION + 1)
189#define OPTION_MINOR_OS_VERSION (OPTION_MINOR_IMAGE_VERSION + 1)
190#define OPTION_MINOR_SUBSYSTEM_VERSION (OPTION_MINOR_OS_VERSION + 1)
191#define OPTION_SECTION_ALIGNMENT (OPTION_MINOR_SUBSYSTEM_VERSION + 1)
0c7a8e5a
AM
192#define OPTION_STACK (OPTION_SECTION_ALIGNMENT + 1)
193#define OPTION_SUBSYSTEM (OPTION_STACK + 1)
252b5132
RH
194#define OPTION_HEAP (OPTION_SUBSYSTEM + 1)
195#define OPTION_SUPPORT_OLD_CODE (OPTION_HEAP + 1)
196#define OPTION_OUT_DEF (OPTION_SUPPORT_OLD_CODE + 1)
197#define OPTION_EXPORT_ALL (OPTION_OUT_DEF + 1)
198#define OPTION_EXCLUDE_SYMBOLS (OPTION_EXPORT_ALL + 1)
199#define OPTION_KILL_ATS (OPTION_EXCLUDE_SYMBOLS + 1)
200#define OPTION_STDCALL_ALIASES (OPTION_KILL_ATS + 1)
201#define OPTION_ENABLE_STDCALL_FIXUP (OPTION_STDCALL_ALIASES + 1)
202#define OPTION_DISABLE_STDCALL_FIXUP (OPTION_ENABLE_STDCALL_FIXUP + 1)
203#define OPTION_IMPLIB_FILENAME (OPTION_DISABLE_STDCALL_FIXUP + 1)
6f798e5c 204#define OPTION_THUMB_ENTRY (OPTION_IMPLIB_FILENAME + 1)
870df5dc
NC
205#define OPTION_WARN_DUPLICATE_EXPORTS (OPTION_THUMB_ENTRY + 1)
206#define OPTION_IMP_COMPAT (OPTION_WARN_DUPLICATE_EXPORTS + 1)
5f577f7d
DD
207#define OPTION_ENABLE_AUTO_IMAGE_BASE (OPTION_IMP_COMPAT + 1)
208#define OPTION_DISABLE_AUTO_IMAGE_BASE (OPTION_ENABLE_AUTO_IMAGE_BASE + 1)
1122a5fc
NC
209#define OPTION_DLL_SEARCH_PREFIX (OPTION_DISABLE_AUTO_IMAGE_BASE + 1)
210#define OPTION_NO_DEFAULT_EXCLUDES (OPTION_DLL_SEARCH_PREFIX + 1)
decc3638
CW
211#define OPTION_DLL_ENABLE_AUTO_IMPORT (OPTION_NO_DEFAULT_EXCLUDES + 1)
212#define OPTION_DLL_DISABLE_AUTO_IMPORT (OPTION_DLL_ENABLE_AUTO_IMPORT + 1)
213#define OPTION_ENABLE_EXTRA_PE_DEBUG (OPTION_DLL_DISABLE_AUTO_IMPORT + 1)
70b0be79 214#define OPTION_EXCLUDE_LIBS (OPTION_ENABLE_EXTRA_PE_DEBUG + 1)
2fa9fc65
NC
215#define OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC \
216 (OPTION_EXCLUDE_LIBS + 1)
217#define OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC \
218 (OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC + 1)
26d2d8a2
BF
219#define OPTION_LARGE_ADDRESS_AWARE \
220 (OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC + 1)
6cb442d3
KT
221#define OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V1 \
222 (OPTION_LARGE_ADDRESS_AWARE + 1)
223#define OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2 \
224 (OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V1 + 1)
e1c37eb5
DK
225#define OPTION_EXCLUDE_MODULES_FOR_IMPLIB \
226 (OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2 + 1)
ce11ba6c 227#define OPTION_USE_NUL_PREFIXED_IMPORT_TABLES \
88183869
DK
228 (OPTION_EXCLUDE_MODULES_FOR_IMPLIB + 1)
229#define OPTION_ENABLE_LONG_SECTION_NAMES \
230 (OPTION_USE_NUL_PREFIXED_IMPORT_TABLES + 1)
231#define OPTION_DISABLE_LONG_SECTION_NAMES \
232 (OPTION_ENABLE_LONG_SECTION_NAMES + 1)
2f563b51
DK
233/* DLLCharacteristics flags */
234#define OPTION_DYNAMIC_BASE (OPTION_DISABLE_LONG_SECTION_NAMES + 1)
235#define OPTION_FORCE_INTEGRITY (OPTION_DYNAMIC_BASE + 1)
236#define OPTION_NX_COMPAT (OPTION_FORCE_INTEGRITY + 1)
237#define OPTION_NO_ISOLATION (OPTION_NX_COMPAT + 1)
238#define OPTION_NO_SEH (OPTION_NO_ISOLATION + 1)
239#define OPTION_NO_BIND (OPTION_NO_SEH + 1)
240#define OPTION_WDM_DRIVER (OPTION_NO_BIND + 1)
241#define OPTION_TERMINAL_SERVER_AWARE (OPTION_WDM_DRIVER + 1)
252b5132 242
3bcf5557 243static void
0c7a8e5a 244gld${EMULATION_NAME}_add_options
d127ecce
AM
245 (int ns ATTRIBUTE_UNUSED,
246 char **shortopts ATTRIBUTE_UNUSED,
247 int nl,
248 struct option **longopts,
249 int nrl ATTRIBUTE_UNUSED,
250 struct option **really_longopts ATTRIBUTE_UNUSED)
3bcf5557
AM
251{
252 static const struct option xtra_long[] = {
253 /* PE options */
254 {"base-file", required_argument, NULL, OPTION_BASE_FILE},
255 {"dll", no_argument, NULL, OPTION_DLL},
256 {"file-alignment", required_argument, NULL, OPTION_FILE_ALIGNMENT},
257 {"heap", required_argument, NULL, OPTION_HEAP},
258 {"image-base", required_argument, NULL, OPTION_IMAGE_BASE},
259 {"major-image-version", required_argument, NULL, OPTION_MAJOR_IMAGE_VERSION},
260 {"major-os-version", required_argument, NULL, OPTION_MAJOR_OS_VERSION},
261 {"major-subsystem-version", required_argument, NULL, OPTION_MAJOR_SUBSYSTEM_VERSION},
262 {"minor-image-version", required_argument, NULL, OPTION_MINOR_IMAGE_VERSION},
263 {"minor-os-version", required_argument, NULL, OPTION_MINOR_OS_VERSION},
264 {"minor-subsystem-version", required_argument, NULL, OPTION_MINOR_SUBSYSTEM_VERSION},
265 {"section-alignment", required_argument, NULL, OPTION_SECTION_ALIGNMENT},
266 {"stack", required_argument, NULL, OPTION_STACK},
267 {"subsystem", required_argument, NULL, OPTION_SUBSYSTEM},
268 {"support-old-code", no_argument, NULL, OPTION_SUPPORT_OLD_CODE},
269 {"thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY},
ce11ba6c
KT
270 {"use-nul-prefixed-import-tables", no_argument, NULL,
271 OPTION_USE_NUL_PREFIXED_IMPORT_TABLES},
c6c37250 272#ifdef DLL_SUPPORT
d127ecce
AM
273 /* getopt allows abbreviations, so we do this to stop it
274 from treating -o as an abbreviation for this option. */
3bcf5557
AM
275 {"output-def", required_argument, NULL, OPTION_OUT_DEF},
276 {"output-def", required_argument, NULL, OPTION_OUT_DEF},
277 {"export-all-symbols", no_argument, NULL, OPTION_EXPORT_ALL},
278 {"exclude-symbols", required_argument, NULL, OPTION_EXCLUDE_SYMBOLS},
279 {"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
e1c37eb5 280 {"exclude-modules-for-implib", required_argument, NULL, OPTION_EXCLUDE_MODULES_FOR_IMPLIB},
3bcf5557
AM
281 {"kill-at", no_argument, NULL, OPTION_KILL_ATS},
282 {"add-stdcall-alias", no_argument, NULL, OPTION_STDCALL_ALIASES},
283 {"enable-stdcall-fixup", no_argument, NULL, OPTION_ENABLE_STDCALL_FIXUP},
284 {"disable-stdcall-fixup", no_argument, NULL, OPTION_DISABLE_STDCALL_FIXUP},
285 {"out-implib", required_argument, NULL, OPTION_IMPLIB_FILENAME},
286 {"warn-duplicate-exports", no_argument, NULL, OPTION_WARN_DUPLICATE_EXPORTS},
287 /* getopt() allows abbreviations, so we do this to stop it from
288 treating -c as an abbreviation for these --compat-implib. */
289 {"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT},
290 {"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT},
291 {"enable-auto-image-base", no_argument, NULL, OPTION_ENABLE_AUTO_IMAGE_BASE},
292 {"disable-auto-image-base", no_argument, NULL, OPTION_DISABLE_AUTO_IMAGE_BASE},
293 {"dll-search-prefix", required_argument, NULL, OPTION_DLL_SEARCH_PREFIX},
294 {"no-default-excludes", no_argument, NULL, OPTION_NO_DEFAULT_EXCLUDES},
295 {"enable-auto-import", no_argument, NULL, OPTION_DLL_ENABLE_AUTO_IMPORT},
296 {"disable-auto-import", no_argument, NULL, OPTION_DLL_DISABLE_AUTO_IMPORT},
297 {"enable-extra-pe-debug", no_argument, NULL, OPTION_ENABLE_EXTRA_PE_DEBUG},
298 {"enable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC},
299 {"disable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC},
6cb442d3
KT
300 {"enable-runtime-pseudo-reloc-v1", no_argument, NULL, OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V1},
301 {"enable-runtime-pseudo-reloc-v2", no_argument, NULL, OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2},
252b5132 302#endif
26d2d8a2 303 {"large-address-aware", no_argument, NULL, OPTION_LARGE_ADDRESS_AWARE},
88183869
DK
304 {"enable-long-section-names", no_argument, NULL, OPTION_ENABLE_LONG_SECTION_NAMES},
305 {"disable-long-section-names", no_argument, NULL, OPTION_DISABLE_LONG_SECTION_NAMES},
2f563b51
DK
306 {"dynamicbase",no_argument, NULL, OPTION_DYNAMIC_BASE},
307 {"forceinteg", no_argument, NULL, OPTION_FORCE_INTEGRITY},
308 {"nxcompat", no_argument, NULL, OPTION_NX_COMPAT},
309 {"no-isolation", no_argument, NULL, OPTION_NO_ISOLATION},
310 {"no-seh", no_argument, NULL, OPTION_NO_SEH},
311 {"no-bind", no_argument, NULL, OPTION_NO_BIND},
312 {"wdmdriver", no_argument, NULL, OPTION_WDM_DRIVER},
313 {"tsaware", no_argument, NULL, OPTION_TERMINAL_SERVER_AWARE},
3bcf5557
AM
314 {NULL, no_argument, NULL, 0}
315 };
252b5132 316
d127ecce
AM
317 *longopts
318 = xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
3bcf5557
AM
319 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
320}
252b5132
RH
321
322/* PE/WIN32; added routines to get the subsystem type, heap and/or stack
4cd89863 323 parameters which may be input from the command line. */
252b5132
RH
324
325typedef struct
326{
327 void *ptr;
328 int size;
329 int value;
330 char *symbol;
331 int inited;
332} definfo;
333
334#define D(field,symbol,def) {&pe.field,sizeof(pe.field), def, symbol,0}
335
336static definfo init[] =
337{
338 /* imagebase must be first */
339#define IMAGEBASEOFF 0
340 D(ImageBase,"__image_base__", NT_EXE_IMAGE_BASE),
341#define DLLOFF 1
1069dd8d 342 {&dll, sizeof(dll), 0, "__dll__", 0},
dffc6a64
KT
343#define MSIMAGEBASEOFF 2
344 D(ImageBase, U ("__ImageBase"), NT_EXE_IMAGE_BASE),
252b5132
RH
345 D(SectionAlignment,"__section_alignment__", PE_DEF_SECTION_ALIGNMENT),
346 D(FileAlignment,"__file_alignment__", PE_DEF_FILE_ALIGNMENT),
347 D(MajorOperatingSystemVersion,"__major_os_version__", 4),
348 D(MinorOperatingSystemVersion,"__minor_os_version__", 0),
349 D(MajorImageVersion,"__major_image_version__", 1),
350 D(MinorImageVersion,"__minor_image_version__", 0),
7148cc28 351#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_wince_pe)
53baae48 352 D(MajorSubsystemVersion,"__major_subsystem_version__", 3),
344a211f 353#else
252b5132 354 D(MajorSubsystemVersion,"__major_subsystem_version__", 4),
344a211f 355#endif
252b5132 356 D(MinorSubsystemVersion,"__minor_subsystem_version__", 0),
2be9b2c7 357 D(Subsystem,"__subsystem__", ${SUBSYSTEM}),
3763134d 358 D(SizeOfStackReserve,"__size_of_stack_reserve__", 0x200000),
252b5132
RH
359 D(SizeOfStackCommit,"__size_of_stack_commit__", 0x1000),
360 D(SizeOfHeapReserve,"__size_of_heap_reserve__", 0x100000),
361 D(SizeOfHeapCommit,"__size_of_heap_commit__", 0x1000),
362 D(LoaderFlags,"__loader_flags__", 0x0),
2f563b51 363 D(DllCharacteristics, "__dll_characteristics__", 0x0),
252b5132
RH
364 { NULL, 0, 0, NULL, 0 }
365};
366
4cd89863 367
252b5132 368static void
0c7a8e5a 369gld_${EMULATION_NAME}_list_options (FILE *file)
252b5132
RH
370{
371 fprintf (file, _(" --base_file <basefile> Generate a base file for relocatable DLLs\n"));
372 fprintf (file, _(" --dll Set image base to the default for DLLs\n"));
373 fprintf (file, _(" --file-alignment <size> Set file alignment\n"));
374 fprintf (file, _(" --heap <size> Set initial size of the heap\n"));
375 fprintf (file, _(" --image-base <address> Set start address of the executable\n"));
376 fprintf (file, _(" --major-image-version <number> Set version number of the executable\n"));
377 fprintf (file, _(" --major-os-version <number> Set minimum required OS version\n"));
378 fprintf (file, _(" --major-subsystem-version <number> Set minimum required OS subsystem version\n"));
379 fprintf (file, _(" --minor-image-version <number> Set revision number of the executable\n"));
380 fprintf (file, _(" --minor-os-version <number> Set minimum required OS revision\n"));
381 fprintf (file, _(" --minor-subsystem-version <number> Set minimum required OS subsystem revision\n"));
382 fprintf (file, _(" --section-alignment <size> Set section alignment\n"));
383 fprintf (file, _(" --stack <size> Set size of the initial stack\n"));
384 fprintf (file, _(" --subsystem <name>[:<version>] Set required OS subsystem [& version]\n"));
385 fprintf (file, _(" --support-old-code Support interworking with old code\n"));
6f798e5c 386 fprintf (file, _(" --thumb-entry=<symbol> Set the entry point to be Thumb <symbol>\n"));
c6c37250 387#ifdef DLL_SUPPORT
252b5132
RH
388 fprintf (file, _(" --add-stdcall-alias Export symbols with and without @nn\n"));
389 fprintf (file, _(" --disable-stdcall-fixup Don't link _sym to _sym@nn\n"));
390 fprintf (file, _(" --enable-stdcall-fixup Link _sym to _sym@nn without warnings\n"));
391 fprintf (file, _(" --exclude-symbols sym,sym,... Exclude symbols from automatic export\n"));
b34976b6 392 fprintf (file, _(" --exclude-libs lib,lib,... Exclude libraries from automatic export\n"));
e1c37eb5
DK
393 fprintf (file, _(" --exclude-modules-for-implib mod,mod,...\n"));
394 fprintf (file, _(" Exclude objects, archive members from auto\n"));
395 fprintf (file, _(" export, place into import library instead.\n"));
252b5132
RH
396 fprintf (file, _(" --export-all-symbols Automatically export all globals to DLL\n"));
397 fprintf (file, _(" --kill-at Remove @nn from exported symbols\n"));
398 fprintf (file, _(" --out-implib <file> Generate import library\n"));
399 fprintf (file, _(" --output-def <file> Generate a .DEF file for the built DLL\n"));
0752a404 400 fprintf (file, _(" --warn-duplicate-exports Warn about duplicate exports.\n"));
e3c8793a
NC
401 fprintf (file, _(" --compat-implib Create backward compatible import libs;\n\
402 create __imp_<SYMBOL> as well.\n"));
403 fprintf (file, _(" --enable-auto-image-base Automatically choose image base for DLLs\n\
404 unless user specifies one\n"));
5f577f7d 405 fprintf (file, _(" --disable-auto-image-base Do not auto-choose image base. (default)\n"));
489d0400
NC
406 fprintf (file, _(" --dll-search-prefix=<string> When linking dynamically to a dll without\n\
407 an importlib, use <string><basename>.dll\n\
e3c8793a 408 in preference to lib<basename>.dll \n"));
489d0400 409 fprintf (file, _(" --enable-auto-import Do sophistcated linking of _sym to\n\
e3c8793a 410 __imp_sym for DATA references\n"));
decc3638 411 fprintf (file, _(" --disable-auto-import Do not auto-import DATA items from DLLs\n"));
2fa9fc65 412 fprintf (file, _(" --enable-runtime-pseudo-reloc Work around auto-import limitations by\n\
489d0400
NC
413 adding pseudo-relocations resolved at\n\
414 runtime.\n"));
2fa9fc65
NC
415 fprintf (file, _(" --disable-runtime-pseudo-reloc Do not add runtime pseudo-relocations for\n\
416 auto-imported DATA.\n"));
e3c8793a
NC
417 fprintf (file, _(" --enable-extra-pe-debug Enable verbose debug output when building\n\
418 or linking to DLLs (esp. auto-import)\n"));
252b5132 419#endif
26d2d8a2
BF
420 fprintf (file, _(" --large-address-aware Executable supports virtual addresses\n\
421 greater than 2 gigabytes\n"));
88183869
DK
422 fprintf (file, _(" --enable-long-section-names Use long COFF section names even in\n\
423 executable image files\n"));
424 fprintf (file, _(" --disable-long-section-names Never use long COFF section names, even\n\
425 in object files\n"));
2f563b51
DK
426 fprintf (file, _(" --dynamicbase Image base address may be relocated using\n\
427 address space layout randomization (ASLR)\n"));
428 fprintf (file, _(" --forceinteg Code integrity checks are enforced\n"));
429 fprintf (file, _(" --nxcompat Image is compatible with data execution prevention\n"));
430 fprintf (file, _(" --no-isolation Image understands isolation but do not isolate the image\n"));
431 fprintf (file, _(" --no-seh Image does not use SEH. No SE handler may\n\
432 be called in this image\n"));
433 fprintf (file, _(" --no-bind Do not bind this image\n"));
434 fprintf (file, _(" --wdmdriver Driver uses the WDM model\n"));
435 fprintf (file, _(" --tsaware Image is Terminal Server aware\n"));
252b5132
RH
436}
437
4cd89863 438
252b5132 439static void
0c7a8e5a 440set_pe_name (char *name, long val)
252b5132
RH
441{
442 int i;
4cd89863
NC
443
444 /* Find the name and set it. */
252b5132
RH
445 for (i = 0; init[i].ptr; i++)
446 {
447 if (strcmp (name, init[i].symbol) == 0)
448 {
449 init[i].value = val;
450 init[i].inited = 1;
dffc6a64
KT
451 if (strcmp (name,"__image_base__") == 0)
452 set_pe_name (U ("__ImageBase"), val);
252b5132
RH
453 return;
454 }
455 }
939ba9d0 456 abort ();
252b5132
RH
457}
458
459
460static void
0c7a8e5a 461set_pe_subsystem (void)
252b5132
RH
462{
463 const char *sver;
33f362e1
NC
464 const char *entry;
465 const char *initial_symbol_char;
466 char *end;
252b5132
RH
467 int len;
468 int i;
33f362e1
NC
469 int subsystem;
470 unsigned long temp_subsystem;
3fc90ddb 471 static const struct
252b5132
RH
472 {
473 const char *name;
474 const int value;
475 const char *entry;
476 }
477 v[] =
478 {
33f362e1 479 { "native", 1, "NtProcessStartup" },
2be9b2c7
ILT
480 { "windows", 2, "WinMainCRTStartup" },
481 { "console", 3, "mainCRTStartup" },
33f362e1 482 { "posix", 7, "__PosixProcessStartup"},
00479ba8 483 { "wince", 9, "WinMainCRTStartup" },
33f362e1
NC
484 { "xbox", 14, "mainCRTStartup" },
485 { NULL, 0, NULL }
252b5132 486 };
33f362e1
NC
487 /* Entry point name for arbitrary subsystem numbers. */
488 static const char default_entry[] = "mainCRTStartup";
252b5132 489
33f362e1 490 /* Check for the presence of a version number. */
252b5132
RH
491 sver = strchr (optarg, ':');
492 if (sver == NULL)
493 len = strlen (optarg);
494 else
495 {
252b5132
RH
496 len = sver - optarg;
497 set_pe_name ("__major_subsystem_version__",
498 strtoul (sver + 1, &end, 0));
499 if (*end == '.')
500 set_pe_name ("__minor_subsystem_version__",
501 strtoul (end + 1, &end, 0));
502 if (*end != '\0')
503 einfo (_("%P: warning: bad version number in -subsystem option\n"));
504 }
505
33f362e1
NC
506 /* Check for numeric subsystem. */
507 temp_subsystem = strtoul (optarg, & end, 0);
508 if ((*end == ':' || *end == '\0') && (temp_subsystem < 65536))
252b5132 509 {
33f362e1
NC
510 /* Search list for a numeric match to use its entry point. */
511 for (i = 0; v[i].name; i++)
512 if (v[i].value == (int) temp_subsystem)
513 break;
514
515 /* If no match, use the default. */
516 if (v[i].name != NULL)
517 entry = v[i].entry;
518 else
519 entry = default_entry;
520
521 /* Use this subsystem. */
522 subsystem = (int) temp_subsystem;
523 }
524 else
525 {
526 /* Search for subsystem by name. */
527 for (i = 0; v[i].name; i++)
528 if (strncmp (optarg, v[i].name, len) == 0
529 && v[i].name[len] == '\0')
530 break;
252b5132 531
33f362e1
NC
532 if (v[i].name == NULL)
533 {
534 einfo (_("%P%F: invalid subsystem type %s\n"), optarg);
252b5132
RH
535 return;
536 }
33f362e1
NC
537
538 entry = v[i].entry;
539 subsystem = v[i].value;
252b5132 540 }
3fc90ddb 541
33f362e1
NC
542 set_pe_name ("__subsystem__", subsystem);
543
544 initial_symbol_char = ${INITIAL_SYMBOL_CHAR};
545 if (*initial_symbol_char != '\0')
546 {
547 char *alc_entry;
548
a359509e 549 /* lang_default_entry expects its argument to be permanently
33f362e1
NC
550 allocated, so we don't free this string. */
551 alc_entry = xmalloc (strlen (initial_symbol_char)
552 + strlen (entry)
553 + 1);
554 strcpy (alc_entry, initial_symbol_char);
555 strcat (alc_entry, entry);
556 entry = alc_entry;
557 }
558
a359509e 559 lang_default_entry (entry);
33f362e1
NC
560
561 return;
252b5132
RH
562}
563
564
252b5132 565static void
0c7a8e5a 566set_pe_value (char *name)
252b5132
RH
567{
568 char *end;
3fc90ddb 569
252b5132 570 set_pe_name (name, strtoul (optarg, &end, 0));
3fc90ddb 571
252b5132
RH
572 if (end == optarg)
573 einfo (_("%P%F: invalid hex number for PE parameter '%s'\n"), optarg);
574
575 optarg = end;
576}
577
4cd89863 578
252b5132 579static void
0c7a8e5a 580set_pe_stack_heap (char *resname, char *comname)
252b5132
RH
581{
582 set_pe_value (resname);
3fc90ddb 583
252b5132
RH
584 if (*optarg == ',')
585 {
586 optarg++;
587 set_pe_value (comname);
588 }
589 else if (*optarg)
590 einfo (_("%P%F: strange hex info for PE parameter '%s'\n"), optarg);
591}
592
593
3bcf5557 594static bfd_boolean
0c7a8e5a 595gld${EMULATION_NAME}_handle_option (int optc)
252b5132 596{
252b5132
RH
597 switch (optc)
598 {
599 default:
3bcf5557 600 return FALSE;
252b5132
RH
601
602 case OPTION_BASE_FILE:
0c7a8e5a 603 link_info.base_file = fopen (optarg, FOPEN_WB);
252b5132
RH
604 if (link_info.base_file == NULL)
605 {
606 /* xgettext:c-format */
607 fprintf (stderr, _("%s: Can't open base file %s\n"),
608 program_name, optarg);
609 xexit (1);
610 }
611 break;
612
4cd89863 613 /* PE options. */
3fc90ddb 614 case OPTION_HEAP:
252b5132
RH
615 set_pe_stack_heap ("__size_of_heap_reserve__", "__size_of_heap_commit__");
616 break;
3fc90ddb 617 case OPTION_STACK:
252b5132
RH
618 set_pe_stack_heap ("__size_of_stack_reserve__", "__size_of_stack_commit__");
619 break;
620 case OPTION_SUBSYSTEM:
621 set_pe_subsystem ();
622 break;
623 case OPTION_MAJOR_OS_VERSION:
624 set_pe_value ("__major_os_version__");
625 break;
626 case OPTION_MINOR_OS_VERSION:
627 set_pe_value ("__minor_os_version__");
628 break;
629 case OPTION_MAJOR_SUBSYSTEM_VERSION:
630 set_pe_value ("__major_subsystem_version__");
631 break;
632 case OPTION_MINOR_SUBSYSTEM_VERSION:
633 set_pe_value ("__minor_subsystem_version__");
634 break;
635 case OPTION_MAJOR_IMAGE_VERSION:
636 set_pe_value ("__major_image_version__");
637 break;
638 case OPTION_MINOR_IMAGE_VERSION:
639 set_pe_value ("__minor_image_version__");
640 break;
641 case OPTION_FILE_ALIGNMENT:
642 set_pe_value ("__file_alignment__");
643 break;
644 case OPTION_SECTION_ALIGNMENT:
645 set_pe_value ("__section_alignment__");
646 break;
647 case OPTION_DLL:
648 set_pe_name ("__dll__", 1);
649 break;
650 case OPTION_IMAGE_BASE:
651 set_pe_value ("__image_base__");
652 break;
653 case OPTION_SUPPORT_OLD_CODE:
654 support_old_code = 1;
655 break;
6f798e5c
NC
656 case OPTION_THUMB_ENTRY:
657 thumb_entry_symbol = optarg;
658 break;
ce11ba6c
KT
659 case OPTION_USE_NUL_PREFIXED_IMPORT_TABLES:
660 pe_use_nul_prefixed_import_tables = TRUE;
661 break;
c6c37250 662#ifdef DLL_SUPPORT
252b5132
RH
663 case OPTION_OUT_DEF:
664 pe_out_def_filename = xstrdup (optarg);
665 break;
666 case OPTION_EXPORT_ALL:
667 pe_dll_export_everything = 1;
668 break;
669 case OPTION_EXCLUDE_SYMBOLS:
e1c37eb5 670 pe_dll_add_excludes (optarg, EXCLUDESYMS);
70b0be79
CF
671 break;
672 case OPTION_EXCLUDE_LIBS:
e1c37eb5
DK
673 pe_dll_add_excludes (optarg, EXCLUDELIBS);
674 break;
675 case OPTION_EXCLUDE_MODULES_FOR_IMPLIB:
676 pe_dll_add_excludes (optarg, EXCLUDEFORIMPLIB);
252b5132
RH
677 break;
678 case OPTION_KILL_ATS:
679 pe_dll_kill_ats = 1;
680 break;
681 case OPTION_STDCALL_ALIASES:
682 pe_dll_stdcall_aliases = 1;
683 break;
684 case OPTION_ENABLE_STDCALL_FIXUP:
685 pe_enable_stdcall_fixup = 1;
686 break;
687 case OPTION_DISABLE_STDCALL_FIXUP:
688 pe_enable_stdcall_fixup = 0;
689 break;
690 case OPTION_IMPLIB_FILENAME:
691 pe_implib_filename = xstrdup (optarg);
692 break;
870df5dc
NC
693 case OPTION_WARN_DUPLICATE_EXPORTS:
694 pe_dll_warn_dup_exports = 1;
695 break;
696 case OPTION_IMP_COMPAT:
697 pe_dll_compat_implib = 1;
698 break;
5f577f7d
DD
699 case OPTION_ENABLE_AUTO_IMAGE_BASE:
700 pe_enable_auto_image_base = 1;
701 break;
702 case OPTION_DISABLE_AUTO_IMAGE_BASE:
703 pe_enable_auto_image_base = 0;
704 break;
627427de 705 case OPTION_DLL_SEARCH_PREFIX:
939ba9d0 706 pe_dll_search_prefix = xstrdup (optarg);
627427de 707 break;
1122a5fc
NC
708 case OPTION_NO_DEFAULT_EXCLUDES:
709 pe_dll_do_default_excludes = 0;
710 break;
decc3638 711 case OPTION_DLL_ENABLE_AUTO_IMPORT:
e0076ab3 712 link_info.pei386_auto_import = 1;
decc3638
CW
713 break;
714 case OPTION_DLL_DISABLE_AUTO_IMPORT:
e0076ab3 715 link_info.pei386_auto_import = 0;
decc3638 716 break;
2fa9fc65
NC
717 case OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC:
718 link_info.pei386_runtime_pseudo_reloc = 1;
719 break;
6cb442d3
KT
720 case OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V1:
721 link_info.pei386_runtime_pseudo_reloc = 1;
722 break;
723 case OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC_V2:
724 link_info.pei386_runtime_pseudo_reloc = 2;
725 break;
2fa9fc65
NC
726 case OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC:
727 link_info.pei386_runtime_pseudo_reloc = 0;
728 break;
decc3638
CW
729 case OPTION_ENABLE_EXTRA_PE_DEBUG:
730 pe_dll_extra_pe_debug = 1;
731 break;
c6c37250 732#endif
26d2d8a2
BF
733 case OPTION_LARGE_ADDRESS_AWARE:
734 real_flags |= IMAGE_FILE_LARGE_ADDRESS_AWARE;
735 break;
88183869
DK
736 case OPTION_ENABLE_LONG_SECTION_NAMES:
737 pe_use_coff_long_section_names = 1;
738 break;
739 case OPTION_DISABLE_LONG_SECTION_NAMES:
740 pe_use_coff_long_section_names = 0;
741 break;
2f563b51
DK
742/* Get DLLCharacteristics bits */
743 case OPTION_DYNAMIC_BASE:
744 pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE;
745 break;
746 case OPTION_FORCE_INTEGRITY:
747 pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY;
748 break;
749 case OPTION_NX_COMPAT:
750 pe_dll_characteristics |= IMAGE_DLL_CHARACTERISTICS_NX_COMPAT;
751 break;
752 case OPTION_NO_ISOLATION:
753 pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_NO_ISOLATION;
754 break;
755 case OPTION_NO_SEH:
756 pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_NO_SEH;
757 break;
758 case OPTION_NO_BIND:
759 pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_NO_BIND;
760 break;
761 case OPTION_WDM_DRIVER:
762 pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_WDM_DRIVER;
763 break;
764 case OPTION_TERMINAL_SERVER_AWARE:
765 pe_dll_characteristics |= IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE;
766 break;
252b5132 767 }
2f563b51
DK
768
769 /* Set DLLCharacteristics bits */
770 set_pe_name ("__dll_characteristics__", pe_dll_characteristics);
771
3bcf5557 772 return TRUE;
252b5132
RH
773}
774\f
5f577f7d 775
2ef53d66 776#ifdef DLL_SUPPORT
3fc90ddb 777static unsigned long
5f577f7d
DD
778strhash (const char *str)
779{
780 const unsigned char *s;
781 unsigned long hash;
782 unsigned int c;
783 unsigned int len;
784
785 hash = 0;
786 len = 0;
787 s = (const unsigned char *) str;
788 while ((c = *s++) != '\0')
789 {
790 hash += c + (c << 17);
791 hash ^= hash >> 2;
792 ++len;
793 }
794 hash += len + (len << 17);
795 hash ^= hash >> 2;
796
797 return hash;
798}
799
4cd89863
NC
800/* Use the output file to create a image base for relocatable DLLs. */
801
5f577f7d
DD
802static unsigned long
803compute_dll_image_base (const char *ofile)
804{
805 unsigned long hash = strhash (ofile);
2c7fd14a 806 return 0x61300000 + ((hash << 16) & 0x0FFC0000);
5f577f7d 807}
2ef53d66 808#endif
5f577f7d 809
252b5132
RH
810/* Assign values to the special symbols before the linker script is
811 read. */
812
813static void
0c7a8e5a 814gld_${EMULATION_NAME}_set_symbols (void)
252b5132
RH
815{
816 /* Run through and invent symbols for all the
4cd89863 817 names and insert the defaults. */
252b5132 818 int j;
252b5132
RH
819
820 if (!init[IMAGEBASEOFF].inited)
821 {
1049f94e 822 if (link_info.relocatable)
252b5132 823 init[IMAGEBASEOFF].value = 0;
db8acf26 824 else if (init[DLLOFF].value || (link_info.shared && !link_info.pie))
d127ecce 825 {
2ef53d66 826#ifdef DLL_SUPPORT
d127ecce
AM
827 init[IMAGEBASEOFF].value = (pe_enable_auto_image_base
828 ? compute_dll_image_base (output_filename)
829 : NT_DLL_IMAGE_BASE);
2ef53d66 830#else
d127ecce 831 init[IMAGEBASEOFF].value = NT_DLL_IMAGE_BASE;
2ef53d66 832#endif
d127ecce 833 }
252b5132
RH
834 else
835 init[IMAGEBASEOFF].value = NT_EXE_IMAGE_BASE;
dffc6a64 836 init[MSIMAGEBASEOFF].value = init[IMAGEBASEOFF].value;
252b5132
RH
837 }
838
1049f94e
AM
839 /* Don't do any symbol assignments if this is a relocatable link. */
840 if (link_info.relocatable)
252b5132
RH
841 return;
842
4cd89863 843 /* Glue the assignments into the abs section. */
bde18da4 844 push_stat_ptr (&abs_output_section->children);
252b5132
RH
845
846 for (j = 0; init[j].ptr; j++)
847 {
848 long val = init[j].value;
849 lang_assignment_statement_type *rv;
2c382fb6
AM
850 rv = lang_add_assignment (exp_assop ('=', init[j].symbol,
851 exp_intop (val)));
939ba9d0
NC
852 if (init[j].size == sizeof (short))
853 *(short *) init[j].ptr = val;
854 else if (init[j].size == sizeof (int))
855 *(int *) init[j].ptr = val;
856 else if (init[j].size == sizeof (long))
857 *(long *) init[j].ptr = val;
252b5132 858 /* This might be a long long or other special type. */
939ba9d0
NC
859 else if (init[j].size == sizeof (bfd_vma))
860 *(bfd_vma *) init[j].ptr = val;
861 else abort ();
252b5132
RH
862 if (j == IMAGEBASEOFF)
863 image_base_statement = rv;
864 }
4cd89863 865 /* Restore the pointer. */
bde18da4 866 pop_stat_ptr ();
3fc90ddb 867
d127ecce 868 if (pe.FileAlignment > pe.SectionAlignment)
252b5132
RH
869 {
870 einfo (_("%P: warning, file alignment > section alignment.\n"));
871 }
872}
873
874/* This is called after the linker script and the command line options
875 have been read. */
876
877static void
0c7a8e5a 878gld_${EMULATION_NAME}_after_parse (void)
252b5132
RH
879{
880 /* The Windows libraries are designed for the linker to treat the
881 entry point as an undefined symbol. Otherwise, the .obj that
882 defines mainCRTStartup is brought in because it is the first
883 encountered in libc.lib and it has other symbols in it which will
884 be pulled in by the link process. To avoid this, we act as
885 though the user specified -u with the entry point symbol.
886
887 This function is called after the linker script and command line
888 options have been read, so at this point we know the right entry
889 point. This function is called before the input files are
890 opened, so registering the symbol as undefined will make a
891 difference. */
892
1049f94e 893 if (! link_info.relocatable && entry_symbol.name != NULL)
e3e942e9 894 ldlang_add_undef (entry_symbol.name);
8b747e1a
DK
895
896 /* PR ld/6744: Warn the user if they have used an ELF-only
897 option hoping it will work on PE. */
898 if (link_info.export_dynamic)
899 einfo (_("%P: warning: --export-dynamic is not supported for PE "
900 "targets, did you mean --export-all-symbols?\n"));
252b5132
RH
901}
902
aa3d9aba
NC
903/* pe-dll.c directly accesses pe_data_import_dll,
904 so it must be defined outside of #ifdef DLL_SUPPORT.
905 Note - this variable is deliberately not initialised.
906 This allows it to be treated as a common varaible, and only
907 exist in one incarnation in a multiple target enabled linker. */
908char * pe_data_import_dll;
72358f65 909
2ef53d66 910#ifdef DLL_SUPPORT
252b5132
RH
911static struct bfd_link_hash_entry *pe_undef_found_sym;
912
b34976b6 913static bfd_boolean
0c7a8e5a 914pe_undef_cdecl_match (struct bfd_link_hash_entry *h, void *inf)
252b5132 915{
decc3638 916 int sl;
0c7a8e5a 917 char *string = inf;
4cd89863 918
0c7a8e5a 919 sl = strlen (string);
252b5132
RH
920 if (h->type == bfd_link_hash_defined
921 && strncmp (h->root.string, string, sl) == 0
922 && h->root.string[sl] == '@')
decc3638
CW
923 {
924 pe_undef_found_sym = h;
b34976b6 925 return FALSE;
decc3638 926 }
b34976b6 927 return TRUE;
252b5132
RH
928}
929
930static void
0c7a8e5a 931pe_fixup_stdcalls (void)
252b5132
RH
932{
933 static int gave_warning_message = 0;
934 struct bfd_link_hash_entry *undef, *sym;
c9e38879 935
3fc90ddb 936 if (pe_dll_extra_pe_debug)
c9e38879 937 printf ("%s\n", __FUNCTION__);
3fc90ddb 938
f6e332e6 939 for (undef = link_info.hash->undefs; undef; undef=undef->u.undef.next)
252b5132 940 if (undef->type == bfd_link_hash_undefined)
252b5132 941 {
c9e38879
NC
942 char* at = strchr (undef->root.string, '@');
943 int lead_at = (*undef->root.string == '@');
944 /* For now, don't try to fixup fastcall symbols. */
b34976b6 945
c9e38879
NC
946 if (at && !lead_at)
947 {
948 /* The symbol is a stdcall symbol, so let's look for a
949 cdecl symbol with the same name and resolve to that. */
950 char *cname = xstrdup (undef->root.string /* + lead_at */);
951 at = strchr (cname, '@');
952 *at = 0;
953 sym = bfd_link_hash_lookup (link_info.hash, cname, 0, 0, 1);
954
955 if (sym && sym->type == bfd_link_hash_defined)
956 {
957 undef->type = bfd_link_hash_defined;
958 undef->u.def.value = sym->u.def.value;
959 undef->u.def.section = sym->u.def.section;
4cd89863 960
c9e38879
NC
961 if (pe_enable_stdcall_fixup == -1)
962 {
963 einfo (_("Warning: resolving %s by linking to %s\n"),
964 undef->root.string, cname);
965 if (! gave_warning_message)
966 {
967 gave_warning_message = 1;
939ba9d0
NC
968 einfo (_("Use --enable-stdcall-fixup to disable these warnings\n"));
969 einfo (_("Use --disable-stdcall-fixup to disable these fixups\n"));
c9e38879
NC
970 }
971 }
972 }
973 }
974 else
975 {
976 /* The symbol is a cdecl symbol, so we look for stdcall
4cd89863 977 symbols - which means scanning the whole symbol table. */
c9e38879
NC
978 pe_undef_found_sym = 0;
979 bfd_link_hash_traverse (link_info.hash, pe_undef_cdecl_match,
0c7a8e5a 980 (char *) undef->root.string);
c9e38879
NC
981 sym = pe_undef_found_sym;
982 if (sym)
983 {
984 undef->type = bfd_link_hash_defined;
985 undef->u.def.value = sym->u.def.value;
986 undef->u.def.section = sym->u.def.section;
4cd89863 987
c9e38879
NC
988 if (pe_enable_stdcall_fixup == -1)
989 {
990 einfo (_("Warning: resolving %s by linking to %s\n"),
991 undef->root.string, sym->root.string);
992 if (! gave_warning_message)
993 {
994 gave_warning_message = 1;
939ba9d0
NC
995 einfo (_("Use --enable-stdcall-fixup to disable these warnings\n"));
996 einfo (_("Use --disable-stdcall-fixup to disable these fixups\n"));
c9e38879
NC
997 }
998 }
999 }
1000 }
252b5132 1001 }
252b5132 1002}
decc3638
CW
1003
1004static int
0c7a8e5a 1005make_import_fixup (arelent *rel, asection *s)
decc3638 1006{
fc0a2244 1007 struct bfd_symbol *sym = *rel->sym_ptr_ptr;
c99b8138 1008 char addend[4];
decc3638 1009
3fc90ddb 1010 if (pe_dll_extra_pe_debug)
c9e38879 1011 printf ("arelent: %s@%#lx: add=%li\n", sym->name,
0af1713e 1012 (unsigned long) rel->address, (long) rel->addend);
0d888aac 1013
c99b8138 1014 if (! bfd_get_section_contents (s->owner, s, addend, rel->address, sizeof (addend)))
c9e38879
NC
1015 einfo (_("%C: Cannot get section contents - auto-import exception\n"),
1016 s->owner, s, rel->address);
0d888aac 1017
c99b8138 1018 pe_create_import_fixup (rel, s, bfd_get_32 (s->owner, addend));
0d888aac 1019
decc3638
CW
1020 return 1;
1021}
1022
decc3638 1023static void
0c7a8e5a 1024pe_find_data_imports (void)
decc3638
CW
1025{
1026 struct bfd_link_hash_entry *undef, *sym;
c9e38879 1027
4cd89863
NC
1028 if (link_info.pei386_auto_import == 0)
1029 return;
1030
f6e332e6 1031 for (undef = link_info.hash->undefs; undef; undef=undef->u.undef.next)
decc3638
CW
1032 {
1033 if (undef->type == bfd_link_hash_undefined)
1af699f4
AM
1034 {
1035 /* C++ symbols are *long*. */
1036 char buf[4096];
c9e38879
NC
1037
1038 if (pe_dll_extra_pe_debug)
1039 printf ("%s:%s\n", __FUNCTION__, undef->root.string);
1040
1af699f4 1041 sprintf (buf, "__imp_%s", undef->root.string);
decc3638 1042
1af699f4 1043 sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
c9e38879 1044
1af699f4
AM
1045 if (sym && sym->type == bfd_link_hash_defined)
1046 {
4cd89863
NC
1047 bfd *b = sym->u.def.section->owner;
1048 asymbol **symbols;
5c1d2f5f 1049 int nsyms, i;
4cd89863
NC
1050
1051 if (link_info.pei386_auto_import == -1)
8524166d
NC
1052 {
1053 static bfd_boolean warned = FALSE;
1054
1055 info_msg (_("Info: resolving %s by linking to %s (auto-import)\n"),
1056 undef->root.string, buf);
1057
1058 /* PR linker/4844. */
1059 if (! warned)
1060 {
1061 warned = TRUE;
1062 einfo (_("%P: warning: auto-importing has been activated without --enable-auto-import specified on the command line.\n\
44e36d8a 1063This should work unless it involves constant data structures referencing symbols from auto-imported DLLs.\n"));
8524166d
NC
1064 }
1065 }
4cd89863 1066
5c1d2f5f
AM
1067 if (!bfd_generic_link_read_symbols (b))
1068 {
1069 einfo (_("%B%F: could not read symbols: %E\n"), b);
1070 return;
1071 }
1072
1073 symbols = bfd_get_outsymbols (b);
1074 nsyms = bfd_get_symcount (b);
4cd89863
NC
1075
1076 for (i = 0; i < nsyms; i++)
1077 {
00479ba8 1078 if (! CONST_STRNEQ (symbols[i]->name, U ("_head_")))
4cd89863
NC
1079 continue;
1080
1081 if (pe_dll_extra_pe_debug)
1082 printf ("->%s\n", symbols[i]->name);
1083
1084 pe_data_import_dll = (char*) (symbols[i]->name +
00479ba8 1085 sizeof (U ("_head_")) - 1);
4cd89863
NC
1086 break;
1087 }
1088
1089 pe_walk_relocs_of_symbol (&link_info, undef->root.string,
1090 make_import_fixup);
1091
1092 /* Let's differentiate it somehow from defined. */
1093 undef->type = bfd_link_hash_defweak;
1094 /* We replace original name with __imp_ prefixed, this
1095 1) may trash memory 2) leads to duplicate symbol generation.
1096 Still, IMHO it's better than having name poluted. */
1097 undef->root.string = sym->root.string;
1098 undef->u.def.value = sym->u.def.value;
1099 undef->u.def.section = sym->u.def.section;
1af699f4
AM
1100 }
1101 }
decc3638
CW
1102 }
1103}
252b5132 1104
b34976b6 1105static bfd_boolean
0c7a8e5a 1106pr_sym (struct bfd_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
decc3638 1107{
3fc90ddb 1108 if (pe_dll_extra_pe_debug)
0c7a8e5a 1109 printf ("+%s\n", h->string);
c9e38879 1110
b34976b6 1111 return TRUE;
decc3638 1112}
4b83d615 1113#endif /* DLL_SUPPORT */
decc3638 1114
3efd345c
DK
1115static void
1116debug_section_p (bfd *abfd ATTRIBUTE_UNUSED, asection *sect, void *obj)
1117{
1118 int *found = (int *) obj;
1119 if (strncmp (".debug_", sect->name, sizeof (".debug_") - 1) == 0)
1120 *found = 1;
1121}
decc3638 1122
252b5132 1123static void
0c7a8e5a 1124gld_${EMULATION_NAME}_after_open (void)
252b5132 1125{
4b83d615 1126#ifdef DLL_SUPPORT
3fc90ddb 1127 if (pe_dll_extra_pe_debug)
decc3638
CW
1128 {
1129 bfd *a;
1130 struct bfd_link_hash_entry *sym;
c9e38879 1131
decc3638
CW
1132 printf ("%s()\n", __FUNCTION__);
1133
f6e332e6 1134 for (sym = link_info.hash->undefs; sym; sym=sym->u.undef.next)
1af699f4 1135 printf ("-%s\n", sym->root.string);
0c7a8e5a 1136 bfd_hash_traverse (&link_info.hash->table, pr_sym, NULL);
decc3638
CW
1137
1138 for (a = link_info.input_bfds; a; a = a->link_next)
c9e38879 1139 printf ("*%s\n",a->filename);
decc3638 1140 }
4b83d615 1141#endif
3fc90ddb 1142
252b5132
RH
1143 /* Pass the wacky PE command line options into the output bfd.
1144 FIXME: This should be done via a function, rather than by
1145 including an internal BFD header. */
3fc90ddb 1146
f13a99db
AM
1147 if (coff_data (link_info.output_bfd) == NULL
1148 || coff_data (link_info.output_bfd)->pe == 0)
1149 einfo (_("%F%P: cannot perform PE operations on non PE output file '%B'.\n"),
1150 link_info.output_bfd);
252b5132 1151
f13a99db
AM
1152 pe_data (link_info.output_bfd)->pe_opthdr = pe;
1153 pe_data (link_info.output_bfd)->dll = init[DLLOFF].value;
1154 pe_data (link_info.output_bfd)->real_flags |= real_flags;
3efd345c
DK
1155
1156 /* At this point we must decide whether to use long section names
1157 in the output or not. If the user hasn't explicitly specified
1158 on the command line, we leave it to the default for the format
1159 (object files yes, image files no), except if there is debug
1160 information present; GDB relies on the long section names to
1161 find it, so enable it in that case. */
1162 if (pe_use_coff_long_section_names < 0 && link_info.strip == strip_none)
1163 {
1164 /* Iterate over all sections of all input BFDs, checking
1165 for any that begin 'debug_' and are long names. */
1166 LANG_FOR_EACH_INPUT_STATEMENT (is)
1167 {
1168 int found_debug = 0;
1169 bfd_map_over_sections (is->the_bfd, debug_section_p, &found_debug);
1170 if (found_debug)
1171 {
1172 pe_use_coff_long_section_names = 1;
1173 break;
1174 }
1175 }
1176 }
1177
88183869 1178 pe_output_file_set_long_section_names (link_info.output_bfd);
252b5132 1179
c6c37250 1180#ifdef DLL_SUPPORT
252b5132
RH
1181 if (pe_enable_stdcall_fixup) /* -1=warn or 1=disable */
1182 pe_fixup_stdcalls ();
1183
f13a99db 1184 pe_process_import_defs (link_info.output_bfd, &link_info);
939ba9d0 1185
3fc90ddb 1186 pe_find_data_imports ();
decc3638 1187
7148cc28
NC
1188#if defined (TARGET_IS_i386pe) \
1189 || defined (TARGET_IS_armpe) \
1190 || defined (TARGET_IS_arm_epoc_pe) \
1191 || defined (TARGET_IS_arm_wince_pe)
1049f94e 1192 if (!link_info.relocatable)
f13a99db 1193 pe_dll_build_sections (link_info.output_bfd, &link_info);
7148cc28
NC
1194#else
1195 if (link_info.shared)
f13a99db 1196 pe_dll_build_sections (link_info.output_bfd, &link_info);
1491f1f0
DK
1197 else
1198 pe_exe_build_sections (link_info.output_bfd, &link_info);
344a211f 1199#endif
7148cc28 1200#endif /* DLL_SUPPORT */
252b5132 1201
7148cc28 1202#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe)
f13a99db 1203 if (strstr (bfd_get_target (link_info.output_bfd), "arm") == NULL)
f11523b0
NC
1204 {
1205 /* The arm backend needs special fields in the output hash structure.
1206 These will only be created if the output format is an arm format,
1207 hence we do not support linking and changing output formats at the
1208 same time. Use a link followed by objcopy to change output formats. */
1209 einfo ("%F%X%P: error: cannot change output format whilst linking ARM binaries\n");
1210 return;
1211 }
252b5132
RH
1212 {
1213 /* Find a BFD that can hold the interworking stubs. */
1214 LANG_FOR_EACH_INPUT_STATEMENT (is)
1215 {
7148cc28 1216 if (bfd_arm_get_bfd_for_interworking (is->the_bfd, & link_info))
252b5132
RH
1217 break;
1218 }
1219 }
1220#endif
c6c37250 1221
486e80e2 1222 {
486e80e2
DD
1223 /* This next chunk of code tries to detect the case where you have
1224 two import libraries for the same DLL (specifically,
1225 symbolically linking libm.a and libc.a in cygwin to
1226 libcygwin.a). In those cases, it's possible for function
1227 thunks from the second implib to be used but without the
1228 head/tail objects, causing an improper import table. We detect
1229 those cases and rename the "other" import libraries to match
1230 the one the head/tail come from, so that the linker will sort
4cd89863 1231 things nicely and produce a valid import table. */
486e80e2
DD
1232
1233 LANG_FOR_EACH_INPUT_STATEMENT (is)
1234 {
1235 if (is->the_bfd->my_archive)
1236 {
1237 int idata2 = 0, reloc_count=0, is_imp = 0;
1238 asection *sec;
3fc90ddb 1239
6e45556a 1240 /* See if this is an import library thunk. */
486e80e2
DD
1241 for (sec = is->the_bfd->sections; sec; sec = sec->next)
1242 {
1243 if (strcmp (sec->name, ".idata\$2") == 0)
1244 idata2 = 1;
0112cd26 1245 if (CONST_STRNEQ (sec->name, ".idata\$"))
486e80e2
DD
1246 is_imp = 1;
1247 reloc_count += sec->reloc_count;
1248 }
3fc90ddb 1249
486e80e2
DD
1250 if (is_imp && !idata2 && reloc_count)
1251 {
6e45556a
NC
1252 /* It is, look for the reference to head and see if it's
1253 from our own library. */
486e80e2
DD
1254 for (sec = is->the_bfd->sections; sec; sec = sec->next)
1255 {
1256 int i;
6e45556a 1257 long relsize;
102c86f8 1258 asymbol **symbols;
102c86f8
NC
1259 arelent **relocs;
1260 int nrelocs;
3fc90ddb 1261
102c86f8 1262 relsize = bfd_get_reloc_upper_bound (is->the_bfd, sec);
6e45556a
NC
1263 if (relsize < 1)
1264 break;
3fc90ddb 1265
5c1d2f5f 1266 if (!bfd_generic_link_read_symbols (is->the_bfd))
6e45556a 1267 {
5c1d2f5f
AM
1268 einfo (_("%B%F: could not read symbols: %E\n"),
1269 is->the_bfd);
6e45556a
NC
1270 return;
1271 }
5c1d2f5f 1272 symbols = bfd_get_outsymbols (is->the_bfd);
3fc90ddb 1273
d127ecce 1274 relocs = xmalloc ((size_t) relsize);
102c86f8 1275 nrelocs = bfd_canonicalize_reloc (is->the_bfd, sec,
f6e332e6 1276 relocs, symbols);
6e45556a
NC
1277 if (nrelocs < 0)
1278 {
1279 free (relocs);
44e36d8a 1280 einfo ("%X%P: unable to process relocs: %E\n");
6e45556a
NC
1281 return;
1282 }
3fc90ddb 1283
6e45556a 1284 for (i = 0; i < nrelocs; i++)
486e80e2 1285 {
fc0a2244 1286 struct bfd_symbol *s;
6e45556a 1287 struct bfd_link_hash_entry * blhe;
2a08daf3 1288 char *other_bfd_filename;
6e45556a 1289 char *n;
3fc90ddb 1290
486e80e2 1291 s = (relocs[i]->sym_ptr_ptr)[0];
3fc90ddb 1292
6e45556a
NC
1293 if (s->flags & BSF_LOCAL)
1294 continue;
3fc90ddb 1295
6e45556a
NC
1296 /* Thunk section with reloc to another bfd. */
1297 blhe = bfd_link_hash_lookup (link_info.hash,
1298 s->name,
b34976b6 1299 FALSE, FALSE, TRUE);
3fc90ddb 1300
6e45556a
NC
1301 if (blhe == NULL
1302 || blhe->type != bfd_link_hash_defined)
1303 continue;
3fc90ddb 1304
2a08daf3
DS
1305 other_bfd_filename
1306 = blhe->u.def.section->owner->my_archive
1307 ? bfd_get_filename (blhe->u.def.section->owner->my_archive)
1308 : bfd_get_filename (blhe->u.def.section->owner);
3fc90ddb 1309
2a08daf3
DS
1310 if (strcmp (bfd_get_filename (is->the_bfd->my_archive),
1311 other_bfd_filename) == 0)
6e45556a 1312 continue;
3fc90ddb 1313
c034e3e0 1314 /* Rename this implib to match the other one. */
2a08daf3
DS
1315 n = xmalloc (strlen (other_bfd_filename) + 1);
1316 strcpy (n, other_bfd_filename);
1317 is->the_bfd->my_archive->filename = n;
486e80e2
DD
1318 }
1319
1320 free (relocs);
6e45556a
NC
1321 /* Note - we do not free the symbols,
1322 they are now cached in the BFD. */
486e80e2
DD
1323 }
1324 }
1325 }
1326 }
1327 }
1328
c6c37250 1329 {
f0c87f88 1330 int is_ms_arch = 0;
1069dd8d 1331 bfd *cur_arch = 0;
c6c37250 1332 lang_input_statement_type *is2;
44dbf363 1333 lang_input_statement_type *is3;
1069dd8d 1334
c6c37250
DD
1335 /* Careful - this is a shell script. Watch those dollar signs! */
1336 /* Microsoft import libraries have every member named the same,
1337 and not in the right order for us to link them correctly. We
1338 must detect these and rename the members so that they'll link
1339 correctly. There are three types of objects: the head, the
1340 thunks, and the sentinel(s). The head is easy; it's the one
1341 with idata2. We assume that the sentinels won't have relocs,
1342 and the thunks will. It's easier than checking the symbol
1069dd8d 1343 table for external references. */
c6c37250
DD
1344 LANG_FOR_EACH_INPUT_STATEMENT (is)
1345 {
1346 if (is->the_bfd->my_archive)
1347 {
44dbf363 1348 char *pnt;
c6c37250 1349 bfd *arch = is->the_bfd->my_archive;
44dbf363 1350
c6c37250
DD
1351 if (cur_arch != arch)
1352 {
1353 cur_arch = arch;
1354 is_ms_arch = 1;
44dbf363
NC
1355
1356 for (is3 = is;
1357 is3 && is3->the_bfd->my_archive == arch;
1358 is3 = (lang_input_statement_type *) is3->next)
1359 {
1af699f4 1360 /* A MS dynamic import library can also contain static
44dbf363
NC
1361 members, so look for the first element with a .dll
1362 extension, and use that for the remainder of the
1363 comparisons. */
1364 pnt = strrchr (is3->the_bfd->filename, '.');
07a68a80 1365 if (pnt != NULL && strcmp (pnt, ".dll") == 0)
ff71f4f7 1366 break;
44dbf363
NC
1367 }
1368
1369 if (is3 == NULL)
1370 is_ms_arch = 0;
1371 else
c6c37250 1372 {
44dbf363
NC
1373 /* OK, found one. Now look to see if the remaining
1374 (dynamic import) members use the same name. */
1375 for (is2 = is;
1376 is2 && is2->the_bfd->my_archive == arch;
1377 is2 = (lang_input_statement_type *) is2->next)
1378 {
1379 /* Skip static members, ie anything with a .obj
1380 extension. */
1381 pnt = strrchr (is2->the_bfd->filename, '.');
1382 if (pnt != NULL && strcmp (pnt, ".obj") == 0)
1383 continue;
1384
1385 if (strcmp (is3->the_bfd->filename,
1386 is2->the_bfd->filename))
1387 {
1388 is_ms_arch = 0;
1389 break;
1390 }
1391 }
c6c37250
DD
1392 }
1393 }
1394
44dbf363
NC
1395 /* This fragment might have come from an .obj file in a Microsoft
1396 import, and not an actual import record. If this is the case,
1397 then leave the filename alone. */
1398 pnt = strrchr (is->the_bfd->filename, '.');
1399
1400 if (is_ms_arch && (strcmp (pnt, ".dll") == 0))
c6c37250 1401 {
1069dd8d 1402 int idata2 = 0, reloc_count=0;
c6c37250
DD
1403 asection *sec;
1404 char *new_name, seq;
1069dd8d 1405
c6c37250
DD
1406 for (sec = is->the_bfd->sections; sec; sec = sec->next)
1407 {
1408 if (strcmp (sec->name, ".idata\$2") == 0)
1409 idata2 = 1;
1410 reloc_count += sec->reloc_count;
1411 }
1412
1413 if (idata2) /* .idata2 is the TOC */
1414 seq = 'a';
1415 else if (reloc_count > 0) /* thunks */
1416 seq = 'b';
1417 else /* sentinel */
1418 seq = 'c';
1419
e4e24acb 1420 new_name = xmalloc (strlen (is->the_bfd->filename) + 3);
c6c37250
DD
1421 sprintf (new_name, "%s.%c", is->the_bfd->filename, seq);
1422 is->the_bfd->filename = new_name;
1423
690a460e 1424 new_name = xmalloc (strlen (is->filename) + 3);
c6c37250
DD
1425 sprintf (new_name, "%s.%c", is->filename, seq);
1426 is->filename = new_name;
1427 }
1428 }
1429 }
1430 }
54727719
NC
1431
1432 {
1433 /* The following chunk of code tries to identify jump stubs in
1434 import libraries which are dead code and eliminates them
1435 from the final link. For each exported symbol <sym>, there
1436 is a object file in the import library with a .text section
d34c1c51 1437 and several .idata\$* sections. The .text section contains the
54727719 1438 symbol definition for <sym> which is a jump stub of the form
d34c1c51 1439 jmp *__imp_<sym>. The .idata\$5 contains the symbol definition
54727719
NC
1440 for __imp_<sym> which is the address of the slot for <sym> in
1441 the import address table. When a symbol is imported explicitly
1442 using __declspec(dllimport) declaration, the compiler generates
1443 a reference to __imp_<sym> which directly resolves to the
d34c1c51 1444 symbol in .idata\$5, in which case the jump stub code is not
54727719
NC
1445 needed. The following code tries to identify jump stub sections
1446 in import libraries which are not referred to by anyone and
1447 marks them for exclusion from the final link. */
1448 LANG_FOR_EACH_INPUT_STATEMENT (is)
1449 {
1450 if (is->the_bfd->my_archive)
1451 {
1452 int is_imp = 0;
1453 asection *sec, *stub_sec = NULL;
1454
1455 /* See if this is an import library thunk. */
1456 for (sec = is->the_bfd->sections; sec; sec = sec->next)
1457 {
1458 if (strncmp (sec->name, ".idata\$", 7) == 0)
1459 is_imp = 1;
1460 /* The section containing the jmp stub has code
1461 and has a reloc. */
1462 if ((sec->flags & SEC_CODE) && sec->reloc_count)
1463 stub_sec = sec;
1464 }
92b93329 1465
54727719
NC
1466 if (is_imp && stub_sec)
1467 {
54727719 1468 asymbol **symbols;
5c1d2f5f 1469 long nsyms, src_count;
54727719
NC
1470 struct bfd_link_hash_entry * blhe;
1471
5c1d2f5f
AM
1472 if (!bfd_generic_link_read_symbols (is->the_bfd))
1473 {
1474 einfo (_("%B%F: could not read symbols: %E\n"),
1475 is->the_bfd);
1476 return;
1477 }
1478 symbols = bfd_get_outsymbols (is->the_bfd);
1479 nsyms = bfd_get_symcount (is->the_bfd);
54727719 1480
5c1d2f5f 1481 for (src_count = 0; src_count < nsyms; src_count++)
54727719
NC
1482 {
1483 if (symbols[src_count]->section->id == stub_sec->id)
1484 {
1485 /* This symbol belongs to the section containing
1486 the stub. */
1487 blhe = bfd_link_hash_lookup (link_info.hash,
1488 symbols[src_count]->name,
1489 FALSE, FALSE, TRUE);
1490 /* If the symbol in the stub section has no other
1491 undefined references, exclude the stub section
1492 from the final link. */
1493 if (blhe && (blhe->type == bfd_link_hash_defined)
1494 && (blhe->u.undef.next == NULL))
1495 stub_sec->flags |= SEC_EXCLUDE;
1496 }
1497 }
54727719
NC
1498 }
1499 }
1500 }
1501 }
252b5132
RH
1502}
1503\f
3fc90ddb 1504static void
0c7a8e5a 1505gld_${EMULATION_NAME}_before_allocation (void)
252b5132
RH
1506{
1507#ifdef TARGET_IS_ppcpe
c9e38879 1508 /* Here we rummage through the found bfds to collect toc information. */
252b5132
RH
1509 {
1510 LANG_FOR_EACH_INPUT_STATEMENT (is)
1511 {
1512 if (!ppc_process_before_allocation (is->the_bfd, &link_info))
1513 {
1514 /* xgettext:c-format */
1515 einfo (_("Errors encountered processing file %s\n"), is->filename);
1516 }
1517 }
1518 }
1519
c9e38879 1520 /* We have seen it all. Allocate it, and carry on. */
252b5132
RH
1521 ppc_allocate_toc_section (&link_info);
1522#endif /* TARGET_IS_ppcpe */
1523
7148cc28 1524#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe)
252b5132
RH
1525 /* FIXME: we should be able to set the size of the interworking stub
1526 section.
1527
1528 Here we rummage through the found bfds to collect glue
1529 information. FIXME: should this be based on a command line
c9e38879 1530 option? krk@cygnus.com. */
252b5132
RH
1531 {
1532 LANG_FOR_EACH_INPUT_STATEMENT (is)
1533 {
7148cc28 1534 if (! bfd_arm_process_before_allocation
252b5132
RH
1535 (is->the_bfd, & link_info, support_old_code))
1536 {
1537 /* xgettext:c-format */
44e36d8a 1538 einfo (_("Errors encountered processing file %s for interworking\n"),
252b5132
RH
1539 is->filename);
1540 }
1541 }
1542 }
1543
c9e38879 1544 /* We have seen it all. Allocate it, and carry on. */
7148cc28
NC
1545 bfd_arm_allocate_interworking_sections (& link_info);
1546#endif /* TARGET_IS_armpe || TARGET_IS_arm_epoc_pe || TARGET_IS_arm_wince_pe */
8423293d 1547
1e035701 1548 before_allocation_default ();
252b5132
RH
1549}
1550\f
690a460e 1551#ifdef DLL_SUPPORT
252b5132 1552/* This is called when an input file isn't recognized as a BFD. We
c9e38879 1553 check here for .DEF files and pull them in automatically. */
690a460e 1554
252b5132 1555static int
0c7a8e5a 1556saw_option (char *option)
252b5132
RH
1557{
1558 int i;
c9e38879
NC
1559
1560 for (i = 0; init[i].ptr; i++)
252b5132
RH
1561 if (strcmp (init[i].symbol, option) == 0)
1562 return init[i].inited;
1563 return 0;
1564}
690a460e 1565#endif /* DLL_SUPPORT */
252b5132 1566
b34976b6 1567static bfd_boolean
0c7a8e5a 1568gld_${EMULATION_NAME}_unrecognized_file (lang_input_statement_type *entry ATTRIBUTE_UNUSED)
252b5132 1569{
c6c37250 1570#ifdef DLL_SUPPORT
252b5132
RH
1571 const char *ext = entry->filename + strlen (entry->filename) - 4;
1572
1573 if (strcmp (ext, ".def") == 0 || strcmp (ext, ".DEF") == 0)
252b5132 1574 {
f2d3750d 1575 pe_def_file = def_file_parse (entry->filename, pe_def_file);
c9e38879
NC
1576
1577 if (pe_def_file)
252b5132 1578 {
c9e38879
NC
1579 int i, buflen=0, len;
1580 char *buf;
252b5132 1581
c9e38879 1582 for (i = 0; i < pe_def_file->num_exports; i++)
252b5132 1583 {
939ba9d0 1584 len = strlen (pe_def_file->exports[i].internal_name);
c9e38879
NC
1585 if (buflen < len + 2)
1586 buflen = len + 2;
252b5132 1587 }
252b5132 1588
d127ecce 1589 buf = xmalloc (buflen);
252b5132 1590
c9e38879
NC
1591 for (i = 0; i < pe_def_file->num_exports; i++)
1592 {
1593 struct bfd_link_hash_entry *h;
1594
00479ba8 1595 sprintf (buf, "%s%s", U (""), pe_def_file->exports[i].internal_name);
c9e38879 1596
b34976b6 1597 h = bfd_link_hash_lookup (link_info.hash, buf, TRUE, TRUE, TRUE);
c9e38879
NC
1598 if (h == (struct bfd_link_hash_entry *) NULL)
1599 einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n"));
1600 if (h->type == bfd_link_hash_new)
1601 {
1602 h->type = bfd_link_hash_undefined;
1603 h->u.undef.abfd = NULL;
1604 bfd_link_add_undef (link_info.hash, h);
1605 }
1606 }
1607 free (buf);
1608
1609 /* def_file_print (stdout, pe_def_file); */
1610 if (pe_def_file->is_dll == 1)
1611 link_info.shared = 1;
1612
1613 if (pe_def_file->base_address != (bfd_vma)(-1))
1614 {
f13a99db
AM
1615 pe.ImageBase
1616 = pe_data (link_info.output_bfd)->pe_opthdr.ImageBase
1617 = init[IMAGEBASEOFF].value
1618 = pe_def_file->base_address;
c9e38879
NC
1619 init[IMAGEBASEOFF].inited = 1;
1620 if (image_base_statement)
f13a99db
AM
1621 image_base_statement->exp = exp_assop ('=', "__image_base__",
1622 exp_intop (pe.ImageBase));
c9e38879 1623 }
252b5132 1624
c9e38879
NC
1625 if (pe_def_file->stack_reserve != -1
1626 && ! saw_option ("__size_of_stack_reserve__"))
1627 {
1628 pe.SizeOfStackReserve = pe_def_file->stack_reserve;
1629 if (pe_def_file->stack_commit != -1)
1630 pe.SizeOfStackCommit = pe_def_file->stack_commit;
1631 }
1632 if (pe_def_file->heap_reserve != -1
1633 && ! saw_option ("__size_of_heap_reserve__"))
1634 {
1635 pe.SizeOfHeapReserve = pe_def_file->heap_reserve;
1636 if (pe_def_file->heap_commit != -1)
1637 pe.SizeOfHeapCommit = pe_def_file->heap_commit;
1638 }
b34976b6 1639 return TRUE;
c9e38879 1640 }
252b5132 1641 }
252b5132 1642#endif
b34976b6 1643 return FALSE;
252b5132
RH
1644}
1645
b34976b6 1646static bfd_boolean
0c7a8e5a 1647gld_${EMULATION_NAME}_recognized_file (lang_input_statement_type *entry ATTRIBUTE_UNUSED)
252b5132 1648{
c6c37250 1649#ifdef DLL_SUPPORT
252b5132 1650#ifdef TARGET_IS_i386pe
c6c37250 1651 pe_dll_id_target ("pei-i386");
344a211f
NC
1652#endif
1653#ifdef TARGET_IS_shpe
1654 pe_dll_id_target ("pei-shl");
1655#endif
1656#ifdef TARGET_IS_mipspe
1657 pe_dll_id_target ("pei-mips");
1658#endif
1659#ifdef TARGET_IS_armpe
1660 pe_dll_id_target ("pei-arm-little");
7148cc28
NC
1661#endif
1662#ifdef TARGET_IS_arm_epoc_pe
1663 pe_dll_id_target ("epoc-pei-arm-little");
1664#endif
1665#ifdef TARGET_IS_arm_wince_pe
1666 pe_dll_id_target ("pei-arm-wince-little");
c6c37250 1667#endif
ff2bdb9c
CF
1668 if (pe_bfd_is_dll (entry->the_bfd))
1669 return pe_implied_import_dll (entry->filename);
252b5132 1670#endif
b34976b6 1671 return FALSE;
252b5132
RH
1672}
1673
1674static void
0c7a8e5a 1675gld_${EMULATION_NAME}_finish (void)
252b5132 1676{
7148cc28 1677#if defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe)
6f798e5c
NC
1678 struct bfd_link_hash_entry * h;
1679
1680 if (thumb_entry_symbol != NULL)
1681 {
b34976b6
AM
1682 h = bfd_link_hash_lookup (link_info.hash, thumb_entry_symbol,
1683 FALSE, FALSE, TRUE);
3fc90ddb 1684
6f798e5c
NC
1685 if (h != (struct bfd_link_hash_entry *) NULL
1686 && (h->type == bfd_link_hash_defined
1687 || h->type == bfd_link_hash_defweak)
1688 && h->u.def.section->output_section != NULL)
1689 {
1690 static char buffer[32];
1691 bfd_vma val;
3fc90ddb 1692
6f798e5c
NC
1693 /* Special procesing is required for a Thumb entry symbol. The
1694 bottom bit of its address must be set. */
1695 val = (h->u.def.value
f13a99db 1696 + bfd_get_section_vma (link_info.output_bfd,
6f798e5c
NC
1697 h->u.def.section->output_section)
1698 + h->u.def.section->output_offset);
3fc90ddb 1699
6f798e5c 1700 val |= 1;
3fc90ddb 1701
6f798e5c
NC
1702 /* Now convert this value into a string and store it in entry_symbol
1703 where the lang_finish() function will pick it up. */
1704 buffer[0] = '0';
1705 buffer[1] = 'x';
3fc90ddb 1706
6f798e5c 1707 sprintf_vma (buffer + 2, val);
3fc90ddb 1708
e3e942e9 1709 if (entry_symbol.name != NULL && entry_from_cmdline)
6f798e5c 1710 einfo (_("%P: warning: '--thumb-entry %s' is overriding '-e %s'\n"),
e3e942e9
AM
1711 thumb_entry_symbol, entry_symbol.name);
1712 entry_symbol.name = buffer;
6f798e5c
NC
1713 }
1714 else
c58dea77 1715 einfo (_("%P: warning: cannot find thumb start symbol %s\n"), thumb_entry_symbol);
6f798e5c 1716 }
7148cc28 1717#endif /* defined(TARGET_IS_armpe) || defined(TARGET_IS_arm_epoc_pe) || defined(TARGET_IS_arm_wince_pe) */
6f798e5c 1718
1e035701
AM
1719 finish_default ();
1720
c6c37250 1721#ifdef DLL_SUPPORT
2b817be1
NC
1722 if (link_info.shared
1723#if !defined(TARGET_IS_shpe) && !defined(TARGET_IS_mipspe)
d127ecce 1724 || (!link_info.relocatable && pe_def_file->num_exports != 0)
2b817be1
NC
1725#endif
1726 )
252b5132 1727 {
f13a99db 1728 pe_dll_fill_sections (link_info.output_bfd, &link_info);
252b5132 1729 if (pe_implib_filename)
e1c37eb5 1730 pe_dll_generate_implib (pe_def_file, pe_implib_filename, &link_info);
252b5132 1731 }
344a211f 1732#if defined(TARGET_IS_shpe) || defined(TARGET_IS_mipspe)
690a460e 1733 /* ARM doesn't need relocs. */
344a211f
NC
1734 else
1735 {
f13a99db 1736 pe_exe_fill_sections (link_info.output_bfd, &link_info);
344a211f
NC
1737 }
1738#endif
3fc90ddb 1739
252b5132
RH
1740 if (pe_out_def_filename)
1741 pe_dll_generate_def_file (pe_out_def_filename);
690a460e 1742#endif /* DLL_SUPPORT */
decc3638 1743
c9e38879 1744 /* I don't know where .idata gets set as code, but it shouldn't be. */
decc3638 1745 {
f13a99db 1746 asection *asec = bfd_get_section_by_name (link_info.output_bfd, ".idata");
c9e38879 1747
decc3638
CW
1748 if (asec)
1749 {
1af699f4
AM
1750 asec->flags &= ~SEC_CODE;
1751 asec->flags |= SEC_DATA;
decc3638
CW
1752 }
1753 }
252b5132
RH
1754}
1755
1756\f
1757/* Place an orphan section.
1758
1759 We use this to put sections in a reasonable place in the file, and
1760 to ensure that they are aligned as required.
1761
d34c1c51 1762 We handle grouped sections here as well. A section named .foo\$nn
252b5132
RH
1763 goes into the output section .foo. All grouped sections are sorted
1764 by name.
1765
1766 Grouped sections for the default sections are handled by the
1767 default linker script using wildcards, and are sorted by
1768 sort_sections. */
1769
c2edb4b8 1770static lang_output_section_statement_type *
8a99a385
AM
1771gld_${EMULATION_NAME}_place_orphan (asection *s,
1772 const char *secname,
1773 int constraint)
252b5132 1774{
bcacc0f5 1775 const char *orig_secname = secname;
f0c87f88 1776 char *dollar = NULL;
aea4bd9d 1777 lang_output_section_statement_type *os;
5ba47421 1778 lang_statement_list_type add_child;
011aa75f 1779 lang_statement_union_type **pl;
252b5132 1780
252b5132 1781 /* Look through the script to see where to place this section. */
afd7a018 1782 if (!link_info.relocatable
d34c1c51 1783 && (dollar = strchr (secname, '\$')) != NULL)
6eec49fc 1784 {
bcacc0f5 1785 size_t len = dollar - secname;
afd7a018 1786 char *newname = xmalloc (len + 1);
bcacc0f5 1787 memcpy (newname, secname, len);
afd7a018
AM
1788 newname[len] = '\0';
1789 secname = newname;
6eec49fc 1790 }
252b5132 1791
5ba47421
AM
1792 lang_list_init (&add_child);
1793
d127ecce
AM
1794 os = NULL;
1795 if (constraint == 0)
1796 for (os = lang_output_section_find (secname);
1797 os != NULL;
1798 os = next_matching_output_section_statement (os, 0))
1799 {
1800 /* If we don't match an existing output section, tell
1801 lang_insert_orphan to create a new output section. */
1802 constraint = SPECIAL;
1803
1804 if (os->bfd_section != NULL
1805 && (os->bfd_section->flags == 0
1806 || ((s->flags ^ os->bfd_section->flags)
1807 & (SEC_LOAD | SEC_ALLOC)) == 0))
1808 {
1809 /* We already have an output section statement with this
1810 name, and its bfd section has compatible flags.
1811 If the section already exists but does not have any flags set,
1812 then it has been created by the linker, probably as a result of
1813 a --section-start command line switch. */
1814 lang_add_section (&add_child, s, os);
1815 break;
1816 }
1817 }
1818
1819 if (os == NULL)
252b5132 1820 {
afd7a018
AM
1821 static struct orphan_save hold[] =
1822 {
1823 { ".text",
1824 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE,
1825 0, 0, 0, 0 },
1826 { ".rdata",
1827 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_DATA,
1828 0, 0, 0, 0 },
1829 { ".data",
1830 SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_DATA,
1831 0, 0, 0, 0 },
1832 { ".bss",
1833 SEC_ALLOC,
1834 0, 0, 0, 0 }
1835 };
1836 enum orphan_save_index
1837 {
1838 orphan_text = 0,
1839 orphan_rodata,
1840 orphan_data,
1841 orphan_bss
1842 };
1843 static int orphan_init_done = 0;
6a345e87 1844 struct orphan_save *place;
afd7a018 1845 lang_output_section_statement_type *after;
252b5132 1846 etree_type *address;
afd7a018
AM
1847
1848 if (!orphan_init_done)
1849 {
1850 struct orphan_save *ho;
1851 for (ho = hold; ho < hold + sizeof (hold) / sizeof (hold[0]); ++ho)
1852 if (ho->name != NULL)
1853 {
1854 ho->os = lang_output_section_find (ho->name);
1855 if (ho->os != NULL && ho->os->flags == 0)
1856 ho->os->flags = ho->flags;
1857 }
1858 orphan_init_done = 1;
1859 }
252b5132
RH
1860
1861 /* Try to put the new output section in a reasonable place based
1862 on the section name and section flags. */
aea4bd9d 1863
252b5132 1864 place = NULL;
5ba47421
AM
1865 if ((s->flags & SEC_ALLOC) == 0)
1866 ;
afd7a018
AM
1867 else if ((s->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
1868 place = &hold[orphan_bss];
1869 else if ((s->flags & SEC_READONLY) == 0)
1870 place = &hold[orphan_data];
1871 else if ((s->flags & SEC_CODE) == 0)
1872 place = &hold[orphan_rodata];
1af699f4 1873 else
afd7a018 1874 place = &hold[orphan_text];
1af699f4 1875
afd7a018 1876 after = NULL;
1af699f4
AM
1877 if (place != NULL)
1878 {
afd7a018
AM
1879 if (place->os == NULL)
1880 place->os = lang_output_section_find (place->name);
1881 after = place->os;
1882 if (after == NULL)
390fbbf1 1883 after = lang_output_section_find_by_flags (s, &place->os, NULL);
afd7a018
AM
1884 if (after == NULL)
1885 /* *ABS* is always the first output section statement. */
1886 after = (&lang_output_section_statement.head
1887 ->output_section_statement);
252b5132
RH
1888 }
1889
afd7a018
AM
1890 /* All sections in an executable must be aligned to a page boundary. */
1891 address = exp_unop (ALIGN_K, exp_nameop (NAME, "__section_alignment__"));
8a99a385
AM
1892 os = lang_insert_orphan (s, secname, constraint, after, place, address,
1893 &add_child);
252b5132
RH
1894 }
1895
011aa75f
AM
1896 /* If the section name has a '\$', sort it with the other '\$'
1897 sections. */
1898 for (pl = &os->children.head; *pl != NULL; pl = &(*pl)->header.next)
1899 {
1900 lang_input_section_type *ls;
1901 const char *lname;
252b5132 1902
011aa75f
AM
1903 if ((*pl)->header.type != lang_input_section_enum)
1904 continue;
252b5132 1905
011aa75f 1906 ls = &(*pl)->input_section;
252b5132 1907
011aa75f
AM
1908 lname = bfd_get_section_name (ls->section->owner, ls->section);
1909 if (strchr (lname, '\$') != NULL
1910 && (dollar == NULL || strcmp (orig_secname, lname) < 0))
1911 break;
1912 }
5ba47421 1913
011aa75f
AM
1914 if (add_child.head != NULL)
1915 {
1916 *add_child.tail = *pl;
1917 *pl = add_child.head;
1918 }
252b5132 1919
c2edb4b8 1920 return os;
252b5132
RH
1921}
1922
b34976b6 1923static bfd_boolean
0c7a8e5a 1924gld_${EMULATION_NAME}_open_dynamic_archive
d127ecce
AM
1925 (const char *arch ATTRIBUTE_UNUSED,
1926 search_dirs_type *search,
0c7a8e5a 1927 lang_input_statement_type *entry)
690a460e 1928{
45e948fe
NC
1929 static const struct
1930 {
1931 const char * format;
1932 bfd_boolean use_prefix;
1933 }
1934 libname_fmt [] =
1935 {
1936 /* Preferred explicit import library for dll's. */
1937 { "lib%s.dll.a", FALSE },
1938 /* Alternate explicit import library for dll's. */
1939 { "%s.dll.a", FALSE },
1940 /* "libfoo.a" could be either an import lib or a static lib.
1941 For backwards compatibility, libfoo.a needs to precede
1942 libfoo.dll and foo.dll in the search. */
1943 { "lib%s.a", FALSE },
92b93329 1944 /* The 'native' spelling of an import lib name is "foo.lib". */
45e948fe
NC
1945 { "%s.lib", FALSE },
1946#ifdef DLL_SUPPORT
1947 /* Try "<prefix>foo.dll" (preferred dll name, if specified). */
1948 { "%s%s.dll", TRUE },
1949#endif
1950 /* Try "libfoo.dll" (default preferred dll name). */
1951 { "lib%s.dll", FALSE },
1952 /* Finally try 'native' dll name "foo.dll". */
1953 { "%s.dll", FALSE },
1954 /* Note: If adding more formats to this table, make sure to check to
1955 see if their length is longer than libname_fmt[0].format, and if
1956 so, update the call to xmalloc() below. */
1957 { NULL, FALSE }
1958 };
b1d9458a 1959 static unsigned int format_max_len = 0;
690a460e 1960 const char * filename;
45e948fe
NC
1961 char * full_string;
1962 char * base_string;
1963 unsigned int i;
1964
690a460e
NC
1965
1966 if (! entry->is_archive)
b34976b6 1967 return FALSE;
690a460e
NC
1968
1969 filename = entry->filename;
1970
b1d9458a
NC
1971 if (format_max_len == 0)
1972 /* We need to allow space in the memory that we are going to allocate
1973 for the characters in the format string. Since the format array is
1974 static we only need to calculate this information once. In theory
1975 this value could also be computed statically, but this introduces
1976 the possibility for a discrepancy and hence a possible memory
1977 corruption. The lengths we compute here will be too long because
1978 they will include any formating characters (%s) in the strings, but
1979 this will not matter. */
1980 for (i = 0; libname_fmt[i].format; i++)
1981 if (format_max_len < strlen (libname_fmt[i].format))
1982 format_max_len = strlen (libname_fmt[i].format);
1983
45e948fe
NC
1984 full_string = xmalloc (strlen (search->name)
1985 + strlen (filename)
b1d9458a 1986 + format_max_len
b9a69188 1987#ifdef DLL_SUPPORT
45e948fe
NC
1988 + (pe_dll_search_prefix
1989 ? strlen (pe_dll_search_prefix) : 0)
b9a69188 1990#endif
b1d9458a
NC
1991 /* Allow for the terminating NUL and for the path
1992 separator character that is inserted between
1993 search->name and the start of the format string. */
1994 + 2);
690a460e 1995
45e948fe
NC
1996 sprintf (full_string, "%s/", search->name);
1997 base_string = full_string + strlen (full_string);
690a460e 1998
45e948fe 1999 for (i = 0; libname_fmt[i].format; i++)
690a460e 2000 {
92b93329 2001#ifdef DLL_SUPPORT
45e948fe 2002 if (libname_fmt[i].use_prefix)
1af699f4 2003 {
45e948fe
NC
2004 if (!pe_dll_search_prefix)
2005 continue;
2006 sprintf (base_string, libname_fmt[i].format, pe_dll_search_prefix, filename);
1af699f4 2007 }
45e948fe
NC
2008 else
2009#endif
2010 sprintf (base_string, libname_fmt[i].format, filename);
2011
2012 if (ldfile_try_open_bfd (full_string, entry))
2013 break;
2014 }
2015
2016 if (!libname_fmt[i].format)
2017 {
2018 free (full_string);
2019 return FALSE;
690a460e 2020 }
602e90d3 2021
45e948fe 2022 entry->filename = full_string;
690a460e 2023
b34976b6 2024 return TRUE;
690a460e
NC
2025}
2026
344a211f 2027static int
0c7a8e5a
AM
2028gld_${EMULATION_NAME}_find_potential_libraries
2029 (char *name, lang_input_statement_type *entry)
344a211f
NC
2030{
2031 return ldfile_open_file_search (name, entry, "", ".lib");
2032}
252b5132
RH
2033\f
2034static char *
0c7a8e5a 2035gld_${EMULATION_NAME}_get_script (int *isfile)
252b5132
RH
2036EOF
2037# Scripts compiled in.
2038# sed commands to quote an ld script as a C string.
597e2591 2039sc="-f stringify.sed"
252b5132 2040
92b93329 2041fragment <<EOF
3fc90ddb 2042{
252b5132
RH
2043 *isfile = 0;
2044
1049f94e 2045 if (link_info.relocatable && config.build_constructors)
252b5132
RH
2046 return
2047EOF
1af699f4
AM
2048sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
2049echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
2050sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
2051echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
2052sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
2053echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
2054sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
e2a83dd0
NC
2055if test -n "$GENERATE_AUTO_IMPORT_SCRIPT" ; then
2056echo ' ; else if (link_info.pei386_auto_import == 1) return' >> e${EMULATION_NAME}.c
2057sed $sc ldscripts/${EMULATION_NAME}.xa >> e${EMULATION_NAME}.c
2058fi
1af699f4
AM
2059echo ' ; else return' >> e${EMULATION_NAME}.c
2060sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
2061echo '; }' >> e${EMULATION_NAME}.c
252b5132 2062
92b93329 2063fragment <<EOF
252b5132
RH
2064
2065
3fc90ddb 2066struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
252b5132
RH
2067{
2068 gld_${EMULATION_NAME}_before_parse,
2069 syslib_default,
2070 hll_default,
2071 gld_${EMULATION_NAME}_after_parse,
2072 gld_${EMULATION_NAME}_after_open,
2073 after_allocation_default,
2074 set_output_arch_default,
2075 ldemul_default_target,
2076 gld_${EMULATION_NAME}_before_allocation,
2077 gld_${EMULATION_NAME}_get_script,
2078 "${EMULATION_NAME}",
2079 "${OUTPUT_FORMAT}",
4cd89863
NC
2080 gld_${EMULATION_NAME}_finish,
2081 NULL, /* Create output section statements. */
690a460e 2082 gld_${EMULATION_NAME}_open_dynamic_archive,
252b5132
RH
2083 gld_${EMULATION_NAME}_place_orphan,
2084 gld_${EMULATION_NAME}_set_symbols,
3bcf5557
AM
2085 NULL, /* parse_args */
2086 gld${EMULATION_NAME}_add_options,
2087 gld${EMULATION_NAME}_handle_option,
252b5132
RH
2088 gld_${EMULATION_NAME}_unrecognized_file,
2089 gld_${EMULATION_NAME}_list_options,
344a211f 2090 gld_${EMULATION_NAME}_recognized_file,
fac1652d 2091 gld_${EMULATION_NAME}_find_potential_libraries,
4cd89863 2092 NULL /* new_vers_pattern. */
252b5132
RH
2093};
2094EOF
This page took 0.528049 seconds and 4 git commands to generate.