1/* $OpenBSD: ld.script,v 1.4 2016/09/03 13:13:07 deraadt 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; 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 44/* We use physical address to jump to kernel */ 45start_phys = LOADADDR(.text) + (start - __kernel_base_virt); 46ENTRY(start_phys) 47SECTIONS 48{ 49 __kernel_text_virt = __kernel_base_virt; 50 __kernel_text_phys = __kernel_base_phys; 51 .text (__kernel_text_virt) : AT (__kernel_text_phys) 52 { 53 __text_start = ABSOLUTE(.) & 0xfffff000; 54 __text_size = SIZEOF(.text); 55 __text_load = LOADADDR(.text); 56 locore.o(.text) 57 *(.text .text.*) 58 } :text 59 PROVIDE (__etext = .); 60 PROVIDE (etext = .); 61 _etext = .; 62 63 /* Move rodata to the next page, so we can nuke X and W bit on them */ 64 . = ALIGN(__ALIGN_SIZE); 65 __kernel_rodata_virt = .; 66 __kernel_rodata_phys = . & 0xfffffff; 67 .rodata (__kernel_rodata_virt) : AT (__kernel_rodata_phys) 68 { 69 __rodata_start = ABSOLUTE(.); 70 __rodata_size = SIZEOF(.rodata); 71 __rodata_load = LOADADDR(.rodata); 72 *(.rodata .rodata.*) 73 *(.codepatch) 74 *(.codepatchend) 75 } :rodata 76 . = ALIGN(0x1000); 77 __kernel_randomdata_phys = . & 0xfffffff; 78 .openbsd.randomdata : AT (__kernel_randomdata_phys) 79 { 80 *(.openbsd.randomdata) 81 } :data :openbsd_randomize 82 . = ALIGN(0x1000); 83 PROVIDE (erodata = .); 84 _erodata = .; 85 86 /* Move data to the next page, so we can add W bit on them */ 87 . = ALIGN(__ALIGN_SIZE); 88 __kernel_data_virt = .; 89 __kernel_data_phys = . & 0xfffffff; 90 .data (__kernel_data_virt) : AT (__kernel_data_phys) 91 { 92 __data_start = ABSOLUTE(.); 93 __data_size = SIZEOF(.data); 94 __data_load = LOADADDR(.data); 95 *(.data .data.*) 96 } :data 97 . = ALIGN(0x1000); 98 PROVIDE (edata = .); 99 _edata = .; 100 101 /* BSS starts right after padded data */ 102 __kernel_bss_virt = .; 103 __kernel_bss_phys = . & 0xfffffff; 104 .bss (__kernel_bss_virt) : AT (__kernel_bss_phys) 105 { 106 __bss_start = ABSOLUTE(.); 107 __bss_size = SIZEOF(.bss); 108 __bss_load = LOADADDR(.bss); 109 *(.bss .bss.*) 110 *(COMMON) 111 /* Align after .bss to ensure correct alignment even if the 112 * .bss section disappears because there are no input sections. 113 */ 114 . = ALIGN(0x1000); 115 } :bss 116 __kernel_bss_end = .; 117 . = ALIGN(0x1000); 118 _end = .; 119 PROVIDE (end = .); 120 __kernel_end_phys = . & 0xfffffff; 121 122 /* XXX - hack alert, since we are not C++, nuke these */ 123 /DISCARD/ : 124 { 125 *(.note.GNU-stack) 126 *(.eh_frame) 127 } 128} 129