Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/usr.sbin/btxld/elfh.c
103755 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
*
4
* Copyright (c) 1998 Robert Nordier
5
* All rights reserved.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
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.
15
*
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.
27
*/
28
29
#include <sys/param.h>
30
#include <sys/endian.h>
31
32
#include <stddef.h>
33
#include "elfh.h"
34
35
#define SET_ME 0xeeeeeeee /* filled in by btxld */
36
37
/*
38
* ELF header template.
39
*/
40
const struct elfh elfhdr = {
41
{
42
{
43
ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, /* e_ident */
44
ELFCLASS32, ELFDATA2LSB, EV_CURRENT, 0,
45
'F', 'r', 'e', 'e', 'B', 'S', 'D', 0
46
},
47
htole16(ET_EXEC), /* e_type */
48
htole16(EM_386), /* e_machine */
49
htole32(EV_CURRENT), /* e_version */
50
htole32(SET_ME), /* e_entry */
51
htole32(offsetof(struct elfh, p)), /* e_phoff */
52
htole32(offsetof(struct elfh, sh)), /* e_shoff */
53
0, /* e_flags */
54
htole16(sizeof(elfhdr.e)), /* e_ehsize */
55
htole16(sizeof(elfhdr.p[0])), /* e_phentsize */
56
htole16(nitems(elfhdr.p)), /* e_phnum */
57
htole16(sizeof(elfhdr.sh[0])), /* e_shentsize */
58
htole16(nitems(elfhdr.sh)), /* e_shnum */
59
htole16(1) /* e_shstrndx */
60
},
61
{
62
{
63
htole32(PT_LOAD), /* p_type */
64
htole32(sizeof(elfhdr)), /* p_offset */
65
htole32(SET_ME), /* p_vaddr */
66
htole32(SET_ME), /* p_paddr */
67
htole32(SET_ME), /* p_filesz */
68
htole32(SET_ME), /* p_memsz */
69
htole32(PF_R | PF_X), /* p_flags */
70
htole32(0x1000) /* p_align */
71
},
72
{
73
htole32(PT_LOAD), /* p_type */
74
htole32(SET_ME), /* p_offset */
75
htole32(SET_ME), /* p_vaddr */
76
htole32(SET_ME), /* p_paddr */
77
htole32(SET_ME), /* p_filesz */
78
htole32(SET_ME), /* p_memsz */
79
htole32(PF_R | PF_W), /* p_flags */
80
htole32(0x1000) /* p_align */
81
}
82
},
83
{
84
{
85
0, htole32(SHT_NULL), 0, 0, 0, 0, htole32(SHN_UNDEF), 0, 0, 0
86
},
87
{
88
htole32(1), /* sh_name */
89
htole32(SHT_STRTAB), /* sh_type */
90
0, /* sh_flags */
91
0, /* sh_addr */
92
htole32(offsetof(struct elfh, shstrtab)), /* sh_offset */
93
htole32(sizeof(elfhdr.shstrtab)), /* sh_size */
94
htole32(SHN_UNDEF), /* sh_link */
95
0, /* sh_info */
96
htole32(1), /* sh_addralign */
97
0 /* sh_entsize */
98
},
99
{
100
htole32(0xb), /* sh_name */
101
htole32(SHT_PROGBITS), /* sh_type */
102
htole32(SHF_EXECINSTR | SHF_ALLOC), /* sh_flags */
103
htole32(SET_ME), /* sh_addr */
104
htole32(SET_ME), /* sh_offset */
105
htole32(SET_ME), /* sh_size */
106
htole32(SHN_UNDEF), /* sh_link */
107
0, /* sh_info */
108
htole32(4), /* sh_addralign */
109
0 /* sh_entsize */
110
},
111
{
112
htole32(0x11), /* sh_name */
113
htole32(SHT_PROGBITS), /* sh_type */
114
htole32(SHF_ALLOC | SHF_WRITE), /* sh_flags */
115
htole32(SET_ME), /* sh_addr */
116
htole32(SET_ME), /* sh_offset */
117
htole32(SET_ME), /* sh_size */
118
htole32(SHN_UNDEF), /* sh_link */
119
0, /* sh_info */
120
htole32(4), /* sh_addralign */
121
0 /* sh_entsize */
122
}
123
},
124
"\0.shstrtab\0.text\0.data" /* shstrtab */
125
};
126
127