18c2c3df3SCatalin Marinas/* 28c2c3df3SCatalin Marinas * ld script to make ARM Linux kernel 38c2c3df3SCatalin Marinas * taken from the i386 version by Russell King 48c2c3df3SCatalin Marinas * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz> 58c2c3df3SCatalin Marinas */ 68c2c3df3SCatalin Marinas 78c2c3df3SCatalin Marinas#include <asm-generic/vmlinux.lds.h> 88c2c3df3SCatalin Marinas#include <asm/thread_info.h> 98c2c3df3SCatalin Marinas#include <asm/memory.h> 108c2c3df3SCatalin Marinas#include <asm/page.h> 118c2c3df3SCatalin Marinas 128c2c3df3SCatalin Marinas#define ARM_EXIT_KEEP(x) 138c2c3df3SCatalin Marinas#define ARM_EXIT_DISCARD(x) x 148c2c3df3SCatalin Marinas 158c2c3df3SCatalin MarinasOUTPUT_ARCH(aarch64) 168c2c3df3SCatalin MarinasENTRY(stext) 178c2c3df3SCatalin Marinas 188c2c3df3SCatalin Marinasjiffies = jiffies_64; 198c2c3df3SCatalin Marinas 208c2c3df3SCatalin MarinasSECTIONS 218c2c3df3SCatalin Marinas{ 228c2c3df3SCatalin Marinas /* 238c2c3df3SCatalin Marinas * XXX: The linker does not define how output sections are 248c2c3df3SCatalin Marinas * assigned to input sections when there are multiple statements 258c2c3df3SCatalin Marinas * matching the same input section name. There is no documented 268c2c3df3SCatalin Marinas * order of matching. 278c2c3df3SCatalin Marinas */ 288c2c3df3SCatalin Marinas /DISCARD/ : { 298c2c3df3SCatalin Marinas ARM_EXIT_DISCARD(EXIT_TEXT) 308c2c3df3SCatalin Marinas ARM_EXIT_DISCARD(EXIT_DATA) 318c2c3df3SCatalin Marinas EXIT_CALL 328c2c3df3SCatalin Marinas *(.discard) 338c2c3df3SCatalin Marinas *(.discard.*) 348c2c3df3SCatalin Marinas } 358c2c3df3SCatalin Marinas 368c2c3df3SCatalin Marinas . = PAGE_OFFSET + TEXT_OFFSET; 378c2c3df3SCatalin Marinas 388c2c3df3SCatalin Marinas .head.text : { 398c2c3df3SCatalin Marinas _text = .; 408c2c3df3SCatalin Marinas HEAD_TEXT 418c2c3df3SCatalin Marinas } 428c2c3df3SCatalin Marinas .text : { /* Real text segment */ 438c2c3df3SCatalin Marinas _stext = .; /* Text and read-only data */ 448c2c3df3SCatalin Marinas *(.smp.pen.text) 458c2c3df3SCatalin Marinas __exception_text_start = .; 468c2c3df3SCatalin Marinas *(.exception.text) 478c2c3df3SCatalin Marinas __exception_text_end = .; 488c2c3df3SCatalin Marinas IRQENTRY_TEXT 498c2c3df3SCatalin Marinas TEXT_TEXT 508c2c3df3SCatalin Marinas SCHED_TEXT 518c2c3df3SCatalin Marinas LOCK_TEXT 528c2c3df3SCatalin Marinas *(.fixup) 538c2c3df3SCatalin Marinas *(.gnu.warning) 548c2c3df3SCatalin Marinas . = ALIGN(16); 558c2c3df3SCatalin Marinas *(.got) /* Global offset table */ 568c2c3df3SCatalin Marinas } 578c2c3df3SCatalin Marinas 588c2c3df3SCatalin Marinas RO_DATA(PAGE_SIZE) 59*adace895SWill Deacon EXCEPTION_TABLE(8) 608c2c3df3SCatalin Marinas _etext = .; /* End of text and rodata section */ 618c2c3df3SCatalin Marinas 628c2c3df3SCatalin Marinas . = ALIGN(PAGE_SIZE); 638c2c3df3SCatalin Marinas __init_begin = .; 648c2c3df3SCatalin Marinas 658c2c3df3SCatalin Marinas INIT_TEXT_SECTION(8) 668c2c3df3SCatalin Marinas .exit.text : { 678c2c3df3SCatalin Marinas ARM_EXIT_KEEP(EXIT_TEXT) 688c2c3df3SCatalin Marinas } 698c2c3df3SCatalin Marinas . = ALIGN(16); 708c2c3df3SCatalin Marinas .init.data : { 718c2c3df3SCatalin Marinas INIT_DATA 728c2c3df3SCatalin Marinas INIT_SETUP(16) 738c2c3df3SCatalin Marinas INIT_CALLS 748c2c3df3SCatalin Marinas CON_INITCALL 758c2c3df3SCatalin Marinas SECURITY_INITCALL 768c2c3df3SCatalin Marinas INIT_RAM_FS 778c2c3df3SCatalin Marinas } 788c2c3df3SCatalin Marinas .exit.data : { 798c2c3df3SCatalin Marinas ARM_EXIT_KEEP(EXIT_DATA) 808c2c3df3SCatalin Marinas } 818c2c3df3SCatalin Marinas 828c2c3df3SCatalin Marinas PERCPU_SECTION(64) 838c2c3df3SCatalin Marinas 848c2c3df3SCatalin Marinas __init_end = .; 858c2c3df3SCatalin Marinas . = ALIGN(THREAD_SIZE); 868c2c3df3SCatalin Marinas __data_loc = .; 878c2c3df3SCatalin Marinas 888c2c3df3SCatalin Marinas .data : AT(__data_loc) { 898c2c3df3SCatalin Marinas _data = .; /* address in memory */ 908c2c3df3SCatalin Marinas _sdata = .; 918c2c3df3SCatalin Marinas 928c2c3df3SCatalin Marinas /* 938c2c3df3SCatalin Marinas * first, the init task union, aligned 948c2c3df3SCatalin Marinas * to an 8192 byte boundary. 958c2c3df3SCatalin Marinas */ 968c2c3df3SCatalin Marinas INIT_TASK_DATA(THREAD_SIZE) 978c2c3df3SCatalin Marinas NOSAVE_DATA 988c2c3df3SCatalin Marinas CACHELINE_ALIGNED_DATA(64) 998c2c3df3SCatalin Marinas READ_MOSTLY_DATA(64) 1008c2c3df3SCatalin Marinas 1018c2c3df3SCatalin Marinas /* 1028c2c3df3SCatalin Marinas * and the usual data section 1038c2c3df3SCatalin Marinas */ 1048c2c3df3SCatalin Marinas DATA_DATA 1058c2c3df3SCatalin Marinas CONSTRUCTORS 1068c2c3df3SCatalin Marinas 1078c2c3df3SCatalin Marinas _edata = .; 1088c2c3df3SCatalin Marinas } 1098c2c3df3SCatalin Marinas _edata_loc = __data_loc + SIZEOF(.data); 1108c2c3df3SCatalin Marinas 1118c2c3df3SCatalin Marinas NOTES 1128c2c3df3SCatalin Marinas 1138c2c3df3SCatalin Marinas BSS_SECTION(0, 0, 0) 1148c2c3df3SCatalin Marinas _end = .; 1158c2c3df3SCatalin Marinas 1168c2c3df3SCatalin Marinas STABS_DEBUG 1178c2c3df3SCatalin Marinas .comment 0 : { *(.comment) } 1188c2c3df3SCatalin Marinas} 119