vmlinux.lds.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #include <asm-generic/vmlinux.lds.h>
  3. #ifdef CONFIG_HOTPLUG_CPU
  4. #define ARM_CPU_DISCARD(x)
  5. #define ARM_CPU_KEEP(x) x
  6. #else
  7. #define ARM_CPU_DISCARD(x) x
  8. #define ARM_CPU_KEEP(x)
  9. #endif
  10. #if (defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK)) || \
  11. defined(CONFIG_GENERIC_BUG) || defined(CONFIG_JUMP_LABEL)
  12. #define ARM_EXIT_KEEP(x) x
  13. #define ARM_EXIT_DISCARD(x)
  14. #else
  15. #define ARM_EXIT_KEEP(x)
  16. #define ARM_EXIT_DISCARD(x) x
  17. #endif
  18. #ifdef CONFIG_MMU
  19. #define ARM_MMU_KEEP(x) x
  20. #define ARM_MMU_DISCARD(x)
  21. #else
  22. #define ARM_MMU_KEEP(x)
  23. #define ARM_MMU_DISCARD(x) x
  24. #endif
  25. /*
  26. * ld.lld does not support NOCROSSREFS:
  27. * https://github.com/ClangBuiltLinux/linux/issues/1609
  28. */
  29. #ifdef CONFIG_LD_IS_LLD
  30. #define NOCROSSREFS
  31. #endif
  32. /* Set start/end symbol names to the LMA for the section */
  33. #define ARM_LMA(sym, section) \
  34. sym##_start = LOADADDR(section); \
  35. sym##_end = LOADADDR(section) + SIZEOF(section)
  36. #define PROC_INFO \
  37. . = ALIGN(4); \
  38. __proc_info_begin = .; \
  39. *(.proc.info.init) \
  40. __proc_info_end = .;
  41. #define IDMAP_TEXT \
  42. ALIGN_FUNCTION(); \
  43. __idmap_text_start = .; \
  44. *(.idmap.text) \
  45. __idmap_text_end = .; \
  46. #define ARM_DISCARD \
  47. *(.ARM.exidx.exit.text) \
  48. *(.ARM.extab.exit.text) \
  49. *(.ARM.exidx.text.exit) \
  50. *(.ARM.extab.text.exit) \
  51. ARM_CPU_DISCARD(*(.ARM.exidx.cpuexit.text)) \
  52. ARM_CPU_DISCARD(*(.ARM.extab.cpuexit.text)) \
  53. ARM_EXIT_DISCARD(EXIT_TEXT) \
  54. ARM_EXIT_DISCARD(EXIT_DATA) \
  55. EXIT_CALL \
  56. ARM_MMU_DISCARD(*(.text.fixup)) \
  57. ARM_MMU_DISCARD(*(__ex_table)) \
  58. COMMON_DISCARDS
  59. /*
  60. * Sections that should stay zero sized, which is safer to explicitly
  61. * check instead of blindly discarding.
  62. */
  63. #define ARM_ASSERTS \
  64. .plt : { \
  65. *(.iplt) *(.rel.iplt) *(.iplt) *(.igot.plt) \
  66. } \
  67. ASSERT(SIZEOF(.plt) == 0, \
  68. "Unexpected run-time procedure linkages detected!")
  69. #define ARM_DETAILS \
  70. ELF_DETAILS \
  71. .ARM.attributes 0 : { *(.ARM.attributes) }
  72. #define ARM_STUBS_TEXT \
  73. *(.gnu.warning) \
  74. *(.glue_7) \
  75. *(.glue_7t) \
  76. *(.vfp11_veneer) \
  77. *(.v4_bx)
  78. #define ARM_TEXT \
  79. IDMAP_TEXT \
  80. __entry_text_start = .; \
  81. *(.entry.text) \
  82. __entry_text_end = .; \
  83. IRQENTRY_TEXT \
  84. SOFTIRQENTRY_TEXT \
  85. TEXT_TEXT \
  86. SCHED_TEXT \
  87. CPUIDLE_TEXT \
  88. LOCK_TEXT \
  89. KPROBES_TEXT \
  90. ARM_STUBS_TEXT \
  91. . = ALIGN(4); \
  92. *(.got) /* Global offset table */ \
  93. ARM_CPU_KEEP(PROC_INFO)
  94. /* Stack unwinding tables */
  95. #define ARM_UNWIND_SECTIONS \
  96. . = ALIGN(8); \
  97. .ARM.unwind_idx : { \
  98. __start_unwind_idx = .; \
  99. *(.ARM.exidx*) \
  100. __stop_unwind_idx = .; \
  101. } \
  102. .ARM.unwind_tab : { \
  103. __start_unwind_tab = .; \
  104. *(.ARM.extab*) \
  105. __stop_unwind_tab = .; \
  106. }
  107. /*
  108. * The vectors and stubs are relocatable code, and the
  109. * only thing that matters is their relative offsets
  110. */
  111. #define ARM_VECTORS \
  112. __vectors_lma = .; \
  113. OVERLAY 0xffff0000 : NOCROSSREFS AT(__vectors_lma) { \
  114. .vectors { \
  115. *(.vectors) \
  116. } \
  117. .vectors.bhb.loop8 { \
  118. *(.vectors.bhb.loop8) \
  119. } \
  120. .vectors.bhb.bpiall { \
  121. *(.vectors.bhb.bpiall) \
  122. } \
  123. } \
  124. ARM_LMA(__vectors, .vectors); \
  125. ARM_LMA(__vectors_bhb_loop8, .vectors.bhb.loop8); \
  126. ARM_LMA(__vectors_bhb_bpiall, .vectors.bhb.bpiall); \
  127. . = __vectors_lma + SIZEOF(.vectors) + \
  128. SIZEOF(.vectors.bhb.loop8) + \
  129. SIZEOF(.vectors.bhb.bpiall); \
  130. \
  131. __stubs_lma = .; \
  132. .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_lma) { \
  133. *(.stubs) \
  134. } \
  135. ARM_LMA(__stubs, .stubs); \
  136. . = __stubs_lma + SIZEOF(.stubs); \
  137. \
  138. PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors));
  139. #define ARM_TCM \
  140. __itcm_start = ALIGN(4); \
  141. .text_itcm ITCM_OFFSET : AT(__itcm_start - LOAD_OFFSET) { \
  142. __sitcm_text = .; \
  143. *(.tcm.text) \
  144. *(.tcm.rodata) \
  145. . = ALIGN(4); \
  146. __eitcm_text = .; \
  147. } \
  148. . = __itcm_start + SIZEOF(.text_itcm); \
  149. \
  150. __dtcm_start = .; \
  151. .data_dtcm DTCM_OFFSET : AT(__dtcm_start - LOAD_OFFSET) { \
  152. __sdtcm_data = .; \
  153. *(.tcm.data) \
  154. . = ALIGN(4); \
  155. __edtcm_data = .; \
  156. } \
  157. . = __dtcm_start + SIZEOF(.data_dtcm);