linux/arch/arm/kernel/vmlinux.lds.S
<<
>>
Prefs
   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
  21OUTPUT_ARCH(arm)
  22ENTRY(stext)
  23
  24#ifndef __ARMEB__
  25jiffies = jiffies_64;
  26#else
  27jiffies = jiffies_64 + 4;
  28#endif
  29
  30SECTIONS
  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#ifdef CONFIG_STRICT_KERNEL_RWX
  85        . = ALIGN(1<<SECTION_SHIFT);
  86#else
  87        . = ALIGN(PAGE_SIZE);
  88#endif
  89        __init_begin = .;
  90
  91        ARM_VECTORS
  92        INIT_TEXT_SECTION(8)
  93        .exit.text : {
  94                ARM_EXIT_KEEP(EXIT_TEXT)
  95        }
  96        .init.proc.info : {
  97                ARM_CPU_DISCARD(PROC_INFO)
  98        }
  99        .init.arch.info : {
 100                __arch_info_begin = .;
 101                *(.arch.info.init)
 102                __arch_info_end = .;
 103        }
 104        .init.tagtable : {
 105                __tagtable_begin = .;
 106                *(.taglist.init)
 107                __tagtable_end = .;
 108        }
 109#ifdef CONFIG_SMP_ON_UP
 110        .init.smpalt : {
 111                __smpalt_begin = .;
 112                *(.alt.smp.init)
 113                __smpalt_end = .;
 114        }
 115#endif
 116        .init.pv_table : {
 117                __pv_table_begin = .;
 118                *(.pv_table)
 119                __pv_table_end = .;
 120        }
 121
 122        INIT_DATA_SECTION(16)
 123
 124        .exit.data : {
 125                ARM_EXIT_KEEP(EXIT_DATA)
 126        }
 127
 128#ifdef CONFIG_SMP
 129        PERCPU_SECTION(L1_CACHE_BYTES)
 130#endif
 131
 132#ifdef CONFIG_HAVE_TCM
 133        ARM_TCM
 134#endif
 135
 136#ifdef CONFIG_STRICT_KERNEL_RWX
 137        . = ALIGN(1<<SECTION_SHIFT);
 138#else
 139        . = ALIGN(THREAD_SIZE);
 140#endif
 141        __init_end = .;
 142
 143        _sdata = .;
 144        RW_DATA(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)
 145        _edata = .;
 146
 147        BSS_SECTION(0, 0, 0)
 148#ifdef CONFIG_ARM_MPU
 149        . = ALIGN(PMSAv8_MINALIGN);
 150#endif
 151        _end = .;
 152
 153        STABS_DEBUG
 154}
 155
 156#ifdef CONFIG_STRICT_KERNEL_RWX
 157/*
 158 * Without CONFIG_DEBUG_ALIGN_RODATA, __start_rodata_section_aligned will
 159 * be the first section-aligned location after __start_rodata. Otherwise,
 160 * it will be equal to __start_rodata.
 161 */
 162__start_rodata_section_aligned = ALIGN(__start_rodata, 1 << SECTION_SHIFT);
 163#endif
 164
 165/*
 166 * These must never be empty
 167 * If you have to comment these two assert statements out, your
 168 * binutils is too old (for other reasons as well)
 169 */
 170ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
 171ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined")
 172
 173/*
 174 * The HYP init code can't be more than a page long,
 175 * and should not cross a page boundary.
 176 * The above comment applies as well.
 177 */
 178ASSERT(__hyp_idmap_text_end - (__hyp_idmap_text_start & PAGE_MASK) <= PAGE_SIZE,
 179        "HYP init code too big or misaligned")
 180
 181#endif /* CONFIG_XIP_KERNEL */
 182