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