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 <linux/pgtable.h>
  12#include <asm/vmlinux.lds.h>
  13#include <asm/cache.h>
  14#include <asm/thread_info.h>
  15#include <asm/memory.h>
  16#include <asm/mpu.h>
  17#include <asm/page.h>
  18
  19OUTPUT_ARCH(arm)
  20ENTRY(stext)
  21
  22#ifndef __ARMEB__
  23jiffies = jiffies_64;
  24#else
  25jiffies = jiffies_64 + 4;
  26#endif
  27
  28SECTIONS
  29{
  30        /*
  31         * XXX: The linker does not define how output sections are
  32         * assigned to input sections when there are multiple statements
  33         * matching the same input section name.  There is no documented
  34         * order of matching.
  35         *
  36         * unwind exit sections must be discarded before the rest of the
  37         * unwind sections get included.
  38         */
  39        /DISCARD/ : {
  40                ARM_DISCARD
  41#ifndef CONFIG_SMP_ON_UP
  42                *(.alt.smp.init)
  43#endif
  44#ifndef CONFIG_ARM_UNWIND
  45                *(.ARM.exidx) *(.ARM.exidx.*)
  46                *(.ARM.extab) *(.ARM.extab.*)
  47#endif
  48        }
  49
  50        . = KERNEL_OFFSET + TEXT_OFFSET;
  51        .head.text : {
  52                _text = .;
  53                HEAD_TEXT
  54        }
  55
  56#ifdef CONFIG_STRICT_KERNEL_RWX
  57        . = ALIGN(1<<SECTION_SHIFT);
  58#endif
  59
  60#ifdef CONFIG_ARM_MPU
  61        . = ALIGN(PMSAv8_MINALIGN);
  62#endif
  63        .text : {                       /* Real text segment            */
  64                _stext = .;             /* Text and read-only data      */
  65                ARM_TEXT
  66        }
  67
  68#ifdef CONFIG_DEBUG_ALIGN_RODATA
  69        . = ALIGN(1<<SECTION_SHIFT);
  70#endif
  71        _etext = .;                     /* End of text section */
  72
  73        RO_DATA(PAGE_SIZE)
  74
  75        . = ALIGN(4);
  76        __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
  77                __start___ex_table = .;
  78                ARM_MMU_KEEP(*(__ex_table))
  79                __stop___ex_table = .;
  80        }
  81
  82#ifdef CONFIG_ARM_UNWIND
  83        ARM_UNWIND_SECTIONS
  84#endif
  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(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        DWARF_DEBUG
 157        ARM_DETAILS
 158
 159        ARM_ASSERTS
 160}
 161
 162#ifdef CONFIG_STRICT_KERNEL_RWX
 163/*
 164 * Without CONFIG_DEBUG_ALIGN_RODATA, __start_rodata_section_aligned will
 165 * be the first section-aligned location after __start_rodata. Otherwise,
 166 * it will be equal to __start_rodata.
 167 */
 168__start_rodata_section_aligned = ALIGN(__start_rodata, 1 << SECTION_SHIFT);
 169#endif
 170
 171/*
 172 * These must never be empty
 173 * If you have to comment these two assert statements out, your
 174 * binutils is too old (for other reasons as well)
 175 */
 176ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
 177ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined")
 178
 179#endif /* CONFIG_XIP_KERNEL */
 180