Add file 4.12.
[dragonfly.git] / contrib / file-4.12 / src / readelf.h
1 /*
2  * Copyright (c) Christos Zoulas 2003.
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 immediately at the beginning of the file, without modification,
10  *    this list of conditions, and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *  
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
19  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  */
27 /*
28  * @(#)Id: readelf.h,v 1.9 2002/05/16 18:45:56 christos Exp
29  *
30  * Provide elf data structures for non-elf machines, allowing file
31  * non-elf hosts to determine if an elf binary is stripped.
32  * Note: cobbled from the linux header file, with modifications
33  */
34 #ifndef __fake_elf_h__
35 #define __fake_elf_h__
36
37 #if HAVE_STDINT_H
38 #include <stdint.h>
39 #endif
40
41 typedef uint32_t        Elf32_Addr;
42 typedef uint32_t        Elf32_Off;
43 typedef uint16_t        Elf32_Half;
44 typedef uint32_t        Elf32_Word;
45 typedef uint8_t         Elf32_Char;
46
47 #if SIZEOF_UINT64_T != 8
48 #define USE_ARRAY_FOR_64BIT_TYPES
49 typedef uint32_t        Elf64_Addr[2];
50 typedef uint32_t        Elf64_Off[2];
51 typedef uint32_t        Elf64_Xword[2];
52 #else
53 typedef uint64_t        Elf64_Addr;
54 typedef uint64_t        Elf64_Off;
55 typedef uint64_t        Elf64_Xword;
56 #endif
57 typedef uint16_t        Elf64_Half;
58 typedef uint32_t        Elf64_Word;
59 typedef uint8_t         Elf64_Char;
60
61 #define EI_NIDENT       16
62
63 typedef struct {
64     Elf32_Char  e_ident[EI_NIDENT];
65     Elf32_Half  e_type;
66     Elf32_Half  e_machine;
67     Elf32_Word  e_version;
68     Elf32_Addr  e_entry;  /* Entry point */
69     Elf32_Off   e_phoff;
70     Elf32_Off   e_shoff;
71     Elf32_Word  e_flags;
72     Elf32_Half  e_ehsize;
73     Elf32_Half  e_phentsize;
74     Elf32_Half  e_phnum;
75     Elf32_Half  e_shentsize;
76     Elf32_Half  e_shnum;
77     Elf32_Half  e_shstrndx;
78 } Elf32_Ehdr;
79
80 typedef struct {
81     Elf64_Char  e_ident[EI_NIDENT];
82     Elf64_Half  e_type;
83     Elf64_Half  e_machine;
84     Elf64_Word  e_version;
85     Elf64_Addr  e_entry;  /* Entry point */
86     Elf64_Off   e_phoff;
87     Elf64_Off   e_shoff;
88     Elf64_Word  e_flags;
89     Elf64_Half  e_ehsize;
90     Elf64_Half  e_phentsize;
91     Elf64_Half  e_phnum;
92     Elf64_Half  e_shentsize;
93     Elf64_Half  e_shnum;
94     Elf64_Half  e_shstrndx;
95 } Elf64_Ehdr;
96
97 /* e_type */
98 #define ET_EXEC         2
99 #define ET_CORE         4
100
101 /* sh_type */
102 #define SHT_SYMTAB      2
103 #define SHT_NOTE        7
104 #define SHT_DYNSYM      11
105
106 /* elf type */
107 #define ELFDATANONE     0               /* e_ident[EI_DATA] */
108 #define ELFDATA2LSB     1
109 #define ELFDATA2MSB     2
110
111 /* elf class */
112 #define ELFCLASSNONE    0
113 #define ELFCLASS32      1
114 #define ELFCLASS64      2
115
116 /* magic number */
117 #define EI_MAG0         0               /* e_ident[] indexes */
118 #define EI_MAG1         1
119 #define EI_MAG2         2
120 #define EI_MAG3         3
121 #define EI_CLASS        4
122 #define EI_DATA         5
123 #define EI_VERSION      6
124 #define EI_PAD          7
125
126 #define ELFMAG0         0x7f            /* EI_MAG */
127 #define ELFMAG1         'E'
128 #define ELFMAG2         'L'
129 #define ELFMAG3         'F'
130 #define ELFMAG          "\177ELF"
131
132 #define OLFMAG1         'O'
133 #define OLFMAG          "\177OLF"
134
135 typedef struct {
136     Elf32_Word  p_type;
137     Elf32_Off   p_offset;
138     Elf32_Addr  p_vaddr;
139     Elf32_Addr  p_paddr;
140     Elf32_Word  p_filesz;
141     Elf32_Word  p_memsz;
142     Elf32_Word  p_flags;
143     Elf32_Word  p_align;
144 } Elf32_Phdr;
145
146 typedef struct {
147     Elf64_Word  p_type;
148     Elf64_Word  p_flags;
149     Elf64_Off   p_offset;
150     Elf64_Addr  p_vaddr;
151     Elf64_Addr  p_paddr;
152     Elf64_Xword p_filesz;
153     Elf64_Xword p_memsz;
154     Elf64_Xword p_align;
155 } Elf64_Phdr;
156
157 #define PT_NULL         0               /* p_type */
158 #define PT_LOAD         1
159 #define PT_DYNAMIC      2
160 #define PT_INTERP       3
161 #define PT_NOTE         4
162 #define PT_SHLIB        5
163 #define PT_PHDR         6
164 #define PT_NUM          7
165
166 typedef struct {
167     Elf32_Word  sh_name;
168     Elf32_Word  sh_type;
169     Elf32_Word  sh_flags;
170     Elf32_Addr  sh_addr;
171     Elf32_Off   sh_offset;
172     Elf32_Word  sh_size;
173     Elf32_Word  sh_link;
174     Elf32_Word  sh_info;
175     Elf32_Word  sh_addralign;
176     Elf32_Word  sh_entsize;
177 } Elf32_Shdr;
178
179 typedef struct {
180     Elf64_Word  sh_name;
181     Elf64_Word  sh_type;
182     Elf64_Off   sh_flags;
183     Elf64_Addr  sh_addr;
184     Elf64_Off   sh_offset;
185     Elf64_Off   sh_size;
186     Elf64_Word  sh_link;
187     Elf64_Word  sh_info;
188     Elf64_Off   sh_addralign;
189     Elf64_Off   sh_entsize;
190 } Elf64_Shdr;
191
192 /* Notes used in ET_CORE */
193 #define NT_PRSTATUS     1
194 #define NT_PRFPREG      2
195 #define NT_PRPSINFO     3
196 #define NT_TASKSTRUCT   4
197
198 #define NT_NETBSD_CORE_PROCINFO         1
199
200 /* Note header in a PT_NOTE section */
201 typedef struct elf_note {
202     Elf32_Word  n_namesz;       /* Name size */
203     Elf32_Word  n_descsz;       /* Content size */
204     Elf32_Word  n_type;         /* Content type */
205 } Elf32_Nhdr;
206
207 typedef struct {
208     Elf64_Word  n_namesz;
209     Elf64_Word  n_descsz;
210     Elf64_Word  n_type;
211 } Elf64_Nhdr;
212
213 #define NT_PRSTATUS     1
214 #define NT_PRFPREG      2
215 #define NT_PRPSINFO     3
216 #define NT_PRXREG       4
217 #define NT_PLATFORM     5
218 #define NT_AUXV         6
219
220 /* Note types used in executables */
221 /* NetBSD executables (name = "NetBSD") */
222 #define NT_NETBSD_VERSION       1
223 #define NT_NETBSD_EMULATION     2
224 #define NT_FREEBSD_VERSION      1
225 #define NT_OPENBSD_VERSION      1
226 /* GNU executables (name = "GNU") */
227 #define NT_GNU_VERSION          1
228
229 /* GNU OS tags */
230 #define GNU_OS_LINUX    0
231 #define GNU_OS_HURD     1
232 #define GNU_OS_SOLARIS  2
233
234 #endif