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        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 */
 172ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
 173ASSERT((__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 */
 180ASSERT(__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 */
 184