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