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_RSRC='*(SORT(.rsrc$*))'
29else
30  R_TEXT=
31  R_DATA=
32  R_RDATA=
33  R_IDATA=
34  R_CRT=
35  R_RSRC=
36fi
37
38cat <<EOF
39${RELOCATING+OUTPUT_FORMAT(${OUTPUT_FORMAT})}
40${RELOCATING-OUTPUT_FORMAT(${RELOCATEABLE_OUTPUT_FORMAT})}
41
42${LIB_SEARCH_DIRS}
43
44ENTRY(_mainCRTStartup)
45
46SECTIONS
47{
48  .text ${RELOCATING+ __image_base__ + __section_alignment__ } : 
49  {
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    *(.gcc_except_table)
64
65    /* For EPOC the read only data is located at the end of the .text
66    section */
67    *(.rdata)
68    ${R_RDATA}
69    *(.eh_frame)
70  }
71
72  /* The Cygwin32 library uses a section to avoid copying certain data
73     on fork.  This used to be named ".data$nocopy".  The linker used
74     to include this between __data_start__ and __data_end__, but that
75     breaks building the cygwin32 dll.  Instead, we name the section
76     ".data_cygwin_nocopy" and explictly include it after __data_end__. */
77
78  .data ${RELOCATING+BLOCK(__section_alignment__)} : 
79  {
80    ${RELOCATING+__data_start__ = . ;}
81    *(.data)
82    *(.data2)
83    ${R_DATA}
84    ${RELOCATING+__data_end__ = . ;}
85    ${RELOCATING+*(.data_cygwin_nocopy)}
86  }
87
88  .bss ${RELOCATING+BLOCK(__section_alignment__)} :
89  {
90    ${RELOCATING+__bss_start__ = . ;}
91    *(.bss)
92    *(COMMON)
93    ${RELOCATING+__bss_end__ = . ;}
94  }
95
96  .edata ${RELOCATING+BLOCK(__section_alignment__)} :
97  {
98    *(.edata)
99  }
100
101  /DISCARD/ :
102  {
103    *(.debug\$S)
104    *(.debug\$T)
105    *(.debug\$F)
106    *(.drectve)
107  }
108
109  .idata ${RELOCATING+BLOCK(__section_alignment__)} :
110  {
111    /* This cannot currently be handled with grouped sections.
112	See pe.em:sort_sections.  */
113    ${R_IDATA}
114  }
115  
116  .CRT ${RELOCATING+BLOCK(__section_alignment__)} :
117  { 					
118    ${R_CRT}
119  }
120
121  .endjunk ${RELOCATING+BLOCK(__section_alignment__)} :
122  {
123    /* end is deprecated, don't use it */
124    ${RELOCATING+ end = .;}
125    ${RELOCATING+ _end = .;}
126    ${RELOCATING+ __end__ = .;}
127  }
128
129  .reloc ${RELOCATING+BLOCK(__section_alignment__)} :
130  { 					
131    *(.reloc)
132  }
133
134  .rsrc ${RELOCATING+BLOCK(__section_alignment__)} :
135  { 					
136    *(.rsrc)
137    ${R_RSRC}
138  }
139
140  .stab ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
141  {
142    [ .stab ]
143  }
144
145  .stabstr ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
146  {
147    [ .stabstr ]
148  }
149
150}
151EOF
152