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