Add initX, finiX, ctors, dtors sections to respect C++ constructor/destructor.
[binutils.git] / ld / scripttempl / mcorepe.sc
blob6f928aadd2d5cf51d68004efa6425c204f5d8767
1 # Linker script for MCore PE.
3 if test -z "${RELOCATEABLE_OUTPUT_FORMAT}"; then
4   RELOCATEABLE_OUTPUT_FORMAT=${OUTPUT_FORMAT}
5 fi
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).
14 if 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$*))'
29 else
30   R_TEXT=
31   R_DATA=
32   R_RDATA=
33   R_IDATA=
34   R_CRT=
35   R_RSRC=
38 if test "$RELOCATING"; then
39   # Can't use ${RELOCATING+blah "blah" blah} for this,
40   # because bash 2.x will lose the doublequotes.
41   cat <<EOF
42 OUTPUT_FORMAT("${OUTPUT_FORMAT}", "${BIG_OUTPUT_FORMAT}",
43                            "${LITTLE_OUTPUT_FORMAT}")
44 EOF
47 cat <<EOF
48 ${LIB_SEARCH_DIRS}
50 ENTRY(_mainCRTStartup)
52 SECTIONS
54   .text ${RELOCATING+ __image_base__ + __section_alignment__ } : 
55   {
56     ${RELOCATING+ *(.init)}
57     *(.text)
58     ${R_TEXT}
59     *(.glue_7t)
60     *(.glue_7)
61     ${CONSTRUCTING+ ___CTOR_LIST__ = .; __CTOR_LIST__ = . ; 
62                         LONG (-1); *(.ctors); *(.ctor); LONG (0); }
63     ${CONSTRUCTING+ ___DTOR_LIST__ = .; __DTOR_LIST__ = . ; 
64                         LONG (-1); *(.dtors); *(.dtor);  LONG (0); }
65     ${RELOCATING+ *(.fini)}
66     /* ??? Why is .gcc_exc here?  */
67     ${RELOCATING+ *(.gcc_exc)}
68     ${RELOCATING+ etext = .;}
69     *(.gcc_except_table)
70   }
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__. */
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   }
88   .bss ${RELOCATING+BLOCK(__section_alignment__)} :
89   {
90     ${RELOCATING+__bss_start__ = . ;}
91     *(.bss)
92     *(COMMON)
93     ${RELOCATING+__bss_end__ = . ;}
94   }
96   .rdata ${RELOCATING+BLOCK(__section_alignment__)} :
97   {
98     *(.rdata)
99     ${R_RDATA}
100     *(.eh_frame)
101   }
103   .edata ${RELOCATING+BLOCK(__section_alignment__)} :
104   {
105     *(.edata)
106   }
108   /DISCARD/ :
109   {
110     *(.debug\$S)
111     *(.debug\$T)
112     *(.debug\$F)
113     *(.drectve)
114   }
116   .idata ${RELOCATING+BLOCK(__section_alignment__)} :
117   {
118     /* This cannot currently be handled with grouped sections.
119         See pe.em:sort_sections.  */
120     ${R_IDATA}
121   }
122   .CRT ${RELOCATING+BLOCK(__section_alignment__)} :
123   {                                     
124     ${R_CRT}
125   }
127   .endjunk ${RELOCATING+BLOCK(__section_alignment__)} :
128   {
129     /* end is deprecated, don't use it */
130     ${RELOCATING+ end = .;}
131     ${RELOCATING+ _end = .;}
132     ${RELOCATING+ __end__ = .;}
133   }
135   .reloc ${RELOCATING+BLOCK(__section_alignment__)} :
136   {                                     
137     *(.reloc)
138   }
140   .rsrc ${RELOCATING+BLOCK(__section_alignment__)} :
141   {                                     
142     *(.rsrc)
143     ${R_RSRC}
144   }
146   .stab ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
147   {
148     [ .stab ]
149   }
151   .stabstr ${RELOCATING+BLOCK(__section_alignment__)} ${RELOCATING+(NOLOAD)} :
152   {
153     [ .stabstr ]
154   }
156   .stack 0x80000 :
157   {
158     _stack = .;
159     *(.stack)
160   }