1/* $OpenBSD: ld.script,v 1.12 2021/03/07 23:10:54 mortimer Exp $ */ 2 3/* 4 * Copyright (c) 2015 Mike Larkin <mlarkin@openbsd.org> 5 * Copyright (c) 2009 Tobias Weingartner <weingart@tepid.org> 6 * 7 * Permission to use, copy, modify, and distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") 21OUTPUT_ARCH(i386) 22 23/* Define how we want out ELF binary to look like. */ 24PHDRS 25{ 26 text PT_LOAD FILEHDR PHDRS; 27 rodata PT_LOAD FLAGS (4); 28 data PT_LOAD; 29 bss PT_LOAD; 30 openbsd_randomize PT_OPENBSD_RANDOMIZE; 31} 32 33/* 34 * If we want the text/rodata/data sections aligned on 2M boundaries, 35 * we could use the following instead. Note, file size would increase 36 * due to necessary padding. 37 * 38 *__ALIGN_SIZE = 0x200000; 39 */ 40__ALIGN_SIZE = 0x1000; 41__kernel_base_virt = 0xd0200000 + SIZEOF_HEADERS; 42__kernel_base_phys = __kernel_base_virt & 0xfffffff; 43 44ENTRY(start) 45SECTIONS 46{ 47 __kernel_text_virt = __kernel_base_virt; 48 __kernel_text_phys = __kernel_base_phys; 49 .text ALIGN(__kernel_text_virt, __ALIGN_SIZE) : 50 AT (ALIGN(__kernel_text_phys, __ALIGN_SIZE)) 51 { 52 __text_start = ABSOLUTE(.) & 0xfffff000; 53 __text_size = SIZEOF(.text); 54 __text_load = LOADADDR(.text); 55 locore0.o(.text) 56 *(.text .text.*) 57 } :text =0xcccccccc 58 59 . = ALIGN(__ALIGN_SIZE); 60 __kernel_kutext_phys = . & 0xfffffff; 61 .kutext : AT (__kernel_kutext_phys) 62 { 63 __kutext_start = ABSOLUTE(.); 64 *(.kutext) 65 __kutext_end = ABSOLUTE(.); 66 } :text =0xcccccccc 67 68 PROVIDE (__etext = .); 69 PROVIDE (etext = .); 70 _etext = .; 71 72 /* Move rodata to the next page, so we can nuke X and W bit on them */ 73 . = ALIGN(__ALIGN_SIZE); 74 __kernel_rodata_virt = .; 75 __kernel_rodata_phys = . & 0xfffffff; 76 .rodata (__kernel_rodata_virt) : AT (__kernel_rodata_phys) 77 { 78 __rodata_start = ABSOLUTE(.); 79 __rodata_size = SIZEOF(.rodata); 80 __rodata_load = LOADADDR(.rodata); 81 *(.rodata .rodata.*) 82 *(.codepatch) 83 *(.codepatchend) 84 } :rodata =0xcccccccc 85 . = ALIGN(0x1000); 86 __kernel_randomdata_phys = . & 0xfffffff; 87 .openbsd.randomdata : AT (__kernel_randomdata_phys) 88 { 89 __retguard_start = ABSOLUTE(.); 90 *(.openbsd.randomdata.retguard .openbsd.randomdata.retguard.*) 91 /* XXX . = ALIGN(__ALIGN_SIZE); */ 92 __retguard_end = ABSOLUTE(.); 93 *(.openbsd.randomdata .openbsd.randomdata.*) 94 } :rodata :openbsd_randomize =0xcccccccc 95 . = ALIGN(0x1000); 96 PROVIDE (erodata = .); 97 _erodata = .; 98 99 /* Move data to the next page, so we can add W bit on them */ 100 . = ALIGN(__ALIGN_SIZE); 101 __kernel_data_virt = .; 102 __kernel_data_phys = . & 0xfffffff; 103 .data (__kernel_data_virt) : AT (__kernel_data_phys) 104 { 105 __data_start = ABSOLUTE(.); 106 __data_size = SIZEOF(.data); 107 __data_load = LOADADDR(.data); 108 *(.data .data.*) 109 } :data =0xcccccccc 110 111 . = ALIGN(__ALIGN_SIZE); 112 __kernel_kudata_phys = . & 0xfffffff; 113 .kudata : AT (__kernel_kudata_phys) 114 { 115 __kudata_start = ABSOLUTE(.); 116 *(.kudata) 117 __kudata_end = ABSOLUTE(.); 118 } 119 120 . = ALIGN(0x1000); 121 PROVIDE (edata = .); 122 _edata = .; 123 124 /* BSS starts right after padded data */ 125 __kernel_bss_virt = .; 126 __kernel_bss_phys = . & 0xfffffff; 127 .bss (__kernel_bss_virt) : AT (__kernel_bss_phys) 128 { 129 __bss_start = ABSOLUTE(.); 130 __bss_size = SIZEOF(.bss); 131 __bss_load = LOADADDR(.bss); 132 *(.bss .bss.*) 133 *(COMMON) 134 /* Align after .bss to ensure correct alignment even if the 135 * .bss section disappears because there are no input sections. 136 */ 137 . = ALIGN(0x1000); 138 } :bss 139 __kernel_bss_end = .; 140 . = ALIGN(0x1000); 141 _end = .; 142 PROVIDE (end = .); 143 __kernel_end_phys = . & 0xfffffff; 144 145 /* XXX - hack alert, since we are not C++, nuke these */ 146 /DISCARD/ : 147 { 148 *(.note.GNU-stack) 149 *(.eh_frame) 150 } 151} 152