1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
|
# A PE linker script for PowerPC.
# Loosely based on Steve Chamberlain's pe.sc.
# All new mistakes should be credited to Kim Knuttila (krk@cygnus.com)
#
# Copyright (C) 2014-2015 Free Software Foundation, Inc.
#
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved.
#
# These are substituted in as variables in order to get '}' in a shell
# conditional expansion.
INIT='.init : { *(.init) }'
FINI='.fini : { *(.fini) }'
cat <<EOF
/* Copyright (C) 2014-2015 Free Software Foundation, Inc.
Copying and distribution of this script, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. */
OUTPUT_FORMAT(${OUTPUT_FORMAT})
${LIB_SEARCH_DIRS}
/* Much of this layout was determined by delving into .exe files for
the box generated by other compilers/linkers/etc. This means that
if a particular feature did not happen to appear in one of the
subject files, then it may not be yet supported.
*/
/* It's "mainCRTStartup", not "_mainCRTStartup", and it's located in
one of the two .lib files (libc.lib and kernel32.lib) that currently
must be present on the link line. This means that you must use
"-u mainCRTStartup" to make sure it gets included in the link.
*/
${RELOCATING+ENTRY (mainCRTStartup)}
SECTIONS
{
/* text - the usual meaning */
.text ${RELOCATING+ __image_base__ + __section_alignment__ } :
{
${RELOCATING+ *(.init);}
*(.text)
${RELOCATING+ *(.text.*)}
*(.gcc_except_table)
${CONSTRUCTING+ ___CTOR_LIST__ = .; __CTOR_LIST__ = . ;
LONG (-1); *(.ctors); *(.ctor); LONG (0); }
${CONSTRUCTING+ ___DTOR_LIST__ = .; __DTOR_LIST__ = . ;
LONG (-1); *(.dtors); *(.dtor); LONG (0); }
${RELOCATING+ *(.fini);}
${RELOCATING+ etext = .};
}
/* rdata - Read Only Runtime Data
CTR sections: All of the CRT (read only C runtime data) sections
appear at the start of the .rdata (read only runtime data)
section, in the following order. Don't know if it matters or not.
Not all sections are always present either.
.rdata: compiler generated read only data
.xdata: compiler generated exception handling table. (Most docs
seem to suggest that this section is now deprecated infavor
of the ydata section)
.edata: The exported names table.
*/
.rdata BLOCK(__section_alignment__) :
{
*(.CRT\$XCA);
*(.CRT\$XCC);
*(.CRT\$XCZ);
*(.CRT\$XIA);
*(.CRT\$XIC);
*(.CRT\$XIZ);
*(.CRT\$XLA);
*(.CRT\$XLZ);
*(.CRT\$XPA);
*(.CRT\$XPX);
*(.CRT\$XPZ);
*(.CRT\$XTA);
*(.CRT\$XTZ);
*(.rdata);
*(.xdata);
}
.edata BLOCK(__section_alignment__) :
{
*(.edata);
}
/* data - initialized data
.ydata: exception handling information.
.data: the usual meaning.
.data2: more of the same.
.bss: For some reason, bss appears to be included in the data
section, as opposed to being given a section of it's own.
COMMON:
*/
.data BLOCK(__section_alignment__) :
{
__data_start__ = . ;
*(.ydata);
*(.data);
*(.data2);
__bss_start__ = . ;
*(.bss) ;
*(COMMON);
__bss_end__ = . ;
${RELOCATING+ end = .};
__data_end__ = . ;
}
/* The exception handling table. A sequence of 5 word entries. Section
address and extent are placed in the DataDirectory.
*/
.pdata BLOCK(__section_alignment__) :
{
*(.pdata)
;
}
/* The idata section is chock full of magic bits.
1. Boundaries around various idata parts are used to initialize
some of the fields of the DataDirectory. In particular, the
magic for 2, 4 and 5 are known to be used. Some compilers
appear to generate magic section symbols for this purpose.
Where we can, we catch such symbols and use our own. This of
course is something less than a perfect strategy.
2. The table of contents is placed immediately after idata4.
The ".private.toc" sections are generated by the ppc bfd. The
.toc variable is generated by gas, and resolved here. It is
used to initialized function descriptors (and anyone else who
needs the address of the module's toc). The only thing
interesting about it at all? Most ppc instructions using it
have a 16bit displacement field. The convention for addressing
is to initialize the .toc value to 32K past the start of the
actual toc, and subtract 32K from all references, thus using
the entire 64K range. Naturally, the reloc code must agree
on this number or you get pretty stupid results.
*/
.idata BLOCK(__section_alignment__) :
{
__idata2_magic__ = .;
*(.idata\$2);
__idata3_magic__ = .;
*(.idata\$3);
__idata4_magic__ = .;
*(.idata\$4);
. = ALIGN(4);
.toc = . + 32768;
*(.private.toc);
__idata5_magic__ = .;
*(.idata\$5);
__idata6_magic__ = .;
*(.idata\$6);
__idata7_magic__ = .;
*(.idata\$7);
;
}
/* reldata -- data that requires relocation
*/
.reldata BLOCK(__section_alignment__) :
{
*(.reldata)
;
}
/* Resources */
.rsrc BLOCK(__section_alignment__) :
{
*(.rsrc\$01)
*(.rsrc\$02)
;
}
.stab BLOCK(__section_alignment__) ${RELOCATING+(NOLOAD)} :
{
[ .stab ]
}
.stabstr BLOCK(__section_alignment__) ${RELOCATING+(NOLOAD)} :
{
[ .stabstr ]
}
/* The .reloc section is currently generated by the dlltool from Steve
Chamberlain in a second pass of linking. Section address and extent
are placed in the DataDirectory.
*/
.reloc BLOCK(__section_alignment__) :
{
*(.reloc)
;
}
/* We don't do anything useful with codeview debugger support or the
directive section (yet). Hopefully, we junk them correctly.
*/
/DISCARD/ BLOCK(__section_alignment__) :
{
*(.debug\$S)
*(.debug\$T)
*(.debug\$F)
*(.drectve)
;
}
}
EOF
|