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