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