nds32elf.sc 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. # Copyright (C) 2014-2022 Free Software Foundation, Inc.
  2. #
  3. # Copying and distribution of this file, with or without modification,
  4. # are permitted in any medium without royalty provided the copyright
  5. # notice and this notice are preserved.
  6. # This file is variant of elf.sc. For nds32, because the data will be
  7. # classified into different sections according to their size, this script
  8. # describe these sections map. The order is ".sdata_d, .sdata_w, .sdata_h,
  9. # .sdata_b, , sdata_f, .sbss_f, .sbss_b, .sbss_h, .sbss_w, .sbss_d". In
  10. # this order we do not have to consider the alignment issue between these
  11. # sections.
  12. if test -n "$NOP"; then
  13. FILL="=$NOP"
  14. else
  15. FILL=
  16. fi
  17. test -z "$RODATA_NAME" && RODATA_NAME=rodata
  18. test -z "$SDATA_NAME" && SDATA_NAME=sdata
  19. test -z "$SBSS_NAME" && SBSS_NAME=sbss
  20. test -z "$BSS_NAME" && BSS_NAME=bss
  21. test -z "$ENTRY" && ENTRY=${USER_LABEL_PREFIX}_start
  22. test -z "${BIG_OUTPUT_FORMAT}" && BIG_OUTPUT_FORMAT=${OUTPUT_FORMAT}
  23. test -z "${LITTLE_OUTPUT_FORMAT}" && LITTLE_OUTPUT_FORMAT=${OUTPUT_FORMAT}
  24. if [ -z "$MACHINE" ]; then OUTPUT_ARCH=${ARCH}; else OUTPUT_ARCH=${ARCH}:${MACHINE}; fi
  25. test -z "${ELFSIZE}" && ELFSIZE=32
  26. test -z "${ALIGNMENT}" && ALIGNMENT="${ELFSIZE} / 8"
  27. test "$LD_FLAG" = "N" && DATA_ADDR=.
  28. test -z "${ETEXT_NAME}" && ETEXT_NAME=${USER_LABEL_PREFIX}etext
  29. test -n "$CREATE_SHLIB$CREATE_PIE" && test -n "$SHLIB_DATA_ADDR" && COMMONPAGESIZE=""
  30. test -z "$CREATE_SHLIB$CREATE_PIE" && test -n "$DATA_ADDR" && COMMONPAGESIZE=""
  31. test -n "$RELRO_NOW" && unset SEPARATE_GOTPLT
  32. test -z "$ATTRS_SECTIONS" && ATTRS_SECTIONS=".gnu.attributes 0 : { KEEP (*(.gnu.attributes)) }"
  33. DATA_SEGMENT_ALIGN="ALIGN(${SEGMENT_SIZE}) + (. & (${MAXPAGESIZE} - 1))"
  34. DATA_SEGMENT_RELRO_END=""
  35. DATA_SEGMENT_END=""
  36. if test -n "${COMMONPAGESIZE}"; then
  37. DATA_SEGMENT_ALIGN="ALIGN (${SEGMENT_SIZE}) - ((${MAXPAGESIZE} - .) & (${MAXPAGESIZE} - 1)); . = DATA_SEGMENT_ALIGN (${MAXPAGESIZE}, ${COMMONPAGESIZE})"
  38. DATA_SEGMENT_END=". = DATA_SEGMENT_END (.);"
  39. DATA_SEGMENT_RELRO_END=". = DATA_SEGMENT_RELRO_END (${SEPARATE_GOTPLT-0}, .);"
  40. fi
  41. if test -z "${INITIAL_READONLY_SECTIONS}${CREATE_SHLIB}"; then
  42. INITIAL_READONLY_SECTIONS=".interp ${RELOCATING-0} : { *(.interp) }"
  43. fi
  44. if test -z "$PLT"; then
  45. IPLT=".iplt ${RELOCATING-0} : { *(.iplt) }"
  46. PLT=".plt ${RELOCATING-0} : { *(.plt)${RELOCATING+${IREL_IN_PLT+ *(.iplt)}} }
  47. ${IREL_IN_PLT-$IPLT}"
  48. fi
  49. test -n "${DATA_PLT-${BSS_PLT-text}}" && TEXT_PLT=
  50. if test -z "$GOT"; then
  51. if test -z "$SEPARATE_GOTPLT"; then
  52. GOT=".got ${RELOCATING-0} : {${RELOCATING+ *(.got.plt) *(.igot.plt)} *(.got)${RELOCATING+ *(.igot)} }"
  53. else
  54. GOT=".got ${RELOCATING-0} : { *(.got)${RELOCATING+ *(.igot)} }"
  55. GOTPLT=".got.plt ${RELOCATING-0} : { *(.got.plt)${RELOCATING+ *(.igot.plt)} }"
  56. fi
  57. fi
  58. REL_IFUNC=".rel.ifunc ${RELOCATING-0} : { *(.rel.ifunc) }"
  59. RELA_IFUNC=".rela.ifunc ${RELOCATING-0} : { *(.rela.ifunc) }"
  60. REL_IPLT=".rel.iplt ${RELOCATING-0} :
  61. {
  62. ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__rel_iplt_start = .);}}
  63. *(.rel.iplt)
  64. ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__rel_iplt_end = .);}}
  65. }"
  66. RELA_IPLT=".rela.iplt ${RELOCATING-0} :
  67. {
  68. ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__rela_iplt_start = .);}}
  69. *(.rela.iplt)
  70. ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__rela_iplt_end = .);}}
  71. }"
  72. DYNAMIC=".dynamic ${RELOCATING-0} : { *(.dynamic) }"
  73. RODATA=".${RODATA_NAME} ${RELOCATING-0} : { *(.${RODATA_NAME}${RELOCATING+ .${RODATA_NAME}.* .gnu.linkonce.r.*}) }"
  74. DATARELRO=".data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }"
  75. DISCARDED="/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }"
  76. if test -z "${NO_SMALL_DATA}"; then
  77. SBSS=".sbss_b ${RELOCATING-0} :
  78. {
  79. *(.sbss_b${RELOCATING+ .sbss_b.*})
  80. ${RELOCATING+*(.scommon_b .scommon_b.*)}
  81. ${RELOCATING+. = ALIGN(2);}
  82. }
  83. .sbss_h ${RELOCATING-0} :
  84. {
  85. *(.sbss_h${RELOCATING+ .sbss_h.*})
  86. ${RELOCATING+*(.scommon_h .scommon_h.*)}
  87. ${RELOCATING+. = ALIGN(4);}
  88. }
  89. .sbss_w ${RELOCATING-0} :
  90. {
  91. *(.sbss_w${RELOCATING+ .sbss_w.*})
  92. ${RELOCATING+*(.scommon_w .scommon_w.*)
  93. *(.dynsbss)
  94. *(.scommon)
  95. . = ALIGN(8);}
  96. }
  97. .sbss_d ${RELOCATING-0} :
  98. {
  99. *(.sbss_d${RELOCATING+ .sbss_d.*})
  100. ${RELOCATING+*(.scommon_d .scommon_d.*)}
  101. ${RELOCATING+PROVIDE (__sbss_end = .);}
  102. ${RELOCATING+PROVIDE (___sbss_end = .);}
  103. }"
  104. SBSS2=".${SBSS_NAME}2 ${RELOCATING-0} : { *(.${SBSS_NAME}2${RELOCATING+ .${SBSS_NAME}2.* .gnu.linkonce.sb2.*}) }"
  105. SDATA="/* We want the small data sections together, so single-instruction offsets
  106. can access them all, and initialized data all before uninitialized, so
  107. we can shorten the on-disk segment size. */
  108. .${SDATA_NAME} ${RELOCATING-0} :
  109. {
  110. ${RELOCATING+${SDATA_START_SYMBOLS}}
  111. ${CREATE_SHLIB+*(.${SDATA_NAME}2 .${SDATA_NAME}2.* .gnu.linkonce.s2.*)}
  112. *(.${SDATA_NAME}${RELOCATING+ .${SDATA_NAME}.* .gnu.linkonce.s.*})
  113. }
  114. .sdata_d ${RELOCATING-0} :
  115. {
  116. *(.sdata_d${RELOCATING+ .sdata_d.*})
  117. }
  118. .sdata_w ${RELOCATING-0} :
  119. {
  120. *(.sdata_w${RELOCATING+ .sdata_w.*})
  121. }
  122. .sdata_h ${RELOCATING-0} :
  123. {
  124. *(.sdata_h${RELOCATING+ .sdata_h.*})
  125. }
  126. .sdata_b ${RELOCATING-0} :
  127. {
  128. *(.sdata_b${RELOCATING+ .sdata_b.*})
  129. }
  130. .sdata_f ${RELOCATING-0} :
  131. {
  132. *(.sdata_f${RELOCATING+ .sdata_f.*})
  133. }"
  134. SDATA2=".${SDATA_NAME}2 ${RELOCATING-0} :
  135. {
  136. ${RELOCATING+${SDATA2_START_SYMBOLS}}
  137. *(.${SDATA_NAME}2${RELOCATING+ .${SDATA_NAME}2.* .gnu.linkonce.s2.*})
  138. }"
  139. REL_SDATA=".rel.${SDATA_NAME} ${RELOCATING-0} : { *(.rel.${SDATA_NAME}${RELOCATING+ .rel.${SDATA_NAME}.* .rel.gnu.linkonce.s.*}) }
  140. .rela.${SDATA_NAME} ${RELOCATING-0} : { *(.rela.${SDATA_NAME}${RELOCATING+ .rela.${SDATA_NAME}.* .rela.gnu.linkonce.s.*}) }"
  141. REL_SBSS=".rel.${SBSS_NAME} ${RELOCATING-0} : { *(.rel.${SBSS_NAME}${RELOCATING+ .rel.${SBSS_NAME}.* .rel.gnu.linkonce.sb.*}) }
  142. .rela.${SBSS_NAME} ${RELOCATING-0} : { *(.rela.${SBSS_NAME}${RELOCATING+ .rela.${SBSS_NAME}.* .rela.gnu.linkonce.sb.*}) }"
  143. REL_SDATA2=".rel.${SDATA_NAME}2 ${RELOCATING-0} : { *(.rel.${SDATA_NAME}2${RELOCATING+ .rel.${SDATA_NAME}2.* .rel.gnu.linkonce.s2.*}) }
  144. .rela.${SDATA_NAME}2 ${RELOCATING-0} : { *(.rela.${SDATA_NAME}2${RELOCATING+ .rela.${SDATA_NAME}2.* .rela.gnu.linkonce.s2.*}) }"
  145. REL_SBSS2=".rel.${SBSS_NAME}2 ${RELOCATING-0} : { *(.rel.${SBSS_NAME}2${RELOCATING+ .rel.${SBSS_NAME}2.* .rel.gnu.linkonce.sb2.*}) }
  146. .rela.${SBSS_NAME}2 ${RELOCATING-0} : { *(.rela.${SBSS_NAME}2${RELOCATING+ .rela.${SBSS_NAME}2.* .rela.gnu.linkonce.sb2.*}) }"
  147. else
  148. NO_SMALL_DATA=" "
  149. fi
  150. if test -z "${DATA_GOT}"; then
  151. if test -n "${NO_SMALL_DATA}"; then
  152. DATA_GOT=" "
  153. fi
  154. fi
  155. if test -z "${SDATA_GOT}"; then
  156. if test -z "${NO_SMALL_DATA}"; then
  157. SDATA_GOT=" "
  158. fi
  159. fi
  160. test -n "$SEPARATE_GOTPLT" && SEPARATE_GOTPLT=" "
  161. test "${LARGE_SECTIONS}" = "yes" && REL_LARGE="
  162. .rel.ldata ${RELOCATING-0} : { *(.rel.ldata${RELOCATING+ .rel.ldata.* .rel.gnu.linkonce.l.*}) }
  163. .rela.ldata ${RELOCATING-0} : { *(.rela.ldata${RELOCATING+ .rela.ldata.* .rela.gnu.linkonce.l.*}) }
  164. .rel.lbss ${RELOCATING-0} : { *(.rel.lbss${RELOCATING+ .rel.lbss.* .rel.gnu.linkonce.lb.*}) }
  165. .rela.lbss ${RELOCATING-0} : { *(.rela.lbss${RELOCATING+ .rela.lbss.* .rela.gnu.linkonce.lb.*}) }
  166. .rel.lrodata ${RELOCATING-0} : { *(.rel.lrodata${RELOCATING+ .rel.lrodata.* .rel.gnu.linkonce.lr.*}) }
  167. .rela.lrodata ${RELOCATING-0} : { *(.rela.lrodata${RELOCATING+ .rela.lrodata.* .rela.gnu.linkonce.lr.*}) }"
  168. test "${LARGE_SECTIONS}" = "yes" && LARGE_BSS="
  169. .lbss ${RELOCATING-0} :
  170. {
  171. *(.dynlbss)
  172. *(.lbss${RELOCATING+ .lbss.* .gnu.linkonce.lb.*})
  173. *(LARGE_COMMON)
  174. }"
  175. test "${LARGE_SECTIONS}" = "yes" && LARGE_SECTIONS="
  176. .lrodata ${RELOCATING-0} ${RELOCATING+ALIGN(${MAXPAGESIZE}) + (. & (${MAXPAGESIZE} - 1))} :
  177. {
  178. *(.lrodata${RELOCATING+ .lrodata.* .gnu.linkonce.lr.*})
  179. }
  180. .ldata ${RELOCATING-0} ${RELOCATING+ALIGN(${MAXPAGESIZE}) + (. & (${MAXPAGESIZE} - 1))} :
  181. {
  182. *(.ldata${RELOCATING+ .ldata.* .gnu.linkonce.l.*})
  183. ${RELOCATING+. = ALIGN(. != 0 ? ${ALIGNMENT} : 1);}
  184. }"
  185. if test "${ENABLE_INITFINI_ARRAY}" = "yes"; then
  186. SORT_INIT_ARRAY="KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))"
  187. SORT_FINI_ARRAY="KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))"
  188. CTORS_IN_INIT_ARRAY="EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors"
  189. DTORS_IN_FINI_ARRAY="EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors"
  190. else
  191. SORT_INIT_ARRAY="KEEP (*(SORT(.init_array.*)))"
  192. SORT_FINI_ARRAY="KEEP (*(SORT(.fini_array.*)))"
  193. CTORS_IN_INIT_ARRAY=
  194. DTORS_IN_FINI_ARRAY=
  195. fi
  196. INIT_ARRAY=".init_array ${RELOCATING-0} :
  197. {
  198. ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__init_array_start = .);}}
  199. ${SORT_INIT_ARRAY}
  200. KEEP (*(.init_array ${CTORS_IN_INIT_ARRAY}))
  201. ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__init_array_end = .);}}
  202. }"
  203. FINI_ARRAY=".fini_array ${RELOCATING-0} :
  204. {
  205. ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__fini_array_start = .);}}
  206. ${SORT_FINI_ARRAY}
  207. KEEP (*(.fini_array ${DTORS_IN_FINI_ARRAY}))
  208. ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__fini_array_end = .);}}
  209. }"
  210. CTOR=".ctors ${CONSTRUCTING-0} :
  211. {
  212. ${CONSTRUCTING+${CTOR_START}}
  213. /* gcc uses crtbegin.o to find the start of
  214. the constructors, so we make sure it is
  215. first. Because this is a wildcard, it
  216. doesn't matter if the user does not
  217. actually link against crtbegin.o; the
  218. linker won't look for a file to match a
  219. wildcard. The wildcard also means that it
  220. doesn't matter which directory crtbegin.o
  221. is in. */
  222. KEEP (*crtbegin.o(.ctors))
  223. KEEP (*crtbegin?.o(.ctors))
  224. /* We don't want to include the .ctor section from
  225. the crtend.o file until after the sorted ctors.
  226. The .ctor section from the crtend file contains the
  227. end of ctors marker and it must be last */
  228. KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors))
  229. KEEP (*(SORT(.ctors.*)))
  230. KEEP (*(.ctors))
  231. ${CONSTRUCTING+${CTOR_END}}
  232. }"
  233. DTOR=".dtors ${CONSTRUCTING-0} :
  234. {
  235. ${CONSTRUCTING+${DTOR_START}}
  236. KEEP (*crtbegin.o(.dtors))
  237. KEEP (*crtbegin?.o(.dtors))
  238. KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors))
  239. KEEP (*(SORT(.dtors.*)))
  240. KEEP (*(.dtors))
  241. ${CONSTRUCTING+${DTOR_END}}
  242. }"
  243. STACK=".stack ${RELOCATING-0}${RELOCATING+${STACK_ADDR}} :
  244. {
  245. ${RELOCATING+${USER_LABEL_PREFIX}_stack = .;}
  246. *(.stack)
  247. ${RELOCATING+${STACK_SENTINEL}}
  248. }"
  249. TEXT_START_ADDR="SEGMENT_START(\"text-segment\", ${TEXT_START_ADDR})"
  250. SHLIB_TEXT_START_ADDR="SEGMENT_START(\"text-segment\", ${SHLIB_TEXT_START_ADDR:-0})"
  251. if [ -z "$SEPARATE_CODE" ]; then
  252. SIZEOF_HEADERS_CODE=" + SIZEOF_HEADERS"
  253. else
  254. SIZEOF_HEADERS_CODE=
  255. fi
  256. # If this is for an embedded system, don't add SIZEOF_HEADERS.
  257. if [ -z "$EMBEDDED" ]; then
  258. test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR}${SIZEOF_HEADERS_CODE}"
  259. NDS32_INIT=""
  260. else
  261. test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR}"
  262. NDS32_INIT=".nds32_init : { KEEP(*(.nds32_init)) }"
  263. fi
  264. cat <<EOF
  265. /* Copyright (C) 2014-2022 Free Software Foundation, Inc.
  266. Copying and distribution of this script, with or without modification,
  267. are permitted in any medium without royalty provided the copyright
  268. notice and this notice are preserved. */
  269. OUTPUT_FORMAT("${OUTPUT_FORMAT}", "${BIG_OUTPUT_FORMAT}",
  270. "${LITTLE_OUTPUT_FORMAT}")
  271. OUTPUT_ARCH(${OUTPUT_ARCH})
  272. ${RELOCATING+ENTRY(${ENTRY})}
  273. ${RELOCATING+${LIB_SEARCH_DIRS}}
  274. ${RELOCATING+${EXECUTABLE_SYMBOLS}}
  275. ${RELOCATING+${INPUT_FILES}}
  276. ${RELOCATING- /* For some reason, the Solaris linker makes bad executables
  277. if gld -r is used and the intermediate file has sections starting
  278. at non-zero addresses. Could be a Solaris ld bug, could be a GNU ld
  279. bug. But for now assigning the zero vmas works. */}
  280. SECTIONS
  281. {
  282. /* Read-only sections, merged into text segment: */
  283. ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+PROVIDE (__executable_start = ${TEXT_START_ADDR}); . = ${TEXT_BASE_ADDRESS};}}}
  284. /* Sections saved crt0 and crt1. */
  285. ${NDS32_INIT}
  286. ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_TEXT_START_ADDR}${SIZEOF_HEADERS_CODE};}}
  287. ${CREATE_PIE+${RELOCATING+PROVIDE (__executable_start = ${SHLIB_TEXT_START_ADDR}); . = ${SHLIB_TEXT_START_ADDR}${SIZEOF_HEADERS_CODE};}}
  288. EOF
  289. emit_early_ro()
  290. {
  291. cat <<EOF
  292. ${INITIAL_READONLY_SECTIONS}
  293. .note.gnu.build-id ${RELOCATING-0}: { *(.note.gnu.build-id) }
  294. EOF
  295. }
  296. test -n "${SEPARATE_CODE}" || emit_early_ro
  297. test -n "${RELOCATING+0}" || unset NON_ALLOC_DYN
  298. test -z "${NON_ALLOC_DYN}" || TEXT_DYNAMIC=
  299. cat > ldscripts/dyntmp.$$ <<EOF
  300. ${TEXT_DYNAMIC+${DYNAMIC}}
  301. .hash ${RELOCATING-0} : { *(.hash) }
  302. .gnu.hash ${RELOCATING-0} : { *(.gnu.hash) }
  303. .dynsym ${RELOCATING-0} : { *(.dynsym) }
  304. .dynstr ${RELOCATING-0} : { *(.dynstr) }
  305. .gnu.version ${RELOCATING-0} : { *(.gnu.version) }
  306. .gnu.version_d ${RELOCATING-0}: { *(.gnu.version_d) }
  307. .gnu.version_r ${RELOCATING-0}: { *(.gnu.version_r) }
  308. EOF
  309. if [ "x$COMBRELOC" = x ]; then
  310. COMBRELOCCAT="cat >> ldscripts/dyntmp.$$"
  311. else
  312. COMBRELOCCAT="cat > $COMBRELOC"
  313. fi
  314. eval $COMBRELOCCAT <<EOF
  315. ${INITIAL_RELOC_SECTIONS}
  316. .rel.init ${RELOCATING-0} : { *(.rel.init) }
  317. .rela.init ${RELOCATING-0} : { *(.rela.init) }
  318. .rel.text ${RELOCATING-0} : { *(.rel.text${RELOCATING+ .rel.text.* .rel.gnu.linkonce.t.*}) }
  319. .rela.text ${RELOCATING-0} : { *(.rela.text${RELOCATING+ .rela.text.* .rela.gnu.linkonce.t.*}) }
  320. .rel.fini ${RELOCATING-0} : { *(.rel.fini) }
  321. .rela.fini ${RELOCATING-0} : { *(.rela.fini) }
  322. .rel.${RODATA_NAME} ${RELOCATING-0} : { *(.rel.${RODATA_NAME}${RELOCATING+ .rel.${RODATA_NAME}.* .rel.gnu.linkonce.r.*}) }
  323. .rela.${RODATA_NAME} ${RELOCATING-0} : { *(.rela.${RODATA_NAME}${RELOCATING+ .rela.${RODATA_NAME}.* .rela.gnu.linkonce.r.*}) }
  324. ${OTHER_READONLY_RELOC_SECTIONS}
  325. .rel.data.rel.ro ${RELOCATING-0} : { *(.rel.data.rel.ro${RELOCATING+ .rel.data.rel.ro.* .rel.gnu.linkonce.d.rel.ro.*}) }
  326. .rela.data.rel.ro ${RELOCATING-0} : { *(.rela.data.rel.ro${RELOCATING+ .rela.data.rel.ro.* .rela.gnu.linkonce.d.rel.ro.*}) }
  327. .rel.data ${RELOCATING-0} : { *(.rel.data${RELOCATING+ .rel.data.* .rel.gnu.linkonce.d.*}) }
  328. .rela.data ${RELOCATING-0} : { *(.rela.data${RELOCATING+ .rela.data.* .rela.gnu.linkonce.d.*}) }
  329. ${OTHER_READWRITE_RELOC_SECTIONS}
  330. .rel.tdata ${RELOCATING-0} : { *(.rel.tdata${RELOCATING+ .rel.tdata.* .rel.gnu.linkonce.td.*}) }
  331. .rela.tdata ${RELOCATING-0} : { *(.rela.tdata${RELOCATING+ .rela.tdata.* .rela.gnu.linkonce.td.*}) }
  332. .rel.tbss ${RELOCATING-0} : { *(.rel.tbss${RELOCATING+ .rel.tbss.* .rel.gnu.linkonce.tb.*}) }
  333. .rela.tbss ${RELOCATING-0} : { *(.rela.tbss${RELOCATING+ .rela.tbss.* .rela.gnu.linkonce.tb.*}) }
  334. .rel.ctors ${RELOCATING-0} : { *(.rel.ctors) }
  335. .rela.ctors ${RELOCATING-0} : { *(.rela.ctors) }
  336. .rel.dtors ${RELOCATING-0} : { *(.rel.dtors) }
  337. .rela.dtors ${RELOCATING-0} : { *(.rela.dtors) }
  338. .rel.got ${RELOCATING-0} : { *(.rel.got) }
  339. .rela.got ${RELOCATING-0} : { *(.rela.got) }
  340. ${OTHER_GOT_RELOC_SECTIONS}
  341. ${REL_SDATA}
  342. ${REL_SBSS}
  343. ${REL_SDATA2}
  344. ${REL_SBSS2}
  345. .rel.${BSS_NAME} ${RELOCATING-0} : { *(.rel.${BSS_NAME}${RELOCATING+ .rel.${BSS_NAME}.* .rel.gnu.linkonce.b.*}) }
  346. .rela.${BSS_NAME} ${RELOCATING-0} : { *(.rela.${BSS_NAME}${RELOCATING+ .rela.${BSS_NAME}.* .rela.gnu.linkonce.b.*}) }
  347. ${REL_LARGE}
  348. ${IREL_IN_PLT+$REL_IFUNC}
  349. ${IREL_IN_PLT+$RELA_IFUNC}
  350. ${IREL_IN_PLT-$REL_IPLT}
  351. ${IREL_IN_PLT-$RELA_IPLT}
  352. EOF
  353. if [ -n "$COMBRELOC" ]; then
  354. cat >> ldscripts/dyntmp.$$ <<EOF
  355. .rel.dyn ${RELOCATING-0} :
  356. {
  357. EOF
  358. sed -e '/^[ ]*[{}][ ]*$/d;/:[ ]*$/d;/\.rela\./d;/__rela_iplt_/d;s/^.*: { *\(.*\)}$/ \1/' $COMBRELOC >> ldscripts/dyntmp.$$
  359. cat >> ldscripts/dyntmp.$$ <<EOF
  360. }
  361. .rela.dyn ${RELOCATING-0} :
  362. {
  363. EOF
  364. sed -e '/^[ ]*[{}][ ]*$/d;/:[ ]*$/d;/\.rel\./d;/__rel_iplt_/d;s/^.*: { *\(.*\)}/ \1/' $COMBRELOC >> ldscripts/dyntmp.$$
  365. cat >> ldscripts/dyntmp.$$ <<EOF
  366. }
  367. EOF
  368. fi
  369. cat >> ldscripts/dyntmp.$$ <<EOF
  370. .rel.plt ${RELOCATING-0} :
  371. {
  372. *(.rel.plt)
  373. ${IREL_IN_PLT+${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__rel_iplt_start = .);}}}
  374. ${IREL_IN_PLT+${RELOCATING+*(.rel.iplt)}}
  375. ${IREL_IN_PLT+${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__rel_iplt_end = .);}}}
  376. }
  377. .rela.plt ${RELOCATING-0} :
  378. {
  379. *(.rela.plt)
  380. ${IREL_IN_PLT+${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__rela_iplt_start = .);}}}
  381. ${IREL_IN_PLT+${RELOCATING+*(.rela.iplt)}}
  382. ${IREL_IN_PLT+${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__rela_iplt_end = .);}}}
  383. }
  384. ${OTHER_PLT_RELOC_SECTIONS}
  385. EOF
  386. emit_dyn()
  387. {
  388. if test -z "${NO_REL_RELOCS}${NO_RELA_RELOCS}"; then
  389. cat ldscripts/dyntmp.$$
  390. else
  391. if test -z "${NO_REL_RELOCS}"; then
  392. sed -e '/^[ ]*\.rela\.[^}]*$/,/}/d;/^[ ]*\.rela\./d;/__rela_iplt_/d' ldscripts/dyntmp.$$
  393. fi
  394. if test -z "${NO_RELA_RELOCS}"; then
  395. sed -e '/^[ ]*\.rel\.[^}]*$/,/}/d;/^[ ]*\.rel\./d;/__rel_iplt_/d' ldscripts/dyntmp.$$
  396. fi
  397. fi
  398. rm -f ldscripts/dyntmp.$$
  399. }
  400. test -n "${NON_ALLOC_DYN}${SEPARATE_CODE}" || emit_dyn
  401. cat <<EOF
  402. .init ${RELOCATING-0} :
  403. {
  404. ${RELOCATING+${INIT_START}}
  405. KEEP (*(SORT_NONE(.init)))
  406. ${RELOCATING+${INIT_END}}
  407. } ${FILL}
  408. ${TEXT_PLT+${PLT_NEXT_DATA-${PLT}}}
  409. ${TINY_READONLY_SECTION}
  410. .text ${RELOCATING-0} :
  411. {
  412. ${RELOCATING+${TEXT_START_SYMBOLS}}
  413. ${RELOCATING+*(.text.unlikely .text.*_unlikely .text.unlikely.*)}
  414. ${RELOCATING+*(.text.exit .text.exit.*)}
  415. ${RELOCATING+*(.text.startup .text.startup.*)}
  416. ${RELOCATING+*(.text.hot .text.hot.*)}
  417. ${RELOCATING+*(SORT(.text.sorted.*))}
  418. *(.text .stub${RELOCATING+ .text.* .gnu.linkonce.t.*})
  419. /* .gnu.warning sections are handled specially by elf.em. */
  420. *(.gnu.warning)
  421. ${RELOCATING+${OTHER_TEXT_SECTIONS}}
  422. } ${FILL}
  423. .fini ${RELOCATING-0} :
  424. {
  425. ${RELOCATING+${FINI_START}}
  426. KEEP (*(SORT_NONE(.fini)))
  427. ${RELOCATING+${FINI_END}}
  428. } ${FILL}
  429. ${RELOCATING+PROVIDE (__${ETEXT_NAME} = .);}
  430. ${RELOCATING+PROVIDE (_${ETEXT_NAME} = .);}
  431. ${RELOCATING+PROVIDE (${ETEXT_NAME} = .);}
  432. EOF
  433. if test -n "${SEPARATE_CODE}"; then
  434. if test -n "${RODATA_ADDR}"; then
  435. RODATA_ADDR="\
  436. SEGMENT_START(\"rodata-segment\", ${RODATA_ADDR}) + SIZEOF_HEADERS"
  437. else
  438. RODATA_ADDR="ALIGN(${SEGMENT_SIZE}) + (. & (${MAXPAGESIZE} - 1))"
  439. RODATA_ADDR="SEGMENT_START(\"rodata-segment\", ${RODATA_ADDR})"
  440. fi
  441. if test -n "${SHLIB_RODATA_ADDR}"; then
  442. SHLIB_RODATA_ADDR="\
  443. SEGMENT_START(\"rodata-segment\", ${SHLIB_RODATA_ADDR}) + SIZEOF_HEADERS"
  444. else
  445. SHLIB_RODATA_ADDR="SEGMENT_START(\"rodata-segment\", ${SHLIB_RODATA_ADDR})"
  446. SHLIB_RODATA_ADDR="ALIGN(${SEGMENT_SIZE}) + (. & (${MAXPAGESIZE} - 1))"
  447. fi
  448. cat <<EOF
  449. /* Adjust the address for the rodata segment. We want to adjust up to
  450. the same address within the page on the next page up. */
  451. ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+. = ${RODATA_ADDR};}}}
  452. ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_RODATA_ADDR};}}
  453. ${CREATE_PIE+${RELOCATING+. = ${SHLIB_RODATA_ADDR};}}
  454. EOF
  455. emit_early_ro
  456. emit_dyn
  457. fi
  458. cat <<EOF
  459. ${WRITABLE_RODATA-${RODATA}}
  460. .${RODATA_NAME}1 ${RELOCATING-0} : { *(.${RODATA_NAME}1) }
  461. ${CREATE_SHLIB-${SDATA2}}
  462. ${CREATE_SHLIB-${SBSS2}}
  463. ${OTHER_READONLY_SECTIONS}
  464. .eh_frame_hdr ${RELOCATING-0} : { *(.eh_frame_hdr) }
  465. .eh_frame ${RELOCATING-0} : ONLY_IF_RO { KEEP (*(.eh_frame)) }
  466. .gcc_except_table ${RELOCATING-0} : ONLY_IF_RO { *(.gcc_except_table${RELOCATING+ .gcc_except_table.*}) }
  467. /* These sections are generated by the Sun/Oracle C++ compiler. */
  468. .exception_ranges ${RELOCATING-0} : ONLY_IF_RO { *(.exception_ranges${RELOCATING+*}) }
  469. ${TEXT_PLT+${PLT_NEXT_DATA+${PLT}}}
  470. /* Adjust the address for the data segment. We want to adjust up to
  471. the same address within the page on the next page up. */
  472. ${CREATE_SHLIB-${CREATE_PIE-${RELOCATING+. = ${DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}}
  473. ${CREATE_SHLIB+${RELOCATING+. = ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}
  474. ${CREATE_PIE+${RELOCATING+. = ${SHLIB_DATA_ADDR-${DATA_SEGMENT_ALIGN}};}}
  475. /* Exception handling */
  476. .eh_frame ${RELOCATING-0} : ONLY_IF_RW { KEEP (*(.eh_frame)) }
  477. .gcc_except_table ${RELOCATING-0} : ONLY_IF_RW { *(.gcc_except_table${RELOCATING+ .gcc_except_table.*}) }
  478. .exception_ranges ${RELOCATING-0} : ONLY_IF_RW { *(.exception_ranges${RELOCATING+*}) }
  479. /* Thread Local Storage sections */
  480. .tdata ${RELOCATING-0} : { *(.tdata${RELOCATING+ .tdata.* .gnu.linkonce.td.*}) }
  481. .tbss ${RELOCATING-0} : { *(.tbss${RELOCATING+ .tbss.* .gnu.linkonce.tb.*})${RELOCATING+ *(.tcommon)} }
  482. .preinit_array ${RELOCATING-0} :
  483. {
  484. ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__preinit_array_start = .);}}
  485. KEEP (*(.preinit_array))
  486. ${RELOCATING+${CREATE_SHLIB-PROVIDE_HIDDEN (${USER_LABEL_PREFIX}__preinit_array_end = .);}}
  487. }
  488. ${RELOCATING+${INIT_ARRAY}}
  489. ${RELOCATING+${FINI_ARRAY}}
  490. ${SMALL_DATA_CTOR-${RELOCATING+${CTOR}}}
  491. ${SMALL_DATA_DTOR-${RELOCATING+${DTOR}}}
  492. .jcr ${RELOCATING-0} : { KEEP (*(.jcr)) }
  493. ${RELOCATING+${DATARELRO}}
  494. ${OTHER_RELRO_SECTIONS}
  495. ${TEXT_DYNAMIC-${DYNAMIC}}
  496. ${DATA_GOT+${RELRO_NOW+${GOT}}}
  497. ${DATA_GOT+${RELRO_NOW+${GOTPLT}}}
  498. ${DATA_GOT+${RELRO_NOW-${SEPARATE_GOTPLT+${GOT}}}}
  499. ${RELOCATING+${DATA_SEGMENT_RELRO_END}}
  500. ${INITIAL_READWRITE_SECTIONS}
  501. ${DATA_GOT+${RELRO_NOW-${SEPARATE_GOTPLT-${GOT}}}}
  502. ${DATA_GOT+${RELRO_NOW-${GOTPLT}}}
  503. ${DATA_PLT+${PLT_BEFORE_GOT-${PLT}}}
  504. /* For _SDA_BASE_ aligment. */
  505. ${RELOCATING+. = ALIGN(4);}
  506. .data ${RELOCATING-0} :
  507. {
  508. ${RELOCATING+${DATA_START_SYMBOLS}}
  509. *(.data${RELOCATING+ .data.* .gnu.linkonce.d.*})
  510. ${CONSTRUCTING+SORT(CONSTRUCTORS)}
  511. }
  512. .data1 ${RELOCATING-0} : { *(.data1) }
  513. ${WRITABLE_RODATA+${RODATA}}
  514. ${OTHER_READWRITE_SECTIONS}
  515. ${SMALL_DATA_CTOR+${RELOCATING+${CTOR}}}
  516. ${SMALL_DATA_DTOR+${RELOCATING+${DTOR}}}
  517. ${RELOCATING+. = ALIGN(4);}
  518. ${DATA_PLT+${PLT_BEFORE_GOT+${PLT}}}
  519. ${SDATA_GOT+${RELOCATING+${OTHER_GOT_SYMBOLS+. = .; ${OTHER_GOT_SYMBOLS}}}}
  520. ${SDATA_GOT+${GOT}}
  521. ${SDATA_GOT+${OTHER_GOT_SECTIONS}}
  522. ${SDATA}
  523. ${OTHER_SDATA_SECTIONS}
  524. ${RELOCATING+. = ALIGN(4);}
  525. ${RELOCATING+${DATA_END_SYMBOLS-${USER_LABEL_PREFIX}_edata = .; PROVIDE (${USER_LABEL_PREFIX}edata = .);}}
  526. ${RELOCATING+. = .;}
  527. ${RELOCATING+${USER_LABEL_PREFIX}__bss_start = .;}
  528. ${RELOCATING+${OTHER_BSS_SYMBOLS}}
  529. ${SBSS}
  530. ${BSS_PLT+${PLT}}
  531. .${BSS_NAME} ${RELOCATING-0} :
  532. {
  533. ${RELOCATING+*(.dyn${BSS_NAME})}
  534. *(.${BSS_NAME}${RELOCATING+ .${BSS_NAME}.* .gnu.linkonce.b.*})
  535. ${RELOCATING+*(COMMON)
  536. /* Align here to ensure that the .bss section occupies space up to
  537. _end. Align after .bss to ensure correct alignment even if the
  538. .bss section disappears because there are no input sections.
  539. FIXME: Why do we need it? When there is no .bss section, we do not
  540. pad the .data section. */
  541. . = ALIGN(. != 0 ? ${ALIGNMENT} : 1);}
  542. }
  543. ${OTHER_BSS_SECTIONS}
  544. ${LARGE_BSS_AFTER_BSS+${LARGE_BSS}}
  545. ${RELOCATING+_end = .;}
  546. ${RELOCATING+${OTHER_BSS_END_SYMBOLS}}
  547. ${RELOCATING+. = ALIGN(${ALIGNMENT});}
  548. EOF
  549. LARGE_DATA_ADDR=". = SEGMENT_START(\"ldata-segment\", ${LARGE_DATA_ADDR-.});"
  550. SHLIB_LARGE_DATA_ADDR=". = SEGMENT_START(\"ldata-segment\", ${SHLIB_LARGE_DATA_ADDR-.});"
  551. cat <<EOF
  552. ${RELOCATING+${CREATE_SHLIB-${CREATE_PIE-${LARGE_DATA_ADDR}}}}
  553. ${RELOCATING+${CREATE_SHLIB+${SHLIB_LARGE_DATA_ADDR}}}
  554. ${RELOCATING+${CREATE_PIE+${SHLIB_LARGE_DATA_ADDR}}}
  555. ${LARGE_SECTIONS}
  556. ${LARGE_BSS_AFTER_BSS-${LARGE_BSS}}
  557. ${RELOCATING+. = ALIGN(${ALIGNMENT});}
  558. ${RELOCATING+${OTHER_END_SYMBOLS}}
  559. ${RELOCATING+${END_SYMBOLS-${USER_LABEL_PREFIX}_end = .; PROVIDE (${USER_LABEL_PREFIX}end = .);}}
  560. ${RELOCATING+${DATA_SEGMENT_END}}
  561. ${TINY_DATA_SECTION}
  562. ${TINY_BSS_SECTION}
  563. ${STACK_ADDR+${STACK}}
  564. EOF
  565. test -z "${NON_ALLOC_DYN}" || emit_dyn
  566. cat <<EOF
  567. /* Stabs debugging sections. */
  568. .stab 0 : { *(.stab) }
  569. .stabstr 0 : { *(.stabstr) }
  570. .stab.excl 0 : { *(.stab.excl) }
  571. .stab.exclstr 0 : { *(.stab.exclstr) }
  572. .stab.index 0 : { *(.stab.index) }
  573. .stab.indexstr 0 : { *(.stab.indexstr) }
  574. .comment 0 : { *(.comment) }
  575. EOF
  576. . $srcdir/scripttempl/DWARF.sc
  577. cat <<EOF
  578. ${ATTRS_SECTIONS}
  579. ${OTHER_SECTIONS}
  580. ${RELOCATING+${OTHER_SYMBOLS}}
  581. ${RELOCATING+${DISCARDED}}
  582. }
  583. EOF