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