UbixOS  2.0
elf64.h
Go to the documentation of this file.
1 /*-
2  * Copyright (c) 2002-2018 The UbixOS Project.
3  * All rights reserved.
4  *
5  * This was developed by Christopher W. Olsen for the UbixOS Project.
6  *
7  * Redistribution and use in source and binary forms, with or without modification, are permitted
8  * provided that the following conditions are met:
9  *
10  * 1) Redistributions of source code must retain the above copyright notice, this list of
11  * conditions, the following disclaimer and the list of authors.
12  * 2) Redistributions in binary form must reproduce the above copyright notice, this list of
13  * conditions, the following disclaimer and the list of authors in the documentation and/or
14  * other materials provided with the distribution.
15  * 3) Neither the name of the UbixOS Project nor the names of its contributors may be used to
16  * endorse or promote products derived from this software without specific prior written
17  * permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
20  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
22  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
24  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
26  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #ifndef _SYS_ELF64_H_
30 #define _SYS_ELF64_H_ 1
31 
32 #include <sys/elf_common.h>
33 
34 /*
35  * ELF definitions common to all 64-bit architectures.
36  */
37 
46 
47 /*
48  * Types of dynamic symbol hash table bucket and chain elements.
49  *
50  * This is inconsistent among 64 bit architectures, so a machine dependent
51  * typedef is required.
52  */
53 
55 
56 /* Non-standard class-dependent datatype used for abstraction. */
59 
60 /*
61  * ELF header.
62  */
63 
64 typedef struct {
65  unsigned char e_ident[EI_NIDENT]; /* File identification. */
66  Elf64_Half e_type; /* File type. */
67  Elf64_Half e_machine; /* Machine architecture. */
68  Elf64_Word e_version; /* ELF format version. */
69  Elf64_Addr e_entry; /* Entry point. */
70  Elf64_Off e_phoff; /* Program header file offset. */
71  Elf64_Off e_shoff; /* Section header file offset. */
72  Elf64_Word e_flags; /* Architecture-specific flags. */
73  Elf64_Half e_ehsize; /* Size of ELF header in bytes. */
74  Elf64_Half e_phentsize; /* Size of program header entry. */
75  Elf64_Half e_phnum; /* Number of program header entries. */
76  Elf64_Half e_shentsize; /* Size of section header entry. */
77  Elf64_Half e_shnum; /* Number of section header entries. */
78  Elf64_Half e_shstrndx; /* Section name strings section. */
79 } Elf64_Ehdr;
80 
81 /*
82  * Shared object information, found in SHT_MIPS_LIBLIST.
83  */
84 
85 typedef struct {
86  Elf64_Word l_name; /* The name of a shared object. */
87  Elf64_Word l_time_stamp; /* 64-bit timestamp. */
88  Elf64_Word l_checksum; /* Checksum of visible symbols, sizes. */
89  Elf64_Word l_version; /* Interface version string index. */
90  Elf64_Word l_flags; /* Flags (LL_*). */
91 } Elf64_Lib;
92 
93 /*
94  * Section header.
95  */
96 
97 typedef struct {
98  Elf64_Word sh_name; /* Section name (index into the
99  section header string table). */
100  Elf64_Word sh_type; /* Section type. */
101  Elf64_Xword sh_flags; /* Section flags. */
102  Elf64_Addr sh_addr; /* Address in memory image. */
103  Elf64_Off sh_offset; /* Offset in file. */
104  Elf64_Xword sh_size; /* Size in bytes. */
105  Elf64_Word sh_link; /* Index of a related section. */
106  Elf64_Word sh_info; /* Depends on section type. */
107  Elf64_Xword sh_addralign; /* Alignment in bytes. */
108  Elf64_Xword sh_entsize; /* Size of each entry in section. */
109 } Elf64_Shdr;
110 
111 /*
112  * Program header.
113  */
114 
115 typedef struct {
116  Elf64_Word p_type; /* Entry type. */
117  Elf64_Word p_flags; /* Access permission flags. */
118  Elf64_Off p_offset; /* File offset of contents. */
119  Elf64_Addr p_vaddr; /* Virtual address in memory image. */
120  Elf64_Addr p_paddr; /* Physical address (not used). */
121  Elf64_Xword p_filesz; /* Size of contents in file. */
122  Elf64_Xword p_memsz; /* Size of contents in memory. */
123  Elf64_Xword p_align; /* Alignment in memory and file. */
124 } Elf64_Phdr;
125 
126 /*
127  * Dynamic structure. The ".dynamic" section contains an array of them.
128  */
129 
130 typedef struct {
131  Elf64_Sxword d_tag; /* Entry type. */
132  union {
133  Elf64_Xword d_val; /* Integer value. */
134  Elf64_Addr d_ptr; /* Address value. */
135  } d_un;
136 } Elf64_Dyn;
137 
138 /*
139  * Relocation entries.
140  */
141 
142 /* Relocations that don't need an addend field. */
143 typedef struct {
144  Elf64_Addr r_offset; /* Location to be relocated. */
145  Elf64_Xword r_info; /* Relocation type and symbol index. */
146 } Elf64_Rel;
147 
148 /* Relocations that need an addend field. */
149 typedef struct {
150  Elf64_Addr r_offset; /* Location to be relocated. */
151  Elf64_Xword r_info; /* Relocation type and symbol index. */
152  Elf64_Sxword r_addend; /* Addend. */
153 } Elf64_Rela;
154 
155 /* Macros for accessing the fields of r_info. */
156 #define ELF64_R_SYM(info) ((info) >> 32)
157 #define ELF64_R_TYPE(info) ((info) & 0xffffffffL)
158 
159 /* Macro for constructing r_info from field values. */
160 #define ELF64_R_INFO(sym, type) (((sym) << 32) + ((type) & 0xffffffffL))
161 
162 #define ELF64_R_TYPE_DATA(info) (((Elf64_Xword)(info)<<32)>>40)
163 #define ELF64_R_TYPE_ID(info) (((Elf64_Xword)(info)<<56)>>56)
164 #define ELF64_R_TYPE_INFO(data, type) \
165  (((Elf64_Xword)(data)<<8)+(Elf64_Xword)(type))
166 
167 /*
168  * Note entry header
169  */
171 
172 /*
173  * Move entry
174  */
175 typedef struct {
176  Elf64_Lword m_value; /* symbol value */
177  Elf64_Xword m_info; /* size + index */
178  Elf64_Xword m_poffset; /* symbol offset */
179  Elf64_Half m_repeat; /* repeat count */
180  Elf64_Half m_stride; /* stride info */
181 } Elf64_Move;
182 
183 #define ELF64_M_SYM(info) ((info)>>8)
184 #define ELF64_M_SIZE(info) ((unsigned char)(info))
185 #define ELF64_M_INFO(sym, size) (((sym)<<8)+(unsigned char)(size))
186 
187 /*
188  * Hardware/Software capabilities entry
189  */
190 typedef struct {
191  Elf64_Xword c_tag; /* how to interpret value */
192  union {
195  } c_un;
196 } Elf64_Cap;
197 
198 /*
199  * Symbol table entries.
200  */
201 
202 typedef struct {
203  Elf64_Word st_name; /* String table index of name. */
204  unsigned char st_info; /* Type and binding information. */
205  unsigned char st_other; /* Reserved (not used). */
206  Elf64_Half st_shndx; /* Section index of symbol. */
207  Elf64_Addr st_value; /* Symbol value. */
208  Elf64_Xword st_size; /* Size of associated object. */
209 } Elf64_Sym;
210 
211 /* Macros for accessing the fields of st_info. */
212 #define ELF64_ST_BIND(info) ((info) >> 4)
213 #define ELF64_ST_TYPE(info) ((info) & 0xf)
214 
215 /* Macro for constructing st_info from field values. */
216 #define ELF64_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf))
217 
218 /* Macro for accessing the fields of st_other. */
219 #define ELF64_ST_VISIBILITY(oth) ((oth) & 0x3)
220 
221 /* Structures used by Sun & GNU-style symbol versioning. */
222 typedef struct {
230 } Elf64_Verdef;
231 
232 typedef struct {
235 } Elf64_Verdaux;
236 
237 typedef struct {
243 } Elf64_Verneed;
244 
245 typedef struct {
251 } Elf64_Vernaux;
252 
254 
255 typedef struct {
256  Elf64_Half si_boundto; /* direct bindings - symbol bound to */
257  Elf64_Half si_flags; /* per symbol flags */
258 } Elf64_Syminfo;
259 
260 typedef struct {
265 } Elf64_Chdr;
266 
267 #endif /* !_SYS_ELF64_H_ */
Elf64_Phdr::p_type
Elf64_Word p_type
Definition: elf64.h:116
Elf64_Vernaux::vna_name
Elf64_Word vna_name
Definition: elf64.h:249
Elf64_Verdef::vd_aux
Elf64_Word vd_aux
Definition: elf64.h:228
Elf64_Sym::st_value
Elf64_Addr st_value
Definition: elf64.h:207
Elf64_Rela::r_offset
Elf64_Addr r_offset
Definition: elf64.h:150
Elf64_Ehdr::e_shoff
Elf64_Off e_shoff
Definition: elf64.h:71
Elf64_Ehdr::e_version
Elf64_Word e_version
Definition: elf64.h:68
Elf64_Phdr::p_filesz
Elf64_Xword p_filesz
Definition: elf64.h:121
Elf64_Sword
int32_t Elf64_Sword
Definition: elf64.h:41
Elf64_Versym
Elf64_Half Elf64_Versym
Definition: elf64.h:253
Elf64_Off
uint64_t Elf64_Off
Definition: elf64.h:40
Elf64_Dyn::d_tag
Elf64_Sxword d_tag
Definition: elf64.h:131
Elf64_Shdr::sh_offset
Elf64_Off sh_offset
Definition: elf64.h:103
Elf64_Ehdr::e_flags
Elf64_Word e_flags
Definition: elf64.h:72
Elf64_Verneed
Definition: elf64.h:237
Elf64_Rela::r_addend
Elf64_Sxword r_addend
Definition: elf64.h:152
Elf_Note
Definition: elf_common.h:45
Elf64_Half
uint16_t Elf64_Half
Definition: elf64.h:39
Elf64_Chdr::ch_size
Elf64_Xword ch_size
Definition: elf64.h:263
Elf64_Cap::c_val
Elf64_Xword c_val
Definition: elf64.h:193
Elf64_Move::m_stride
Elf64_Half m_stride
Definition: elf64.h:180
Elf64_Syminfo::si_boundto
Elf64_Half si_boundto
Definition: elf64.h:256
uint64_t
__uint64_t uint64_t
Definition: types.h:47
Elf64_Ehdr::e_phoff
Elf64_Off e_phoff
Definition: elf64.h:70
Elf64_Sxword
int64_t Elf64_Sxword
Definition: elf64.h:42
Elf64_Chdr::ch_addralign
Elf64_Xword ch_addralign
Definition: elf64.h:264
Elf64_Sym::st_shndx
Elf64_Half st_shndx
Definition: elf64.h:206
Elf64_Move
Definition: elf64.h:175
Elf64_Nhdr
Elf_Note Elf64_Nhdr
Definition: elf64.h:170
Elf64_Shdr::sh_type
Elf64_Word sh_type
Definition: elf64.h:100
Elf64_Ehdr::e_type
Elf64_Half e_type
Definition: elf64.h:66
Elf64_Dyn::d_val
Elf64_Xword d_val
Definition: elf64.h:133
Elf64_Verdaux::vda_next
Elf64_Word vda_next
Definition: elf64.h:234
Elf64_Ehdr::e_shstrndx
Elf64_Half e_shstrndx
Definition: elf64.h:78
Elf64_Syminfo
Definition: elf64.h:255
Elf64_Dyn::d_ptr
Elf64_Addr d_ptr
Definition: elf64.h:134
Elf64_Rel::r_info
Elf64_Xword r_info
Definition: elf64.h:145
Elf64_Shdr::sh_link
Elf64_Word sh_link
Definition: elf64.h:105
Elf64_Verneed::vn_version
Elf64_Half vn_version
Definition: elf64.h:238
Elf64_Lib::l_version
Elf64_Word l_version
Definition: elf64.h:89
Elf64_Vernaux::vna_other
Elf64_Half vna_other
Definition: elf64.h:248
Elf64_Phdr::p_vaddr
Elf64_Addr p_vaddr
Definition: elf64.h:119
Elf64_Phdr
Definition: elf64.h:115
Elf64_Shdr::sh_name
Elf64_Word sh_name
Definition: elf64.h:98
Elf64_Vernaux
Definition: elf64.h:245
Elf64_Shdr::sh_addr
Elf64_Addr sh_addr
Definition: elf64.h:102
Elf64_Hashelt
Elf64_Word Elf64_Hashelt
Definition: elf64.h:54
Elf64_Lib::l_name
Elf64_Word l_name
Definition: elf64.h:86
uint16_t
__uint16_t uint16_t
Definition: types.h:45
Elf64_Verneed::vn_file
Elf64_Word vn_file
Definition: elf64.h:240
Elf64_Cap::c_ptr
Elf64_Addr c_ptr
Definition: elf64.h:194
Elf64_Chdr::ch_reserved
Elf64_Word ch_reserved
Definition: elf64.h:262
Elf64_Sym::st_size
Elf64_Xword st_size
Definition: elf64.h:208
Elf64_Rela::r_info
Elf64_Xword r_info
Definition: elf64.h:151
Elf64_Verdef::vd_cnt
Elf64_Half vd_cnt
Definition: elf64.h:226
Elf64_Ehdr::e_phnum
Elf64_Half e_phnum
Definition: elf64.h:75
Elf64_Xword
uint64_t Elf64_Xword
Definition: elf64.h:45
Elf64_Verdef::vd_next
Elf64_Word vd_next
Definition: elf64.h:229
Elf64_Phdr::p_paddr
Elf64_Addr p_paddr
Definition: elf64.h:120
Elf64_Ehdr
Definition: elf64.h:64
Elf64_Shdr
Definition: elf64.h:97
Elf64_Sym::st_other
unsigned char st_other
Definition: elf64.h:205
Elf64_Ehdr::e_shnum
Elf64_Half e_shnum
Definition: elf64.h:77
Elf64_Chdr
Definition: elf64.h:260
Elf64_Verdef::vd_hash
Elf64_Word vd_hash
Definition: elf64.h:227
Elf64_Sym::st_info
unsigned char st_info
Definition: elf64.h:204
Elf64_Verdef::vd_flags
Elf64_Half vd_flags
Definition: elf64.h:224
Elf64_Ehdr::e_shentsize
Elf64_Half e_shentsize
Definition: elf64.h:76
uint32_t
__uint32_t uint32_t
Definition: types.h:46
Elf64_Shdr::sh_flags
Elf64_Xword sh_flags
Definition: elf64.h:101
Elf64_Phdr::p_align
Elf64_Xword p_align
Definition: elf64.h:123
int32_t
__int32_t int32_t
Definition: types.h:108
Elf64_Cap::c_tag
Elf64_Xword c_tag
Definition: elf64.h:191
Elf64_Chdr::ch_type
Elf64_Word ch_type
Definition: elf64.h:261
Elf64_Dyn
Definition: elf64.h:130
Elf64_Syminfo::si_flags
Elf64_Half si_flags
Definition: elf64.h:257
EI_NIDENT
#define EI_NIDENT
Definition: elf_common.h:130
Elf64_Phdr::p_offset
Elf64_Off p_offset
Definition: elf64.h:118
Elf64_Shdr::sh_entsize
Elf64_Xword sh_entsize
Definition: elf64.h:108
Elf64_Phdr::p_flags
Elf64_Word p_flags
Definition: elf64.h:117
int64_t
__int64_t int64_t
Definition: types.h:113
Elf64_Lword
uint64_t Elf64_Lword
Definition: elf64.h:44
Elf64_Ehdr::e_phentsize
Elf64_Half e_phentsize
Definition: elf64.h:74
Elf64_Move::m_repeat
Elf64_Half m_repeat
Definition: elf64.h:179
Elf64_Addr
uint64_t Elf64_Addr
Definition: elf64.h:38
Elf64_Ehdr::e_machine
Elf64_Half e_machine
Definition: elf64.h:67
Elf64_Lib::l_time_stamp
Elf64_Word l_time_stamp
Definition: elf64.h:87
Elf64_Ehdr::e_entry
Elf64_Addr e_entry
Definition: elf64.h:69
Elf64_Lib::l_flags
Elf64_Word l_flags
Definition: elf64.h:90
Elf64_Verneed::vn_cnt
Elf64_Half vn_cnt
Definition: elf64.h:239
Elf64_Cap
Definition: elf64.h:190
Elf64_Verneed::vn_aux
Elf64_Word vn_aux
Definition: elf64.h:241
Elf64_Verdaux
Definition: elf64.h:232
Elf64_Move::m_value
Elf64_Lword m_value
Definition: elf64.h:176
Elf64_Verdef::vd_version
Elf64_Half vd_version
Definition: elf64.h:223
elf_common.h
Elf64_Rel
Definition: elf64.h:143
Elf64_Vernaux::vna_hash
Elf64_Word vna_hash
Definition: elf64.h:246
Elf64_Vernaux::vna_flags
Elf64_Half vna_flags
Definition: elf64.h:247
Elf64_Rela
Definition: elf64.h:149
Elf64_Size
Elf64_Xword Elf64_Size
Definition: elf64.h:57
Elf64_Verneed::vn_next
Elf64_Word vn_next
Definition: elf64.h:242
Elf64_Shdr::sh_info
Elf64_Word sh_info
Definition: elf64.h:106
Elf64_Lib::l_checksum
Elf64_Word l_checksum
Definition: elf64.h:88
Elf64_Verdaux::vda_name
Elf64_Word vda_name
Definition: elf64.h:233
Elf64_Rel::r_offset
Elf64_Addr r_offset
Definition: elf64.h:144
Elf64_Word
uint32_t Elf64_Word
Definition: elf64.h:43
Elf64_Sym
Definition: elf64.h:202
Elf64_Shdr::sh_size
Elf64_Xword sh_size
Definition: elf64.h:104
Elf64_Shdr::sh_addralign
Elf64_Xword sh_addralign
Definition: elf64.h:107
Elf64_Ehdr::e_ehsize
Elf64_Half e_ehsize
Definition: elf64.h:73
Elf64_Lib
Definition: elf64.h:85
Elf64_Move::m_poffset
Elf64_Xword m_poffset
Definition: elf64.h:178
Elf64_Verdef
Definition: elf64.h:222
Elf64_Sym::st_name
Elf64_Word st_name
Definition: elf64.h:203
Elf64_Vernaux::vna_next
Elf64_Word vna_next
Definition: elf64.h:250
Elf64_Ssize
Elf64_Sxword Elf64_Ssize
Definition: elf64.h:58
Elf64_Verdef::vd_ndx
Elf64_Half vd_ndx
Definition: elf64.h:225
Elf64_Phdr::p_memsz
Elf64_Xword p_memsz
Definition: elf64.h:122
Elf64_Move::m_info
Elf64_Xword m_info
Definition: elf64.h:177