^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* ld script to make ARM Linux kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * taken from the i386 version by Russell King
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #ifdef CONFIG_XIP_KERNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include "vmlinux-xip.lds.S"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/pgtable.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <asm/vmlinux.lds.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <asm/cache.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <asm/thread_info.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <asm/memory.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <asm/mpu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <asm/page.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) OUTPUT_ARCH(arm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) ENTRY(stext)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #ifndef __ARMEB__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) jiffies = jiffies_64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) jiffies = jiffies_64 + 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) SECTIONS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * XXX: The linker does not define how output sections are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * assigned to input sections when there are multiple statements
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * matching the same input section name. There is no documented
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * order of matching.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * unwind exit sections must be discarded before the rest of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * unwind sections get included.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) /DISCARD/ : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) ARM_DISCARD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #ifndef CONFIG_SMP_ON_UP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) *(.alt.smp.init)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #ifndef CONFIG_ARM_UNWIND
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) *(.ARM.exidx) *(.ARM.exidx.*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) *(.ARM.extab) *(.ARM.extab.*)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) . = PAGE_OFFSET + TEXT_OFFSET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) .head.text : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) _text = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) HEAD_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #ifdef CONFIG_STRICT_KERNEL_RWX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) . = ALIGN(1<<SECTION_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #ifdef CONFIG_ARM_MPU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) . = ALIGN(PMSAv8_MINALIGN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) .text : { /* Real text segment */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) _stext = .; /* Text and read-only data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) ARM_TEXT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #ifdef CONFIG_DEBUG_ALIGN_RODATA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) . = ALIGN(1<<SECTION_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) _etext = .; /* End of text section */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) RO_DATA(PAGE_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) . = ALIGN(4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) __start___ex_table = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) ARM_MMU_KEEP(*(__ex_table))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) __stop___ex_table = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #ifdef CONFIG_ARM_UNWIND
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) ARM_UNWIND_SECTIONS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #ifdef CONFIG_STRICT_KERNEL_RWX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) . = ALIGN(1<<SECTION_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) . = ALIGN(PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) __init_begin = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) ARM_VECTORS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) INIT_TEXT_SECTION(8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) .exit.text : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) ARM_EXIT_KEEP(EXIT_TEXT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) .init.proc.info : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) ARM_CPU_DISCARD(PROC_INFO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) .init.arch.info : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) __arch_info_begin = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) *(.arch.info.init)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) __arch_info_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) .init.tagtable : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) __tagtable_begin = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) *(.taglist.init)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) __tagtable_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #ifdef CONFIG_SMP_ON_UP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) .init.smpalt : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) __smpalt_begin = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) *(.alt.smp.init)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) __smpalt_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) .init.pv_table : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) __pv_table_begin = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) *(.pv_table)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) __pv_table_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) INIT_DATA_SECTION(16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) .exit.data : {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) ARM_EXIT_KEEP(EXIT_DATA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #ifdef CONFIG_SMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) PERCPU_SECTION(L1_CACHE_BYTES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #ifdef CONFIG_HAVE_TCM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) ARM_TCM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #ifdef CONFIG_STRICT_KERNEL_RWX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) . = ALIGN(1<<SECTION_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) . = ALIGN(THREAD_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) __init_end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) _sdata = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) RW_DATA(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) _edata = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) BSS_SECTION(0, 0, 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #ifdef CONFIG_ARM_MPU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) . = ALIGN(PMSAv8_MINALIGN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) _end = .;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) STABS_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) DWARF_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) ARM_DETAILS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) ARM_ASSERTS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #ifdef CONFIG_STRICT_KERNEL_RWX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) * Without CONFIG_DEBUG_ALIGN_RODATA, __start_rodata_section_aligned will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) * be the first section-aligned location after __start_rodata. Otherwise,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) * it will be equal to __start_rodata.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) __start_rodata_section_aligned = ALIGN(__start_rodata, 1 << SECTION_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) * These must never be empty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) * If you have to comment these two assert statements out, your
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) * binutils is too old (for other reasons as well)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) #endif /* CONFIG_XIP_KERNEL */