1*8c2c3df3SCatalin Marinas/* 2*8c2c3df3SCatalin Marinas * ld script to make ARM Linux kernel 3*8c2c3df3SCatalin Marinas * taken from the i386 version by Russell King 4*8c2c3df3SCatalin Marinas * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz> 5*8c2c3df3SCatalin Marinas */ 6*8c2c3df3SCatalin Marinas 7*8c2c3df3SCatalin Marinas#include <asm-generic/vmlinux.lds.h> 8*8c2c3df3SCatalin Marinas#include <asm/thread_info.h> 9*8c2c3df3SCatalin Marinas#include <asm/memory.h> 10*8c2c3df3SCatalin Marinas#include <asm/page.h> 11*8c2c3df3SCatalin Marinas 12*8c2c3df3SCatalin Marinas#define ARM_EXIT_KEEP(x) 13*8c2c3df3SCatalin Marinas#define ARM_EXIT_DISCARD(x) x 14*8c2c3df3SCatalin Marinas 15*8c2c3df3SCatalin MarinasOUTPUT_ARCH(aarch64) 16*8c2c3df3SCatalin MarinasENTRY(stext) 17*8c2c3df3SCatalin Marinas 18*8c2c3df3SCatalin Marinasjiffies = jiffies_64; 19*8c2c3df3SCatalin Marinas 20*8c2c3df3SCatalin MarinasSECTIONS 21*8c2c3df3SCatalin Marinas{ 22*8c2c3df3SCatalin Marinas /* 23*8c2c3df3SCatalin Marinas * XXX: The linker does not define how output sections are 24*8c2c3df3SCatalin Marinas * assigned to input sections when there are multiple statements 25*8c2c3df3SCatalin Marinas * matching the same input section name. There is no documented 26*8c2c3df3SCatalin Marinas * order of matching. 27*8c2c3df3SCatalin Marinas */ 28*8c2c3df3SCatalin Marinas /DISCARD/ : { 29*8c2c3df3SCatalin Marinas ARM_EXIT_DISCARD(EXIT_TEXT) 30*8c2c3df3SCatalin Marinas ARM_EXIT_DISCARD(EXIT_DATA) 31*8c2c3df3SCatalin Marinas EXIT_CALL 32*8c2c3df3SCatalin Marinas *(.discard) 33*8c2c3df3SCatalin Marinas *(.discard.*) 34*8c2c3df3SCatalin Marinas } 35*8c2c3df3SCatalin Marinas 36*8c2c3df3SCatalin Marinas . = PAGE_OFFSET + TEXT_OFFSET; 37*8c2c3df3SCatalin Marinas 38*8c2c3df3SCatalin Marinas .head.text : { 39*8c2c3df3SCatalin Marinas _text = .; 40*8c2c3df3SCatalin Marinas HEAD_TEXT 41*8c2c3df3SCatalin Marinas } 42*8c2c3df3SCatalin Marinas .text : { /* Real text segment */ 43*8c2c3df3SCatalin Marinas _stext = .; /* Text and read-only data */ 44*8c2c3df3SCatalin Marinas *(.smp.pen.text) 45*8c2c3df3SCatalin Marinas __exception_text_start = .; 46*8c2c3df3SCatalin Marinas *(.exception.text) 47*8c2c3df3SCatalin Marinas __exception_text_end = .; 48*8c2c3df3SCatalin Marinas IRQENTRY_TEXT 49*8c2c3df3SCatalin Marinas TEXT_TEXT 50*8c2c3df3SCatalin Marinas SCHED_TEXT 51*8c2c3df3SCatalin Marinas LOCK_TEXT 52*8c2c3df3SCatalin Marinas *(.fixup) 53*8c2c3df3SCatalin Marinas *(.gnu.warning) 54*8c2c3df3SCatalin Marinas . = ALIGN(16); 55*8c2c3df3SCatalin Marinas *(.got) /* Global offset table */ 56*8c2c3df3SCatalin Marinas } 57*8c2c3df3SCatalin Marinas 58*8c2c3df3SCatalin Marinas RO_DATA(PAGE_SIZE) 59*8c2c3df3SCatalin Marinas 60*8c2c3df3SCatalin Marinas _etext = .; /* End of text and rodata section */ 61*8c2c3df3SCatalin Marinas 62*8c2c3df3SCatalin Marinas . = ALIGN(PAGE_SIZE); 63*8c2c3df3SCatalin Marinas __init_begin = .; 64*8c2c3df3SCatalin Marinas 65*8c2c3df3SCatalin Marinas INIT_TEXT_SECTION(8) 66*8c2c3df3SCatalin Marinas .exit.text : { 67*8c2c3df3SCatalin Marinas ARM_EXIT_KEEP(EXIT_TEXT) 68*8c2c3df3SCatalin Marinas } 69*8c2c3df3SCatalin Marinas . = ALIGN(16); 70*8c2c3df3SCatalin Marinas .init.data : { 71*8c2c3df3SCatalin Marinas INIT_DATA 72*8c2c3df3SCatalin Marinas INIT_SETUP(16) 73*8c2c3df3SCatalin Marinas INIT_CALLS 74*8c2c3df3SCatalin Marinas CON_INITCALL 75*8c2c3df3SCatalin Marinas SECURITY_INITCALL 76*8c2c3df3SCatalin Marinas INIT_RAM_FS 77*8c2c3df3SCatalin Marinas } 78*8c2c3df3SCatalin Marinas .exit.data : { 79*8c2c3df3SCatalin Marinas ARM_EXIT_KEEP(EXIT_DATA) 80*8c2c3df3SCatalin Marinas } 81*8c2c3df3SCatalin Marinas 82*8c2c3df3SCatalin Marinas PERCPU_SECTION(64) 83*8c2c3df3SCatalin Marinas 84*8c2c3df3SCatalin Marinas __init_end = .; 85*8c2c3df3SCatalin Marinas . = ALIGN(THREAD_SIZE); 86*8c2c3df3SCatalin Marinas __data_loc = .; 87*8c2c3df3SCatalin Marinas 88*8c2c3df3SCatalin Marinas .data : AT(__data_loc) { 89*8c2c3df3SCatalin Marinas _data = .; /* address in memory */ 90*8c2c3df3SCatalin Marinas _sdata = .; 91*8c2c3df3SCatalin Marinas 92*8c2c3df3SCatalin Marinas /* 93*8c2c3df3SCatalin Marinas * first, the init task union, aligned 94*8c2c3df3SCatalin Marinas * to an 8192 byte boundary. 95*8c2c3df3SCatalin Marinas */ 96*8c2c3df3SCatalin Marinas INIT_TASK_DATA(THREAD_SIZE) 97*8c2c3df3SCatalin Marinas NOSAVE_DATA 98*8c2c3df3SCatalin Marinas CACHELINE_ALIGNED_DATA(64) 99*8c2c3df3SCatalin Marinas READ_MOSTLY_DATA(64) 100*8c2c3df3SCatalin Marinas 101*8c2c3df3SCatalin Marinas /* 102*8c2c3df3SCatalin Marinas * The exception fixup table (might need resorting at runtime) 103*8c2c3df3SCatalin Marinas */ 104*8c2c3df3SCatalin Marinas . = ALIGN(32); 105*8c2c3df3SCatalin Marinas __start___ex_table = .; 106*8c2c3df3SCatalin Marinas *(__ex_table) 107*8c2c3df3SCatalin Marinas __stop___ex_table = .; 108*8c2c3df3SCatalin Marinas 109*8c2c3df3SCatalin Marinas /* 110*8c2c3df3SCatalin Marinas * and the usual data section 111*8c2c3df3SCatalin Marinas */ 112*8c2c3df3SCatalin Marinas DATA_DATA 113*8c2c3df3SCatalin Marinas CONSTRUCTORS 114*8c2c3df3SCatalin Marinas 115*8c2c3df3SCatalin Marinas _edata = .; 116*8c2c3df3SCatalin Marinas } 117*8c2c3df3SCatalin Marinas _edata_loc = __data_loc + SIZEOF(.data); 118*8c2c3df3SCatalin Marinas 119*8c2c3df3SCatalin Marinas NOTES 120*8c2c3df3SCatalin Marinas 121*8c2c3df3SCatalin Marinas BSS_SECTION(0, 0, 0) 122*8c2c3df3SCatalin Marinas _end = .; 123*8c2c3df3SCatalin Marinas 124*8c2c3df3SCatalin Marinas STABS_DEBUG 125*8c2c3df3SCatalin Marinas .comment 0 : { *(.comment) } 126*8c2c3df3SCatalin Marinas} 127