2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4 * Copyright (c) 1998 Robert Nordier
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
21 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
22 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
26 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #include <sys/types.h>
32 #include <sys/endian.h>
37 #define SET_ME 0xeeeeeeee /* filled in by btxld */
40 * ELF header template.
42 const struct elfh elfhdr = {
45 ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, /* e_ident */
46 ELFCLASS32, ELFDATA2LSB, EV_CURRENT, 0,
47 'F', 'r', 'e', 'e', 'B', 'S', 'D', 0
49 htole16(ET_EXEC), /* e_type */
50 htole16(EM_386), /* e_machine */
51 htole32(EV_CURRENT), /* e_version */
52 htole32(SET_ME), /* e_entry */
53 htole32(offsetof(struct elfh, p)), /* e_phoff */
54 htole32(offsetof(struct elfh, sh)), /* e_shoff */
56 htole16(sizeof(elfhdr.e)), /* e_ehsize */
57 htole16(sizeof(elfhdr.p[0])), /* e_phentsize */
58 htole16(sizeof(elfhdr.p) / sizeof(elfhdr.p[0])), /* e_phnum */
59 htole16(sizeof(elfhdr.sh[0])), /* e_shentsize */
60 htole16(sizeof(elfhdr.sh) / sizeof(elfhdr.sh[0])), /* e_shnum */
61 htole16(1) /* e_shstrndx */
65 htole32(PT_LOAD), /* p_type */
66 htole32(sizeof(elfhdr)), /* p_offset */
67 htole32(SET_ME), /* p_vaddr */
68 htole32(SET_ME), /* p_paddr */
69 htole32(SET_ME), /* p_filesz */
70 htole32(SET_ME), /* p_memsz */
71 htole32(PF_R | PF_X), /* p_flags */
72 htole32(0x1000) /* p_align */
75 htole32(PT_LOAD), /* p_type */
76 htole32(SET_ME), /* p_offset */
77 htole32(SET_ME), /* p_vaddr */
78 htole32(SET_ME), /* p_paddr */
79 htole32(SET_ME), /* p_filesz */
80 htole32(SET_ME), /* p_memsz */
81 htole32(PF_R | PF_W), /* p_flags */
82 htole32(0x1000) /* p_align */
87 0, htole32(SHT_NULL), 0, 0, 0, 0, htole32(SHN_UNDEF), 0, 0, 0
90 htole32(1), /* sh_name */
91 htole32(SHT_STRTAB), /* sh_type */
94 htole32(offsetof(struct elfh, shstrtab)), /* sh_offset */
95 htole32(sizeof(elfhdr.shstrtab)), /* sh_size */
96 htole32(SHN_UNDEF), /* sh_link */
98 htole32(1), /* sh_addralign */
102 htole32(0xb), /* sh_name */
103 htole32(SHT_PROGBITS), /* sh_type */
104 htole32(SHF_EXECINSTR | SHF_ALLOC), /* sh_flags */
105 htole32(SET_ME), /* sh_addr */
106 htole32(SET_ME), /* sh_offset */
107 htole32(SET_ME), /* sh_size */
108 htole32(SHN_UNDEF), /* sh_link */
110 htole32(4), /* sh_addralign */
114 htole32(0x11), /* sh_name */
115 htole32(SHT_PROGBITS), /* sh_type */
116 htole32(SHF_ALLOC | SHF_WRITE), /* sh_flags */
117 htole32(SET_ME), /* sh_addr */
118 htole32(SET_ME), /* sh_offset */
119 htole32(SET_ME), /* sh_size */
120 htole32(SHN_UNDEF), /* sh_link */
122 htole32(4), /* sh_addralign */
126 "\0.shstrtab\0.text\0.data" /* shstrtab */