Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / sys / elf64.h @ 14

History | View | Annotate | Download (7.25 KB)

1
/*-
2
 * Copyright (c) 1996-1998 John D. Polstra.
3
 * All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 * 1. Redistributions of source code must retain the above copyright
9
 *    notice, this list of conditions and the following disclaimer.
10
 * 2. Redistributions in binary form must reproduce the above copyright
11
 *    notice, this list of conditions and the following disclaimer in the
12
 *    documentation and/or other materials provided with the distribution.
13
 *
14
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
 * SUCH DAMAGE.
25
 *
26
 * $FreeBSD$
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

    
38
typedef uint64_t        Elf64_Addr;
39
typedef uint16_t        Elf64_Half;
40
typedef uint64_t        Elf64_Off;
41
typedef int32_t                Elf64_Sword;
42
typedef int64_t                Elf64_Sxword;
43
typedef uint32_t        Elf64_Word;
44
typedef uint64_t        Elf64_Lword;
45
typedef uint64_t        Elf64_Xword;
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

    
54
typedef Elf64_Word        Elf64_Hashelt;
55

    
56
/* Non-standard class-dependent datatype used for abstraction. */
57
typedef Elf64_Xword        Elf64_Size;
58
typedef Elf64_Sxword        Elf64_Ssize;
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
 * Section header.
83
 */
84

    
85
typedef struct {
86
        Elf64_Word        sh_name;        /* Section name (index into the
87
                                           section header string table). */
88
        Elf64_Word        sh_type;        /* Section type. */
89
        Elf64_Xword        sh_flags;        /* Section flags. */
90
        Elf64_Addr        sh_addr;        /* Address in memory image. */
91
        Elf64_Off        sh_offset;        /* Offset in file. */
92
        Elf64_Xword        sh_size;        /* Size in bytes. */
93
        Elf64_Word        sh_link;        /* Index of a related section. */
94
        Elf64_Word        sh_info;        /* Depends on section type. */
95
        Elf64_Xword        sh_addralign;        /* Alignment in bytes. */
96
        Elf64_Xword        sh_entsize;        /* Size of each entry in section. */
97
} Elf64_Shdr;
98

    
99
/*
100
 * Program header.
101
 */
102

    
103
typedef struct {
104
        Elf64_Word        p_type;                /* Entry type. */
105
        Elf64_Word        p_flags;        /* Access permission flags. */
106
        Elf64_Off        p_offset;        /* File offset of contents. */
107
        Elf64_Addr        p_vaddr;        /* Virtual address in memory image. */
108
        Elf64_Addr        p_paddr;        /* Physical address (not used). */
109
        Elf64_Xword        p_filesz;        /* Size of contents in file. */
110
        Elf64_Xword        p_memsz;        /* Size of contents in memory. */
111
        Elf64_Xword        p_align;        /* Alignment in memory and file. */
112
} Elf64_Phdr;
113

    
114
/*
115
 * Dynamic structure.  The ".dynamic" section contains an array of them.
116
 */
117

    
118
typedef struct {
119
        Elf64_Sxword        d_tag;                /* Entry type. */
120
        union {
121
                Elf64_Xword        d_val;        /* Integer value. */
122
                Elf64_Addr        d_ptr;        /* Address value. */
123
        } d_un;
124
} Elf64_Dyn;
125

    
126
/*
127
 * Relocation entries.
128
 */
129

    
130
/* Relocations that don't need an addend field. */
131
typedef struct {
132
        Elf64_Addr        r_offset;        /* Location to be relocated. */
133
        Elf64_Xword        r_info;                /* Relocation type and symbol index. */
134
} Elf64_Rel;
135

    
136
/* Relocations that need an addend field. */
137
typedef struct {
138
        Elf64_Addr        r_offset;        /* Location to be relocated. */
139
        Elf64_Xword        r_info;                /* Relocation type and symbol index. */
140
        Elf64_Sxword        r_addend;        /* Addend. */
141
} Elf64_Rela;
142

    
143
/* Macros for accessing the fields of r_info. */
144
#define        ELF64_R_SYM(info)        ((info) >> 32)
145
#define        ELF64_R_TYPE(info)        ((info) & 0xffffffffL)
146

    
147
/* Macro for constructing r_info from field values. */
148
#define        ELF64_R_INFO(sym, type)        (((sym) << 32) + ((type) & 0xffffffffL))
149

    
150
#define        ELF64_R_TYPE_DATA(info)        (((Elf64_Xword)(info)<<32)>>40)
151
#define        ELF64_R_TYPE_ID(info)        (((Elf64_Xword)(info)<<56)>>56)
152
#define        ELF64_R_TYPE_INFO(data, type)        \
153
                                (((Elf64_Xword)(data)<<8)+(Elf64_Xword)(type))
154

    
155
/*
156
 *        Note entry header
157
 */
158
typedef Elf_Note Elf64_Nhdr;
159

    
160
/*
161
 *        Move entry
162
 */
163
typedef struct {
164
        Elf64_Lword        m_value;        /* symbol value */
165
        Elf64_Xword         m_info;                /* size + index */
166
        Elf64_Xword        m_poffset;        /* symbol offset */
167
        Elf64_Half        m_repeat;        /* repeat count */
168
        Elf64_Half        m_stride;        /* stride info */
169
} Elf64_Move;
170

    
171
#define        ELF64_M_SYM(info)        ((info)>>8)
172
#define        ELF64_M_SIZE(info)        ((unsigned char)(info))
173
#define        ELF64_M_INFO(sym, size)        (((sym)<<8)+(unsigned char)(size))
174

    
175
/*
176
 *        Hardware/Software capabilities entry
177
 */
178
typedef struct {
179
        Elf64_Xword        c_tag;                /* how to interpret value */
180
        union {
181
                Elf64_Xword        c_val;
182
                Elf64_Addr        c_ptr;
183
        } c_un;
184
} Elf64_Cap;
185

    
186
/*
187
 * Symbol table entries.
188
 */
189

    
190
typedef struct {
191
        Elf64_Word        st_name;        /* String table index of name. */
192
        unsigned char        st_info;        /* Type and binding information. */
193
        unsigned char        st_other;        /* Reserved (not used). */
194
        Elf64_Half        st_shndx;        /* Section index of symbol. */
195
        Elf64_Addr        st_value;        /* Symbol value. */
196
        Elf64_Xword        st_size;        /* Size of associated object. */
197
} Elf64_Sym;
198

    
199
/* Macros for accessing the fields of st_info. */
200
#define        ELF64_ST_BIND(info)                ((info) >> 4)
201
#define        ELF64_ST_TYPE(info)                ((info) & 0xf)
202

    
203
/* Macro for constructing st_info from field values. */
204
#define        ELF64_ST_INFO(bind, type)        (((bind) << 4) + ((type) & 0xf))
205

    
206
/* Macro for accessing the fields of st_other. */
207
#define        ELF64_ST_VISIBILITY(oth)        ((oth) & 0x3)
208

    
209
/* Structures used by Sun & GNU-style symbol versioning. */
210
typedef struct {
211
        Elf64_Half        vd_version;
212
        Elf64_Half        vd_flags;
213
        Elf64_Half        vd_ndx;
214
        Elf64_Half        vd_cnt;
215
        Elf64_Word        vd_hash;
216
        Elf64_Word        vd_aux;
217
        Elf64_Word        vd_next;
218
} Elf64_Verdef;
219

    
220
typedef struct {
221
        Elf64_Word        vda_name;
222
        Elf64_Word        vda_next;
223
} Elf64_Verdaux;
224

    
225
typedef struct {
226
        Elf64_Half        vn_version;
227
        Elf64_Half        vn_cnt;
228
        Elf64_Word        vn_file;
229
        Elf64_Word        vn_aux;
230
        Elf64_Word        vn_next;
231
} Elf64_Verneed;
232

    
233
typedef struct {
234
        Elf64_Word        vna_hash;
235
        Elf64_Half        vna_flags;
236
        Elf64_Half        vna_other;
237
        Elf64_Word        vna_name;
238
        Elf64_Word        vna_next;
239
} Elf64_Vernaux;
240

    
241
typedef Elf64_Half Elf64_Versym;
242

    
243
typedef struct {
244
        Elf64_Half        si_boundto;        /* direct bindings - symbol bound to */
245
        Elf64_Half        si_flags;        /* per symbol flags */
246
} Elf64_Syminfo;
247

    
248
#endif /* !_SYS_ELF64_H_ */