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