root/arch/arm/kernel/vmlinux.lds.S

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

/* [<][>][^][v][top][bottom][index][help] */