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