1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * Copyright (C) 2000 Russell King 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun#include <asm/vmlinux.lds.h> 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun#ifdef CONFIG_CPU_ENDIAN_BE8 8*4882a593Smuzhiyun#define ZIMAGE_MAGIC(x) ( (((x) >> 24) & 0x000000ff) | \ 9*4882a593Smuzhiyun (((x) >> 8) & 0x0000ff00) | \ 10*4882a593Smuzhiyun (((x) << 8) & 0x00ff0000) | \ 11*4882a593Smuzhiyun (((x) << 24) & 0xff000000) ) 12*4882a593Smuzhiyun#else 13*4882a593Smuzhiyun#define ZIMAGE_MAGIC(x) (x) 14*4882a593Smuzhiyun#endif 15*4882a593Smuzhiyun 16*4882a593SmuzhiyunOUTPUT_ARCH(arm) 17*4882a593SmuzhiyunENTRY(_start) 18*4882a593SmuzhiyunSECTIONS 19*4882a593Smuzhiyun{ 20*4882a593Smuzhiyun /DISCARD/ : { 21*4882a593Smuzhiyun COMMON_DISCARDS 22*4882a593Smuzhiyun *(.ARM.exidx*) 23*4882a593Smuzhiyun *(.ARM.extab*) 24*4882a593Smuzhiyun *(.note.*) 25*4882a593Smuzhiyun *(.rel.*) 26*4882a593Smuzhiyun /* 27*4882a593Smuzhiyun * Discard any r/w data - this produces a link error if we have any, 28*4882a593Smuzhiyun * which is required for PIC decompression. Local data generates 29*4882a593Smuzhiyun * GOTOFF relocations, which prevents it being relocated independently 30*4882a593Smuzhiyun * of the text/got segments. 31*4882a593Smuzhiyun */ 32*4882a593Smuzhiyun *(.data) 33*4882a593Smuzhiyun } 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun . = TEXT_START; 36*4882a593Smuzhiyun _text = .; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun .text : { 39*4882a593Smuzhiyun _start = .; 40*4882a593Smuzhiyun *(.start) 41*4882a593Smuzhiyun *(.text) 42*4882a593Smuzhiyun *(.text.*) 43*4882a593Smuzhiyun ARM_STUBS_TEXT 44*4882a593Smuzhiyun } 45*4882a593Smuzhiyun .table : ALIGN(4) { 46*4882a593Smuzhiyun _table_start = .; 47*4882a593Smuzhiyun LONG(ZIMAGE_MAGIC(6)) 48*4882a593Smuzhiyun LONG(ZIMAGE_MAGIC(0x5a534c4b)) 49*4882a593Smuzhiyun LONG(ZIMAGE_MAGIC(__piggy_size_addr - _start)) 50*4882a593Smuzhiyun LONG(ZIMAGE_MAGIC(_kernel_bss_size)) 51*4882a593Smuzhiyun LONG(ZIMAGE_MAGIC(TEXT_OFFSET)) 52*4882a593Smuzhiyun LONG(ZIMAGE_MAGIC(MALLOC_SIZE)) 53*4882a593Smuzhiyun LONG(0) 54*4882a593Smuzhiyun _table_end = .; 55*4882a593Smuzhiyun } 56*4882a593Smuzhiyun .rodata : { 57*4882a593Smuzhiyun *(.rodata) 58*4882a593Smuzhiyun *(.rodata.*) 59*4882a593Smuzhiyun *(.data.rel.ro) 60*4882a593Smuzhiyun } 61*4882a593Smuzhiyun .piggydata : { 62*4882a593Smuzhiyun *(.piggydata) 63*4882a593Smuzhiyun __piggy_size_addr = . - 4; 64*4882a593Smuzhiyun } 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun . = ALIGN(4); 67*4882a593Smuzhiyun _etext = .; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun .got.plt : { *(.got.plt) } 70*4882a593Smuzhiyun#ifndef CONFIG_EFI_STUB 71*4882a593Smuzhiyun _got_start = .; 72*4882a593Smuzhiyun .got : { *(.got) } 73*4882a593Smuzhiyun _got_end = .; 74*4882a593Smuzhiyun#endif 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* ensure the zImage file size is always a multiple of 64 bits */ 77*4882a593Smuzhiyun /* (without a dummy byte, ld just ignores the empty section) */ 78*4882a593Smuzhiyun .pad : { BYTE(0); . = ALIGN(8); } 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun#ifdef CONFIG_EFI_STUB 81*4882a593Smuzhiyun .data : ALIGN(4096) { 82*4882a593Smuzhiyun __pecoff_data_start = .; 83*4882a593Smuzhiyun _got_start = .; 84*4882a593Smuzhiyun *(.got) 85*4882a593Smuzhiyun _got_end = .; 86*4882a593Smuzhiyun /* 87*4882a593Smuzhiyun * The EFI stub always executes from RAM, and runs strictly before the 88*4882a593Smuzhiyun * decompressor, so we can make an exception for its r/w data, and keep it 89*4882a593Smuzhiyun */ 90*4882a593Smuzhiyun *(.data.efistub .bss.efistub) 91*4882a593Smuzhiyun __pecoff_data_end = .; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun /* 94*4882a593Smuzhiyun * PE/COFF mandates a file size which is a multiple of 512 bytes if the 95*4882a593Smuzhiyun * section size equals or exceeds 4 KB 96*4882a593Smuzhiyun */ 97*4882a593Smuzhiyun . = ALIGN(512); 98*4882a593Smuzhiyun } 99*4882a593Smuzhiyun __pecoff_data_rawsize = . - ADDR(.data); 100*4882a593Smuzhiyun#endif 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun _edata = .; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun /* 105*4882a593Smuzhiyun * The image_end section appears after any additional loadable sections 106*4882a593Smuzhiyun * that the linker may decide to insert in the binary image. Having 107*4882a593Smuzhiyun * this symbol allows further debug in the near future. 108*4882a593Smuzhiyun */ 109*4882a593Smuzhiyun .image_end (NOLOAD) : { 110*4882a593Smuzhiyun /* 111*4882a593Smuzhiyun * EFI requires that the image is aligned to 512 bytes, and appended 112*4882a593Smuzhiyun * DTB requires that we know where the end of the image is. Ensure 113*4882a593Smuzhiyun * that both are satisfied by ensuring that there are no additional 114*4882a593Smuzhiyun * sections emitted into the decompressor image. 115*4882a593Smuzhiyun */ 116*4882a593Smuzhiyun _edata_real = .; 117*4882a593Smuzhiyun } 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun _magic_sig = ZIMAGE_MAGIC(0x016f2818); 120*4882a593Smuzhiyun _magic_start = ZIMAGE_MAGIC(_start); 121*4882a593Smuzhiyun _magic_end = ZIMAGE_MAGIC(_edata); 122*4882a593Smuzhiyun _magic_table = ZIMAGE_MAGIC(_table_start - _start); 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun . = BSS_START; 125*4882a593Smuzhiyun __bss_start = .; 126*4882a593Smuzhiyun .bss : { *(.bss) } 127*4882a593Smuzhiyun _end = .; 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun . = ALIGN(8); /* the stack must be 64-bit aligned */ 130*4882a593Smuzhiyun .stack : { *(.stack) } 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun PROVIDE(__pecoff_data_size = ALIGN(512) - ADDR(.data)); 133*4882a593Smuzhiyun PROVIDE(__pecoff_end = ALIGN(512)); 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun STABS_DEBUG 136*4882a593Smuzhiyun DWARF_DEBUG 137*4882a593Smuzhiyun ARM_DETAILS 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun ARM_ASSERTS 140*4882a593Smuzhiyun} 141*4882a593SmuzhiyunASSERT(_edata_real == _edata, "error: zImage file size is incorrect"); 142