1
# This shell script emits a C file. -*- C -*-
2
# It does some substitutions.
3
if [ -z "$MACHINE" ]; then
6
OUTPUT_ARCH=${ARCH}:${MACHINE}
9
/* This file is part of GLD, the Gnu Linker.
10
Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
11
2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
13
This file is part of the GNU Binutils.
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 3 of the License, or
18
(at your option) any later version.
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.
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., 51 Franklin Street - Fifth Floor, Boston,
28
MA 02110-1301, USA. */
32
/* The original file generated returned different default scripts depending
33
on whether certain switches were set, but these switches pertain to the
34
Linux system and that particular version of coff. In the NT case, we
35
only determine if the subsystem is console or windows in order to select
36
the correct entry point by default. */
42
#include "libiberty.h"
43
#include "filenames.h"
54
#include "coff/internal.h"
55
#include "../bfd/libcoff.h"
57
#define TARGET_IS_${EMULATION_NAME}
59
static struct internal_extra_pe_aouthdr pe;
62
extern const char *output_filename;
65
gld_${EMULATION_NAME}_before_parse (void)
67
ldfile_set_output_arch ("${OUTPUT_ARCH}", bfd_arch_`echo ${ARCH} | sed -e 's/:.*//'`);
68
output_filename = "a.exe";
71
/* PE format extra command line options. */
73
/* Used for setting flags in the PE header. */
74
#define OPTION_BASE_FILE (300 + 1)
75
#define OPTION_DLL (OPTION_BASE_FILE + 1)
76
#define OPTION_FILE_ALIGNMENT (OPTION_DLL + 1)
77
#define OPTION_IMAGE_BASE (OPTION_FILE_ALIGNMENT + 1)
78
#define OPTION_MAJOR_IMAGE_VERSION (OPTION_IMAGE_BASE + 1)
79
#define OPTION_MAJOR_OS_VERSION (OPTION_MAJOR_IMAGE_VERSION + 1)
80
#define OPTION_MAJOR_SUBSYSTEM_VERSION (OPTION_MAJOR_OS_VERSION + 1)
81
#define OPTION_MINOR_IMAGE_VERSION (OPTION_MAJOR_SUBSYSTEM_VERSION + 1)
82
#define OPTION_MINOR_OS_VERSION (OPTION_MINOR_IMAGE_VERSION + 1)
83
#define OPTION_MINOR_SUBSYSTEM_VERSION (OPTION_MINOR_OS_VERSION + 1)
84
#define OPTION_SECTION_ALIGNMENT (OPTION_MINOR_SUBSYSTEM_VERSION + 1)
85
#define OPTION_STACK (OPTION_SECTION_ALIGNMENT + 1)
86
#define OPTION_SUBSYSTEM (OPTION_STACK + 1)
87
#define OPTION_HEAP (OPTION_SUBSYSTEM + 1)
90
gld${EMULATION_NAME}_add_options
91
(int ns ATTRIBUTE_UNUSED, char **shortopts ATTRIBUTE_UNUSED, int nl,
92
struct option **longopts, int nrl ATTRIBUTE_UNUSED,
93
struct option **really_longopts ATTRIBUTE_UNUSED)
95
static const struct option xtra_long[] = {
97
{"base-file", required_argument, NULL, OPTION_BASE_FILE},
98
{"dll", no_argument, NULL, OPTION_DLL},
99
{"file-alignment", required_argument, NULL, OPTION_FILE_ALIGNMENT},
100
{"heap", required_argument, NULL, OPTION_HEAP},
101
{"image-base", required_argument, NULL, OPTION_IMAGE_BASE},
102
{"major-image-version", required_argument, NULL, OPTION_MAJOR_IMAGE_VERSION},
103
{"major-os-version", required_argument, NULL, OPTION_MAJOR_OS_VERSION},
104
{"major-subsystem-version", required_argument, NULL, OPTION_MAJOR_SUBSYSTEM_VERSION},
105
{"minor-image-version", required_argument, NULL, OPTION_MINOR_IMAGE_VERSION},
106
{"minor-os-version", required_argument, NULL, OPTION_MINOR_OS_VERSION},
107
{"minor-subsystem-version", required_argument, NULL, OPTION_MINOR_SUBSYSTEM_VERSION},
108
{"section-alignment", required_argument, NULL, OPTION_SECTION_ALIGNMENT},
109
{"stack", required_argument, NULL, OPTION_STACK},
110
{"subsystem", required_argument, NULL, OPTION_SUBSYSTEM},
111
{NULL, no_argument, NULL, 0}
114
*longopts = (struct option *)
115
xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
116
memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
120
/* PE/WIN32; added routines to get the subsystem type, heap and/or stack
121
parameters which may be input from the command line */
131
#define D(field,symbol,def) {&pe.field,sizeof(pe.field), def, symbol,0}
133
static definfo init[] =
135
/* imagebase must be first */
136
#define IMAGEBASEOFF 0
137
D(ImageBase,"__image_base__", BEOS_EXE_IMAGE_BASE),
139
{&dll, sizeof(dll), 0, "__dll__", 0},
140
D(SectionAlignment,"__section_alignment__", PE_DEF_SECTION_ALIGNMENT),
141
D(FileAlignment,"__file_alignment__", PE_DEF_FILE_ALIGNMENT),
142
D(MajorOperatingSystemVersion,"__major_os_version__", 4),
143
D(MinorOperatingSystemVersion,"__minor_os_version__", 0),
144
D(MajorImageVersion,"__major_image_version__", 1),
145
D(MinorImageVersion,"__minor_image_version__", 0),
146
D(MajorSubsystemVersion,"__major_subsystem_version__", 4),
147
D(MinorSubsystemVersion,"__minor_subsystem_version__", 0),
148
D(Subsystem,"__subsystem__", 3),
149
D(SizeOfStackReserve,"__size_of_stack_reserve__", 0x2000000),
150
D(SizeOfStackCommit,"__size_of_stack_commit__", 0x1000),
151
D(SizeOfHeapReserve,"__size_of_heap_reserve__", 0x100000),
152
D(SizeOfHeapCommit,"__size_of_heap_commit__", 0x1000),
153
D(LoaderFlags,"__loader_flags__", 0x0),
154
{ NULL, 0, 0, NULL, 0 }
159
set_pe_name (char *name, long val)
162
/* Find the name and set it. */
163
for (i = 0; init[i].ptr; i++)
165
if (strcmp (name, init[i].symbol) == 0)
177
set_pe_subsystem (void)
190
{ "native", 1, "_NtProcessStartup" },
191
{ "windows", 2, "_WinMainCRTStartup" },
192
{ "wwindows", 2, "_wWinMainCRTStartup" },
193
{ "console", 3, "_mainCRTStartup" },
194
{ "wconsole", 3, "_wmainCRTStartup" },
195
{ "posix", 7, "___PosixProcessStartup"},
199
sver = strchr (optarg, ':');
201
len = strlen (optarg);
207
set_pe_name ("__major_subsystem_version__",
208
strtoul (sver + 1, &end, 0));
210
set_pe_name ("__minor_subsystem_version__",
211
strtoul (end + 1, &end, 0));
213
einfo ("%P: warning: bad version number in -subsystem option\n");
216
for (i = 0; v[i].name; i++)
218
if (strncmp (optarg, v[i].name, len) == 0
219
&& v[i].name[len] == '\0')
221
set_pe_name ("__subsystem__", v[i].value);
223
/* If the subsystem is windows, we use a different entry
225
lang_default_entry (v[i].entry);
230
einfo ("%P%F: invalid subsystem type %s\n", optarg);
235
set_pe_value (char *name)
238
set_pe_name (name, strtoul (optarg, &end, 0));
241
einfo ("%P%F: invalid hex number for PE parameter '%s'\n", optarg);
248
set_pe_stack_heap (char *resname, char *comname)
250
set_pe_value (resname);
254
set_pe_value (comname);
258
einfo ("%P%F: strange hex info for PE parameter '%s'\n", optarg);
264
gld${EMULATION_NAME}_handle_option (int optc)
271
case OPTION_BASE_FILE:
272
link_info.base_file = fopen (optarg, FOPEN_WB);
273
if (link_info.base_file == NULL)
274
einfo (_("%F%P: cannot open base file %s\n"), optarg);
279
set_pe_stack_heap ("__size_of_heap_reserve__", "__size_of_heap_commit__");
282
set_pe_stack_heap ("__size_of_stack_reserve__", "__size_of_stack_commit__");
284
case OPTION_SUBSYSTEM:
287
case OPTION_MAJOR_OS_VERSION:
288
set_pe_value ("__major_os_version__");
290
case OPTION_MINOR_OS_VERSION:
291
set_pe_value ("__minor_os_version__");
293
case OPTION_MAJOR_SUBSYSTEM_VERSION:
294
set_pe_value ("__major_subsystem_version__");
296
case OPTION_MINOR_SUBSYSTEM_VERSION:
297
set_pe_value ("__minor_subsystem_version__");
299
case OPTION_MAJOR_IMAGE_VERSION:
300
set_pe_value ("__major_image_version__");
302
case OPTION_MINOR_IMAGE_VERSION:
303
set_pe_value ("__minor_image_version__");
305
case OPTION_FILE_ALIGNMENT:
306
set_pe_value ("__file_alignment__");
308
case OPTION_SECTION_ALIGNMENT:
309
set_pe_value ("__section_alignment__");
312
set_pe_name ("__dll__", 1);
314
case OPTION_IMAGE_BASE:
315
set_pe_value ("__image_base__");
321
/* Assign values to the special symbols before the linker script is
325
gld_${EMULATION_NAME}_set_symbols (void)
327
/* Run through and invent symbols for all the
328
names and insert the defaults. */
331
if (!init[IMAGEBASEOFF].inited)
333
if (link_info.relocatable)
334
init[IMAGEBASEOFF].value = 0;
335
else if (init[DLLOFF].value)
336
init[IMAGEBASEOFF].value = BEOS_DLL_IMAGE_BASE;
338
init[IMAGEBASEOFF].value = BEOS_EXE_IMAGE_BASE;
341
/* Don't do any symbol assignments if this is a relocatable link. */
342
if (link_info.relocatable)
345
/* Glue the assignments into the abs section */
346
push_stat_ptr (&abs_output_section->children);
348
for (j = 0; init[j].ptr; j++)
350
long val = init[j].value;
351
lang_add_assignment (exp_assign (init[j].symbol, exp_intop (val),
353
if (init[j].size == sizeof(short))
354
*(short *)init[j].ptr = val;
355
else if (init[j].size == sizeof(int))
356
*(int *)init[j].ptr = val;
357
else if (init[j].size == sizeof(long))
358
*(long *)init[j].ptr = val;
359
/* This might be a long long or other special type. */
360
else if (init[j].size == sizeof(bfd_vma))
361
*(bfd_vma *)init[j].ptr = val;
364
/* Restore the pointer. */
367
if (pe.FileAlignment >
370
einfo ("%P: warning, file alignment > section alignment.\n");
375
gld_${EMULATION_NAME}_after_open (void)
377
after_open_default ();
379
/* Pass the wacky PE command line options into the output bfd.
380
FIXME: This should be done via a function, rather than by
381
including an internal BFD header. */
382
if (!coff_data(link_info.output_bfd)->pe)
384
einfo ("%F%P: PE operations on non PE file.\n");
387
pe_data(link_info.output_bfd)->pe_opthdr = pe;
388
pe_data(link_info.output_bfd)->dll = init[DLLOFF].value;
392
/* Callback functions for qsort in sort_sections. */
395
sort_by_file_name (const void *a, const void *b)
397
const lang_statement_union_type *const *ra = a;
398
const lang_statement_union_type *const *rb = b;
401
i = filename_cmp ((*ra)->input_section.section->owner->my_archive->filename,
402
(*rb)->input_section.section->owner->my_archive->filename);
406
i = filename_cmp ((*ra)->input_section.section->owner->filename,
407
(*rb)->input_section.section->owner->filename);
410
/* the tail idata4/5 are the only ones without relocs to an
411
idata$6 section unless we are importing by ordinal,
412
so sort them to last to terminate the IAT
413
and HNT properly. if no reloc this one is import by ordinal
414
so we have to sort by section contents */
416
if ( ((*ra)->input_section.section->reloc_count + (*rb)->input_section.section->reloc_count) )
418
i = (((*ra)->input_section.section->reloc_count >
419
(*rb)->input_section.section->reloc_count) ? -1 : 0);
423
return (((*ra)->input_section.section->reloc_count >
424
(*rb)->input_section.section->reloc_count) ? 0 : 1);
428
if ( (strcmp( (*ra)->input_section.section->name, ".idata$6") == 0) )
429
return 0; /* don't sort .idata$6 or .idata$7 FIXME dlltool eliminate .idata$7 */
431
if (! bfd_get_section_contents ((*ra)->input_section.section->owner,
432
(*ra)->input_section.section, &a_sec, (file_ptr) 0, (bfd_size_type)sizeof(a_sec)))
433
einfo ("%F%B: Can't read contents of section .idata: %E\n",
434
(*ra)->input_section.section->owner);
436
if (! bfd_get_section_contents ((*rb)->input_section.section->owner,
437
(*rb)->input_section.section, &b_sec, (file_ptr) 0, (bfd_size_type)sizeof(b_sec) ))
438
einfo ("%F%B: Can't read contents of section .idata: %E\n",
439
(*rb)->input_section.section->owner);
441
i = ((a_sec < b_sec) ? -1 : 0);
444
return ((a_sec < b_sec) ? 0 : 1);
450
sort_by_section_name (const void *a, const void *b)
452
const lang_statement_union_type *const *ra = a;
453
const lang_statement_union_type *const *rb = b;
455
i = strcmp ((*ra)->input_section.section->name,
456
(*rb)->input_section.section->name);
457
/* This is a hack to make .stab and .stabstr last, so we don't have
458
to fix strip/objcopy for .reloc sections.
459
FIXME stripping images with a .rsrc section still needs to be fixed. */
462
if ((CONST_STRNEQ ((*ra)->input_section.section->name, ".stab"))
463
&& (! CONST_STRNEQ ((*rb)->input_section.section->name, ".stab")))
469
/* Subroutine of sort_sections to a contiguous subset of a list of sections.
470
NEXT_AFTER is the element after the last one to sort.
471
The result is a pointer to the last element's "next" pointer. */
473
static lang_statement_union_type **
474
sort_sections_1 (lang_statement_union_type **startptr,
475
lang_statement_union_type *next_after,
477
int (*sort_func) (const void *, const void *))
479
lang_statement_union_type **vec;
480
lang_statement_union_type *p;
482
lang_statement_union_type **ret;
487
vec = ((lang_statement_union_type **)
488
xmalloc (count * sizeof (lang_statement_union_type *)));
490
for (p = *startptr, i = 0; i < count; i++, p = p->header.next)
493
qsort (vec, count, sizeof (vec[0]), sort_func);
495
/* Fill in the next pointers again. */
497
for (i = 0; i < count - 1; i++)
498
vec[i]->header.next = vec[i + 1];
499
vec[i]->header.next = next_after;
500
ret = &vec[i]->header.next;
505
/* Sort the .idata\$foo input sections of archives into filename order.
506
The reason is so dlltool can arrange to have the pe dll import information
507
generated correctly - the head of the list goes into dh.o, the tail into
508
dt.o, and the guts into ds[nnnn].o. Note that this is only needed for the
510
FIXME: This may no longer be necessary with grouped sections. Instead of
511
sorting on dh.o, ds[nnnn].o, dt.o, one could, for example, have dh.o use
512
.idata\$4h, have ds[nnnn].o use .idata\$4s[nnnn], and have dt.o use .idata\$4t.
513
This would have to be elaborated upon to handle multiple dll's
514
[assuming such an eloboration is possible of course].
516
We also sort sections in '\$' wild statements. These are created by the
517
place_orphans routine to implement grouped sections. */
520
sort_sections (lang_statement_union_type *s)
522
for (; s ; s = s->header.next)
523
switch (s->header.type)
525
case lang_output_section_statement_enum:
526
sort_sections (s->output_section_statement.children.head);
528
case lang_wild_statement_enum:
530
lang_statement_union_type **p = &s->wild_statement.children.head;
531
struct wildcard_list *sec;
533
for (sec = s->wild_statement.section_list; sec; sec = sec->next)
535
/* Is this the .idata section? */
536
if (sec->spec.name != NULL
537
&& CONST_STRNEQ (sec->spec.name, ".idata"))
539
/* Sort the children. We want to sort any objects in
540
the same archive. In order to handle the case of
541
including a single archive multiple times, we sort
542
all the children by archive name and then by object
543
name. After sorting them, we re-thread the pointer
548
lang_statement_union_type *start = *p;
549
if (start->header.type != lang_input_section_enum
550
|| !start->input_section.section->owner->my_archive)
551
p = &(start->header.next);
554
lang_statement_union_type *end;
557
for (end = start, count = 0;
558
end && (end->header.type
559
== lang_input_section_enum);
560
end = end->header.next)
563
p = sort_sections_1 (p, end, count,
570
/* If this is a collection of grouped sections, sort them.
571
The linker script must explicitly mention "*(.foo\$)" or
572
"*(.foo\$*)". Don't sort them if \$ is not the last
573
character (not sure if this is really useful, but it
574
allows explicitly mentioning some \$ sections and letting
575
the linker handle the rest). */
576
if (sec->spec.name != NULL)
578
char *q = strchr (sec->spec.name, '\$');
582
|| (q[1] == '*' && q[2] == '\0')))
584
lang_statement_union_type *end;
587
for (end = *p, count = 0; end; end = end->header.next)
589
if (end->header.type != lang_input_section_enum)
593
(void) sort_sections_1 (p, end, count,
594
sort_by_section_name);
607
gld_${EMULATION_NAME}_before_allocation (void)
609
#ifdef TARGET_IS_ppcpe
610
/* Here we rummage through the found bfds to collect toc information */
612
LANG_FOR_EACH_INPUT_STATEMENT (is)
614
if (!ppc_process_before_allocation(is->the_bfd, &link_info))
616
einfo("Errors encountered processing file %s\n", is->filename);
621
/* We have seen it all. Allocate it, and carry on */
622
ppc_allocate_toc_section (&link_info);
624
#ifdef TARGET_IS_armpe
625
/* FIXME: we should be able to set the size of the interworking stub
628
Here we rummage through the found bfds to collect glue
629
information. FIXME: should this be based on a command line
630
option? krk@cygnus.com */
632
LANG_FOR_EACH_INPUT_STATEMENT (is)
634
if (!arm_process_before_allocation (is->the_bfd, & link_info))
636
einfo ("Errors encountered processing file %s", is->filename);
641
/* We have seen it all. Allocate it, and carry on */
642
arm_allocate_interworking_sections (& link_info);
643
#endif /* TARGET_IS_armpe */
644
#endif /* TARGET_IS_ppcpe */
646
sort_sections (stat_ptr->head);
648
before_allocation_default ();
651
/* Place an orphan section. We use this to put sections with a '\$' in them
652
into the right place. Any section with a '\$' in them (e.g. .text\$foo)
653
gets mapped to the output section with everything from the '\$' on stripped
655
See the Microsoft Portable Executable and Common Object File Format
656
Specification 4.1, section 4.2, Grouped Sections.
658
FIXME: This is now handled by the linker script using wildcards,
659
but I'm leaving this here in case we want to enable it for sections
660
which are not mentioned in the linker script. */
662
static lang_output_section_statement_type *
663
gld${EMULATION_NAME}_place_orphan (asection *s,
667
char *output_secname, *ps;
668
lang_output_section_statement_type *os;
669
lang_statement_union_type *l;
671
if ((s->flags & SEC_ALLOC) == 0)
674
/* Don't process grouped sections unless doing a final link.
675
If they're marked as COMDAT sections, we don't want .text\$foo to
676
end up in .text and then have .text disappear because it's marked
677
link-once-discard. */
678
if (link_info.relocatable)
681
/* Everything from the '\$' on gets deleted so don't allow '\$' as the
683
if (*secname == '\$')
684
einfo ("%P%F: section %s has '\$' as first character\n", secname);
685
if (strchr (secname + 1, '\$') == NULL)
688
/* Look up the output section. The Microsoft specs say sections names in
689
image files never contain a '\$'. Fortunately, lang_..._lookup creates
690
the section if it doesn't exist. */
691
output_secname = xstrdup (secname);
692
ps = strchr (output_secname + 1, '\$');
694
os = lang_output_section_statement_lookup (output_secname, constraint, TRUE);
696
/* Find the '\$' wild statement for this section. We currently require the
697
linker script to explicitly mention "*(.foo\$)".
698
FIXME: ppcpe.sc has .CRT\$foo in the .rdata section. According to the
699
Microsoft docs this isn't correct so it's not (currently) handled. */
703
for (l = os->children.head; l; l = l->header.next)
704
if (l->header.type == lang_wild_statement_enum)
706
struct wildcard_list *sec;
708
for (sec = l->wild_statement.section_list; sec; sec = sec->next)
709
if (sec->spec.name && strcmp (sec->spec.name, output_secname) == 0)
716
einfo ("%P%F: *(%s\$) missing from linker script\n", output_secname);
718
/* Link the input section in and we're done for now.
719
The sections still have to be sorted, but that has to wait until
720
all such sections have been processed by us. The sorting is done by
722
lang_add_section (&l->wild_statement.children, s, NULL, os);
728
gld_${EMULATION_NAME}_get_script (int *isfile)
730
# Scripts compiled in.
731
# sed commands to quote an ld script as a C string.
732
sc="-f stringify.sed"
738
if (link_info.relocatable && config.build_constructors)
741
sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
742
echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c
743
sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
744
echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
745
sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
746
echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
747
sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
748
echo ' ; else return' >> e${EMULATION_NAME}.c
749
sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
750
echo '; }' >> e${EMULATION_NAME}.c
755
struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
757
gld_${EMULATION_NAME}_before_parse,
761
gld_${EMULATION_NAME}_after_open,
762
after_allocation_default,
763
set_output_arch_default,
764
ldemul_default_target,
765
gld_${EMULATION_NAME}_before_allocation,
766
gld_${EMULATION_NAME}_get_script,
770
NULL, /* create output section statements */
771
NULL, /* open dynamic archive */
772
gld${EMULATION_NAME}_place_orphan,
773
gld_${EMULATION_NAME}_set_symbols,
774
NULL, /* parse_args */
775
gld${EMULATION_NAME}_add_options,
776
gld${EMULATION_NAME}_handle_option,
777
NULL, /* unrecognized file */
778
NULL, /* list options */
779
NULL, /* recognized file */
780
NULL, /* find_potential_libraries */
781
NULL /* new_vers_pattern */