11de7b4b8SPedro F. Giffuni /*- 24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 31de7b4b8SPedro F. Giffuni * 49c9f4492SRobert Nordier * Copyright (c) 1998 Robert Nordier 59c9f4492SRobert Nordier * All rights reserved. 69c9f4492SRobert Nordier * 79c9f4492SRobert Nordier * Redistribution and use in source and binary forms, with or without 89c9f4492SRobert Nordier * modification, are permitted provided that the following conditions 99c9f4492SRobert Nordier * are met: 109c9f4492SRobert Nordier * 1. Redistributions of source code must retain the above copyright 119c9f4492SRobert Nordier * notice, this list of conditions and the following disclaimer. 129c9f4492SRobert Nordier * 2. Redistributions in binary form must reproduce the above copyright 139c9f4492SRobert Nordier * notice, this list of conditions and the following disclaimer in the 149c9f4492SRobert Nordier * documentation and/or other materials provided with the distribution. 159c9f4492SRobert Nordier * 169c9f4492SRobert Nordier * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND 179c9f4492SRobert Nordier * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 189c9f4492SRobert Nordier * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 199c9f4492SRobert Nordier * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS 209c9f4492SRobert Nordier * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 219c9f4492SRobert Nordier * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 229c9f4492SRobert Nordier * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 239c9f4492SRobert Nordier * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 249c9f4492SRobert Nordier * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 259c9f4492SRobert Nordier * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 269c9f4492SRobert Nordier * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279c9f4492SRobert Nordier */ 289c9f4492SRobert Nordier 29*8918cc95SElyes Haouas #include <sys/param.h> 3049a39408SDavid E. O'Brien #include <sys/endian.h> 31b0ca5f03SMarcel Moolenaar 329c9f4492SRobert Nordier #include <stddef.h> 339c9f4492SRobert Nordier #include "elfh.h" 349c9f4492SRobert Nordier 359c9f4492SRobert Nordier #define SET_ME 0xeeeeeeee /* filled in by btxld */ 369c9f4492SRobert Nordier 379c9f4492SRobert Nordier /* 389c9f4492SRobert Nordier * ELF header template. 399c9f4492SRobert Nordier */ 409c9f4492SRobert Nordier const struct elfh elfhdr = { 419c9f4492SRobert Nordier { 429c9f4492SRobert Nordier { 439c9f4492SRobert Nordier ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, /* e_ident */ 449c9f4492SRobert Nordier ELFCLASS32, ELFDATA2LSB, EV_CURRENT, 0, 459c9f4492SRobert Nordier 'F', 'r', 'e', 'e', 'B', 'S', 'D', 0 469c9f4492SRobert Nordier }, 4749a39408SDavid E. O'Brien htole16(ET_EXEC), /* e_type */ 4849a39408SDavid E. O'Brien htole16(EM_386), /* e_machine */ 4949a39408SDavid E. O'Brien htole32(EV_CURRENT), /* e_version */ 5049a39408SDavid E. O'Brien htole32(SET_ME), /* e_entry */ 5149a39408SDavid E. O'Brien htole32(offsetof(struct elfh, p)), /* e_phoff */ 5249a39408SDavid E. O'Brien htole32(offsetof(struct elfh, sh)), /* e_shoff */ 539c9f4492SRobert Nordier 0, /* e_flags */ 5449a39408SDavid E. O'Brien htole16(sizeof(elfhdr.e)), /* e_ehsize */ 5549a39408SDavid E. O'Brien htole16(sizeof(elfhdr.p[0])), /* e_phentsize */ 56*8918cc95SElyes Haouas htole16(nitems(elfhdr.p)), /* e_phnum */ 5749a39408SDavid E. O'Brien htole16(sizeof(elfhdr.sh[0])), /* e_shentsize */ 58*8918cc95SElyes Haouas htole16(nitems(elfhdr.sh)), /* e_shnum */ 5949a39408SDavid E. O'Brien htole16(1) /* e_shstrndx */ 609c9f4492SRobert Nordier }, 619c9f4492SRobert Nordier { 629c9f4492SRobert Nordier { 6349a39408SDavid E. O'Brien htole32(PT_LOAD), /* p_type */ 6449a39408SDavid E. O'Brien htole32(sizeof(elfhdr)), /* p_offset */ 6549a39408SDavid E. O'Brien htole32(SET_ME), /* p_vaddr */ 6649a39408SDavid E. O'Brien htole32(SET_ME), /* p_paddr */ 6749a39408SDavid E. O'Brien htole32(SET_ME), /* p_filesz */ 6849a39408SDavid E. O'Brien htole32(SET_ME), /* p_memsz */ 6949a39408SDavid E. O'Brien htole32(PF_R | PF_X), /* p_flags */ 7049a39408SDavid E. O'Brien htole32(0x1000) /* p_align */ 719c9f4492SRobert Nordier }, 729c9f4492SRobert Nordier { 7349a39408SDavid E. O'Brien htole32(PT_LOAD), /* p_type */ 7449a39408SDavid E. O'Brien htole32(SET_ME), /* p_offset */ 7549a39408SDavid E. O'Brien htole32(SET_ME), /* p_vaddr */ 7649a39408SDavid E. O'Brien htole32(SET_ME), /* p_paddr */ 7749a39408SDavid E. O'Brien htole32(SET_ME), /* p_filesz */ 7849a39408SDavid E. O'Brien htole32(SET_ME), /* p_memsz */ 7949a39408SDavid E. O'Brien htole32(PF_R | PF_W), /* p_flags */ 8049a39408SDavid E. O'Brien htole32(0x1000) /* p_align */ 819c9f4492SRobert Nordier } 829c9f4492SRobert Nordier }, 839c9f4492SRobert Nordier { 849c9f4492SRobert Nordier { 8549a39408SDavid E. O'Brien 0, htole32(SHT_NULL), 0, 0, 0, 0, htole32(SHN_UNDEF), 0, 0, 0 869c9f4492SRobert Nordier }, 879c9f4492SRobert Nordier { 8849a39408SDavid E. O'Brien htole32(1), /* sh_name */ 8949a39408SDavid E. O'Brien htole32(SHT_STRTAB), /* sh_type */ 909c9f4492SRobert Nordier 0, /* sh_flags */ 919c9f4492SRobert Nordier 0, /* sh_addr */ 9249a39408SDavid E. O'Brien htole32(offsetof(struct elfh, shstrtab)), /* sh_offset */ 9349a39408SDavid E. O'Brien htole32(sizeof(elfhdr.shstrtab)), /* sh_size */ 9449a39408SDavid E. O'Brien htole32(SHN_UNDEF), /* sh_link */ 959c9f4492SRobert Nordier 0, /* sh_info */ 9649a39408SDavid E. O'Brien htole32(1), /* sh_addralign */ 979c9f4492SRobert Nordier 0 /* sh_entsize */ 989c9f4492SRobert Nordier }, 999c9f4492SRobert Nordier { 10049a39408SDavid E. O'Brien htole32(0xb), /* sh_name */ 10149a39408SDavid E. O'Brien htole32(SHT_PROGBITS), /* sh_type */ 10249a39408SDavid E. O'Brien htole32(SHF_EXECINSTR | SHF_ALLOC), /* sh_flags */ 10349a39408SDavid E. O'Brien htole32(SET_ME), /* sh_addr */ 10449a39408SDavid E. O'Brien htole32(SET_ME), /* sh_offset */ 10549a39408SDavid E. O'Brien htole32(SET_ME), /* sh_size */ 10649a39408SDavid E. O'Brien htole32(SHN_UNDEF), /* sh_link */ 1079c9f4492SRobert Nordier 0, /* sh_info */ 10849a39408SDavid E. O'Brien htole32(4), /* sh_addralign */ 1099c9f4492SRobert Nordier 0 /* sh_entsize */ 1109c9f4492SRobert Nordier }, 1119c9f4492SRobert Nordier { 11249a39408SDavid E. O'Brien htole32(0x11), /* sh_name */ 11349a39408SDavid E. O'Brien htole32(SHT_PROGBITS), /* sh_type */ 11449a39408SDavid E. O'Brien htole32(SHF_ALLOC | SHF_WRITE), /* sh_flags */ 11549a39408SDavid E. O'Brien htole32(SET_ME), /* sh_addr */ 11649a39408SDavid E. O'Brien htole32(SET_ME), /* sh_offset */ 11749a39408SDavid E. O'Brien htole32(SET_ME), /* sh_size */ 11849a39408SDavid E. O'Brien htole32(SHN_UNDEF), /* sh_link */ 1199c9f4492SRobert Nordier 0, /* sh_info */ 12049a39408SDavid E. O'Brien htole32(4), /* sh_addralign */ 1219c9f4492SRobert Nordier 0 /* sh_entsize */ 1229c9f4492SRobert Nordier } 1239c9f4492SRobert Nordier }, 1249c9f4492SRobert Nordier "\0.shstrtab\0.text\0.data" /* shstrtab */ 1259c9f4492SRobert Nordier }; 126