1# Linker script for PE.
2
3if test -z "${RELOCATEABLE_OUTPUT_FORMAT}"; then
4  RELOCATEABLE_OUTPUT_FORMAT=${OUTPUT_FORMAT}
5fi
6
7# We can't easily and portably get an unquoted $ in a shell
8# substitution, so we do this instead.
9# Sorting of the .foo$* sections is required by the definition of
10# grouped sections in PE.
11# Sorting of the file names in R_IDATA is required by the
12# current implementation of dlltool (this could probably be changed to
13# use grouped sections instead).
14if test "${RELOCATING}"; then
15  R_TEXT='*(SORT(.text$*))'
16  R_DATA='*(SORT(.data$*))'
17  R_RDATA='*(SORT(.rdata$*))'
18  R_IDATA='
19    SORT(*)(.idata$2)
20    SORT(*)(.idata$3)
21    /* These zeroes mark the end of the import list.  */
22    LONG (0); LONG (0); LONG (0); LONG (0); LONG (0);
23    SORT(*)(.idata$4)
24    SORT(*)(.idata$5)
25    SORT(*)(.idata$6)
26    SORT(*)(.idata$7)'
27  R_CRT='*(SORT(.CRT$*))'
28  R_TLS='
29    *(.tls)
30    *(.tls$)
31    *(SORT(.tls$*))'
32  R_RSRC='*(SORT(.rsrc$*))'
33else
34  R_TEXT=
35  R_DATA=
36  R_RDATA=
37  R_IDATA=
38  R_CRT=
39  R_RSRC=
40fi
41
42cat <<EOF
43${RELOCATING+OUTPUT_FORMAT(${OUTPUT_FORMAT})}
44${RELOCATING-OUTPUT_FORMAT(${RELOCATEABLE_OUTPUT_FORMAT})}
45${OUTPUT_ARCH+OUTPUT_ARCH(${OUTPUT_ARCH})}
46
47${LIB_SEARCH_DIRS}
48
49ENTRY(${ENTRY})
50
51SECTIONS
52{
53  .text ${RELOCATING+ __image_base__ + __section_alignment__ } :
54  {
55    ${RELOCATING+ *(.init)}
56    *(.text)
57    ${R_TEXT}
58    *(.glue_7t)
59    *(.glue_7)
60    ${CONSTRUCTING+ ___CTOR_LIST__ = .; __CTOR_LIST__ = . ;
61			LONG (-1); *(SORT(.ctors.*)); *(.ctors); *(.ctor); LONG (0); }
62    ${CONSTRUCTING+ ___DTOR_LIST__ = .; __DTOR_LIST__ = . ;
63			LONG (-1); *(SORT(.dtors.*)); *(.dtors); *(.dtor);  LONG (0); }
64    ${RELOCATING+ *(.fini)}
65    /* ??? Why is .gcc_exc here?  */
66    ${RELOCATING+ *(.gcc_exc)}
67    ${RELOCATING+PROVIDE (etext = .);}
68    *(.gcc_except_table)
69  }
70
71  /* The Cygwin32 library uses a section to avoid copying certain data
72     on fork.  This used to be named ".data$nocopy".  The linker used
73     to include this between __data_start__ and __data_end__, but that
74     breaks building the cygwin32 dll.  Instead, we name the section
75     ".data_cygwin_nocopy" and explictly include it after __data_end__. */
76
77  .data ${RELOCATING+BLOCK(__section_alignment__)} :
78  {
79    ${RELOCATING+__data_start__ = . ;}
80    *(.data)
81    *(.data2)
82    ${R_DATA}
83    ${RELOCATING+__data_end__ = . ;}
84    ${RELOCATING+*(.data_cygwin_nocopy)}
85  }
86
87  .rdata ${RELOCATING+BLOCK(__section_alignment__)} :
88  {
89    *(.rdata)
90    ${R_RDATA}
91    *(.eh_frame)
92    ${RELOCATING+___RUNTIME_PSEUDO_RELOC_LIST__ = .;}
93    ${RELOCATING+__RUNTIME_PSEUDO_RELOC_LIST__ = .;}
94    *(.rdata_runtime_pseudo_reloc)
95    ${RELOCATING+___RUNTIME_PSEUDO_RELOC_LIST_END__ = .;}
96    ${RELOCATING+__RUNTIME_PSEUDO_RELOC_LIST_END__ = .;}
97  }
98
99  .pdata ${RELOCATING+BLOCK(__section_alignment__)} :
100  {
101    *(.pdata)
102  }
103
104  .bss ${RELOCATING+BLOCK(__section_alignment__)} :
105  {
106    ${RELOCATING+__bss_start__ = . ;}
107    *(.bss)
108    *(COMMON)
109    ${RELOCATING+__bss_end__ = . ;}
110  }
111
112  .edata ${RELOCATING+BLOCK(__section_alignment__)} :
113  {
114    *(.edata)
115  }
116
117  /DISCARD/ :
118  {
119    *(.debug\$S)
120    *(.debug\$T)
121    *(.debug\$F)
122    *(.drectve)
123  }
124
125  .idata ${RELOCATING+BLOCK(__section_alignment__)} :
126  {
127    /* This cannot currently be handled with grouped sections.
128	See pe.em:sort_sections.  */
129    ${R_IDATA}
130  }
131  .CRT ${RELOCATING+BLOCK(__section_alignment__)} :
132  {
133    ${R_CRT}
134  }
135
136  .tls ${RELOCATING+BLOCK(__section_alignment__)} :
137  {
138    ${R_TLS}
139  }
140
141  .endjunk ${RELOCATING+BLOCK(__section_alignment__)} :
142  {
143    /* end is deprecated, don't use it */
144    ${RELOCATING+PROVIDE (end = .);}
145    ${RELOCATING+PROVIDE ( _end = .);}
146    ${RELOCATING+ __end__ = .;}
147  }
148
149  .rsrc ${RELOCATING+BLOCK(__section_alignment__)} :
150  {
151    *(.rsrc)
152    ${R_RSRC}
153  }
154
155  .reloc ${RELOCATING+BLOCK(__section_alignment__)} :
156  {
157    *(.reloc)
158  }
159
160  .stab ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
161  {
162    [ .stab ]
163  }
164
165  .stabstr ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
166  {
167    [ .stabstr ]
168  }
169
170}
171EOF
172