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.
9if test "${RELOCATING}"; then
10  R_TEXT='*(.text$*)'
11  R_DATA='*(.data$*)'
12  R_RDATA='*(.rdata$*)'
13  R_IDATA='
14    *(.idata$2)
15    *(.idata$3)
16    /* These zeroes mark the end of the import list.  */
17    LONG (0); LONG (0); LONG (0); LONG (0); LONG (0);
18    *(.idata$4)
19    *(.idata$5)
20    *(.idata$6)
21    *(.idata$7)'
22  R_CRT='*(.CRT$*)'
23  R_RSRC='*(.rsrc$*)'
24  R_EXC='*(.exc$*)'
25else
26  R_TEXT=
27  R_DATA=
28  R_RDATA=
29  R_IDATA=
30  R_CRT=
31  R_RSRC=
32  R_EXC=
33fi
34
35cat <<EOF
36${RELOCATING+OUTPUT_FORMAT(${OUTPUT_FORMAT})}
37${RELOCATING-OUTPUT_FORMAT(${RELOCATEABLE_OUTPUT_FORMAT})}
38
39${LIB_SEARCH_DIRS}
40
41ENTRY(__start)
42${RELOCATING+header = .;}
43${RELOCATING+__fltused = .; /* set up floating pt for MS .obj\'s */}
44${RELOCATING+__ldused = .;}
45SECTIONS
46{
47  .text ${RELOCATING+ __image_base__ + __section_alignment__ } : 
48  {
49    ${RELOCATING+ __text_start__ = . ;}
50    ${RELOCATING+ *(.init)}
51    *(.text)
52    ${R_TEXT}
53    *(.glue_7t)
54    *(.glue_7)
55    ${CONSTRUCTING+ ___CTOR_LIST__ = .; __CTOR_LIST__ = . ; 
56			LONG (-1); *(.ctors); *(.ctor); LONG (0); }
57    ${CONSTRUCTING+ ___DTOR_LIST__ = .; __DTOR_LIST__ = . ; 
58			LONG (-1); *(.dtors); *(.dtor);  LONG (0); }
59    ${RELOCATING+ *(.fini)}
60    /* ??? Why is .gcc_exc here?  */
61    ${RELOCATING+ *(.gcc_exc)}
62    ${RELOCATING+ etext = .;}
63    ${RELOCATING+ __text_end__ = .;}
64    *(.gcc_except_table)
65  }
66
67  /* The Cygwin32 library uses a section to avoid copying certain data
68     on fork.  This used to be named ".data$nocopy".  The linker used
69     to include this between __data_start__ and __data_end__, but that
70     breaks building the cygwin32 dll.  Instead, we name the section
71     ".data_cygwin_nocopy" and explictly include it after __data_end__. */
72
73  .data ${RELOCATING+BLOCK(__section_alignment__)} : 
74  {
75    ${RELOCATING+__data_start__ = . ;}
76    *(.data)
77    *(.data2)
78    ${R_DATA}
79    ${RELOCATING+__data_end__ = . ;}
80    ${RELOCATING+*(.data_cygwin_nocopy)}
81  }
82
83  .bss ${RELOCATING+BLOCK(__section_alignment__)} :
84  {
85    ${RELOCATING+__bss_start__ = . ;}
86    *(.bss)
87    *(COMMON)
88    /* link.exe apparently pulls in .obj's because of UNDEF common
89	symbols, which is not the coff way, but that's MS for you. */
90    *(.CRT\$XCA)
91    *(.CRT\$XCZ)
92    *(.CRT\$XIA)
93    *(.CRT\$XIZ)
94    ${RELOCATING+__bss_end__ = . ;}
95  }
96
97  .rdata ${RELOCATING+BLOCK(__section_alignment__)} :
98  {
99    *(.rdata)
100    ${R_RDATA}
101    *(.eh_frame)
102  }
103
104  .edata ${RELOCATING+BLOCK(__section_alignment__)} :
105  {
106    *(.edata)
107  }
108
109  /DISCARD/ :
110  {
111    *(.debug\$S)
112    *(.debug\$T)
113    *(.debug\$F)
114    *(.drectve)
115    *(.debug*)
116  }
117
118  .idata ${RELOCATING+BLOCK(__section_alignment__)} :
119  {
120    /* This cannot currently be handled with grouped sections.
121	See pe.em:sort_sections.  */
122    ${R_IDATA}
123  }
124  .CRT ${RELOCATING+BLOCK(__section_alignment__)} :
125  { 					
126    ${R_CRT}
127  }
128
129  .endjunk ${RELOCATING+BLOCK(__section_alignment__)} :
130  {
131    /* end is deprecated, don't use it */
132    ${RELOCATING+ end = .;}
133    ${RELOCATING+ _end = .;}
134    ${RELOCATING+ __end__ = .;}
135  }
136
137  .reloc ${RELOCATING+BLOCK(__section_alignment__)} :
138  { 					
139    *(.reloc)
140  }
141
142  .rsrc ${RELOCATING+BLOCK(__section_alignment__)} :
143  { 					
144    *(.rsrc)
145    ${R_RSRC}
146  }
147
148  .exc ${RELOCATING+BLOCK(__section_alignment__)} :
149  { 					
150    *(.exc)
151    ${R_EXC}
152  }
153
154  .stab ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
155  {
156    [ .stab ]
157  }
158
159  .stabstr ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
160  {
161    [ .stabstr ]
162  }
163  /* DWARF debug sections.
164     Symbols in the DWARF debugging sections are relative to the beginning
165     of the section so we begin them at 0.  */
166
167  /* DWARF 1 */
168  .debug          0 ${RELOCATING+(NOLOAD)} : { *(.debug) }
169  .line           0 ${RELOCATING+(NOLOAD)} : { *(.line) }
170
171  /* GNU DWARF 1 extensions */
172  .debug_srcinfo  0 ${RELOCATING+(NOLOAD)} : { *(.debug_srcinfo) }
173  .debug_sfnames  0 ${RELOCATING+(NOLOAD)} : { *(.debug_sfnames) }
174
175  /* DWARF 1.1 and DWARF 2 */
176  .debug_aranges  0 ${RELOCATING+(NOLOAD)} : { *(.debug_aranges) }
177  .debug_pubnames 0 ${RELOCATING+(NOLOAD)} : { *(.debug_pubnames) }
178
179  /* DWARF 2 */
180  .debug_info     0 ${RELOCATING+(NOLOAD)} : { *(.debug_info) *(.gnu.linkonce.wi.*) }
181  .debug_abbrev   0 ${RELOCATING+(NOLOAD)} : { *(.debug_abbrev) }
182  .debug_line     0 ${RELOCATING+(NOLOAD)} : { *(.debug_line) }
183  .debug_frame    0 ${RELOCATING+(NOLOAD)} : { *(.debug_frame) }
184  .debug_str      0 ${RELOCATING+(NOLOAD)} : { *(.debug_str) }
185  .debug_loc      0 ${RELOCATING+(NOLOAD)} : { *(.debug_loc) }
186  .debug_macinfo  0 ${RELOCATING+(NOLOAD)} : { *(.debug_macinfo) }
187
188  /* SGI/MIPS DWARF 2 extensions */
189  .debug_weaknames 0 ${RELOCATING+(NOLOAD)} : { *(.debug_weaknames) }
190  .debug_funcnames 0 ${RELOCATING+(NOLOAD)} : { *(.debug_funcnames) }
191  .debug_typenames 0 ${RELOCATING+(NOLOAD)} : { *(.debug_typenames) }
192  .debug_varnames  0 ${RELOCATING+(NOLOAD)} : { *(.debug_varnames) }
193}
194EOF
195