Subversion Repositories Kolibri OS

Rev

Rev 5191 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5191 serge 1
/* ELF support for BFD.
6324 serge 2
   Copyright (C) 1991-2015 Free Software Foundation, Inc.
5191 serge 3
 
4
   Written by Fred Fish @ Cygnus Support, from information published
5
   in "UNIX System V Release 4, Programmers Guide: ANSI C and
6
   Programming Support Tools".
7
 
8
   This file is part of BFD, the Binary File Descriptor library.
9
 
10
   This program is free software; you can redistribute it and/or modify
11
   it under the terms of the GNU General Public License as published by
12
   the Free Software Foundation; either version 3 of the License, or
13
   (at your option) any later version.
14
 
15
   This program is distributed in the hope that it will be useful,
16
   but WITHOUT ANY WARRANTY; without even the implied warranty of
17
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
   GNU General Public License for more details.
19
 
20
   You should have received a copy of the GNU General Public License
21
   along with this program; if not, write to the Free Software
22
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
23
   MA 02110-1301, USA.  */
24
 
25
/* This file is part of ELF support for BFD, and contains the portions
26
   that describe how ELF is represented externally by the BFD library.
27
   I.E. it describes the in-file representation of ELF.  It requires
28
   the elf/common.h file which contains the portions that are common to
29
   both the internal and external representations.  */
30
 
31
/* The 64-bit stuff is kind of random.  Perhaps someone will publish a
32
   spec someday.  */
33
 
34
#ifndef _ELF_EXTERNAL_H
35
#define _ELF_EXTERNAL_H
36
 
37
/* Special section indices, which may show up in st_shndx fields, among
38
   other places.  */
39
 
40
#define SHN_LORESERVE	0xFF00		/* Begin range of reserved indices */
41
#define SHN_LOPROC	0xFF00		/* Begin range of appl-specific */
42
#define SHN_HIPROC	0xFF1F		/* End range of appl-specific */
43
#define SHN_LOOS	0xFF20		/* OS specific semantics, lo */
44
#define SHN_HIOS	0xFF3F		/* OS specific semantics, hi */
45
#define SHN_ABS		0xFFF1		/* Associated symbol is absolute */
46
#define SHN_COMMON	0xFFF2		/* Associated symbol is in common */
47
#define SHN_XINDEX	0xFFFF		/* Section index is held elsewhere */
48
#define SHN_HIRESERVE	0xFFFF		/* End range of reserved indices */
49
 
50
/* ELF Header (32-bit implementations) */
51
 
52
typedef struct {
53
  unsigned char	e_ident[16];		/* ELF "magic number" */
54
  unsigned char	e_type[2];		/* Identifies object file type */
55
  unsigned char	e_machine[2];		/* Specifies required architecture */
56
  unsigned char	e_version[4];		/* Identifies object file version */
57
  unsigned char	e_entry[4];		/* Entry point virtual address */
58
  unsigned char	e_phoff[4];		/* Program header table file offset */
59
  unsigned char	e_shoff[4];		/* Section header table file offset */
60
  unsigned char	e_flags[4];		/* Processor-specific flags */
61
  unsigned char	e_ehsize[2];		/* ELF header size in bytes */
62
  unsigned char	e_phentsize[2];		/* Program header table entry size */
63
  unsigned char	e_phnum[2];		/* Program header table entry count */
64
  unsigned char	e_shentsize[2];		/* Section header table entry size */
65
  unsigned char	e_shnum[2];		/* Section header table entry count */
66
  unsigned char	e_shstrndx[2];		/* Section header string table index */
67
} Elf32_External_Ehdr;
68
 
69
typedef struct {
70
  unsigned char	e_ident[16];		/* ELF "magic number" */
71
  unsigned char	e_type[2];		/* Identifies object file type */
72
  unsigned char	e_machine[2];		/* Specifies required architecture */
73
  unsigned char	e_version[4];		/* Identifies object file version */
74
  unsigned char	e_entry[8];		/* Entry point virtual address */
75
  unsigned char	e_phoff[8];		/* Program header table file offset */
76
  unsigned char	e_shoff[8];		/* Section header table file offset */
77
  unsigned char	e_flags[4];		/* Processor-specific flags */
78
  unsigned char	e_ehsize[2];		/* ELF header size in bytes */
79
  unsigned char	e_phentsize[2];		/* Program header table entry size */
80
  unsigned char	e_phnum[2];		/* Program header table entry count */
81
  unsigned char	e_shentsize[2];		/* Section header table entry size */
82
  unsigned char	e_shnum[2];		/* Section header table entry count */
83
  unsigned char	e_shstrndx[2];		/* Section header string table index */
84
} Elf64_External_Ehdr;
85
 
86
/* Program header */
87
 
88
typedef struct {
89
  unsigned char	p_type[4];		/* Identifies program segment type */
90
  unsigned char	p_offset[4];		/* Segment file offset */
91
  unsigned char	p_vaddr[4];		/* Segment virtual address */
92
  unsigned char	p_paddr[4];		/* Segment physical address */
93
  unsigned char	p_filesz[4];		/* Segment size in file */
94
  unsigned char	p_memsz[4];		/* Segment size in memory */
95
  unsigned char	p_flags[4];		/* Segment flags */
96
  unsigned char	p_align[4];		/* Segment alignment, file & memory */
97
} Elf32_External_Phdr;
98
 
99
typedef struct {
100
  unsigned char	p_type[4];		/* Identifies program segment type */
101
  unsigned char	p_flags[4];		/* Segment flags */
102
  unsigned char	p_offset[8];		/* Segment file offset */
103
  unsigned char	p_vaddr[8];		/* Segment virtual address */
104
  unsigned char	p_paddr[8];		/* Segment physical address */
105
  unsigned char	p_filesz[8];		/* Segment size in file */
106
  unsigned char	p_memsz[8];		/* Segment size in memory */
107
  unsigned char	p_align[8];		/* Segment alignment, file & memory */
108
} Elf64_External_Phdr;
109
 
110
/* Section header */
111
 
112
typedef struct {
113
  unsigned char	sh_name[4];		/* Section name, index in string tbl */
114
  unsigned char	sh_type[4];		/* Type of section */
115
  unsigned char	sh_flags[4];		/* Miscellaneous section attributes */
116
  unsigned char	sh_addr[4];		/* Section virtual addr at execution */
117
  unsigned char	sh_offset[4];		/* Section file offset */
118
  unsigned char	sh_size[4];		/* Size of section in bytes */
119
  unsigned char	sh_link[4];		/* Index of another section */
120
  unsigned char	sh_info[4];		/* Additional section information */
121
  unsigned char	sh_addralign[4];	/* Section alignment */
122
  unsigned char	sh_entsize[4];		/* Entry size if section holds table */
123
} Elf32_External_Shdr;
124
 
125
typedef struct {
126
  unsigned char	sh_name[4];		/* Section name, index in string tbl */
127
  unsigned char	sh_type[4];		/* Type of section */
128
  unsigned char	sh_flags[8];		/* Miscellaneous section attributes */
129
  unsigned char	sh_addr[8];		/* Section virtual addr at execution */
130
  unsigned char	sh_offset[8];		/* Section file offset */
131
  unsigned char	sh_size[8];		/* Size of section in bytes */
132
  unsigned char	sh_link[4];		/* Index of another section */
133
  unsigned char	sh_info[4];		/* Additional section information */
134
  unsigned char	sh_addralign[8];	/* Section alignment */
135
  unsigned char	sh_entsize[8];		/* Entry size if section holds table */
136
} Elf64_External_Shdr;
137
 
6324 serge 138
/* Compression header */
139
 
140
typedef struct {
141
  unsigned char	ch_type[4];		/* Type of compression */
142
  unsigned char	ch_size[4];		/* Size of uncompressed data in bytes */
143
  unsigned char	ch_addralign[4];	/* Alignment of uncompressed data  */
144
} Elf32_External_Chdr;
145
 
146
typedef struct {
147
  unsigned char	ch_type[4];		/* Type of compression */
148
  unsigned char	ch_reserved[4];		/* Padding */
149
  unsigned char	ch_size[8];		/* Size of uncompressed data in bytes */
150
  unsigned char	ch_addralign[8];	/* Alignment of uncompressed data  */
151
} Elf64_External_Chdr;
152
 
5191 serge 153
/* Symbol table entry */
154
 
155
typedef struct {
156
  unsigned char	st_name[4];		/* Symbol name, index in string tbl */
157
  unsigned char	st_value[4];		/* Value of the symbol */
158
  unsigned char	st_size[4];		/* Associated symbol size */
159
  unsigned char	st_info[1];		/* Type and binding attributes */
160
  unsigned char	st_other[1];		/* No defined meaning, 0 */
161
  unsigned char	st_shndx[2];		/* Associated section index */
162
} Elf32_External_Sym;
163
 
164
typedef struct {
165
  unsigned char	st_name[4];		/* Symbol name, index in string tbl */
166
  unsigned char	st_info[1];		/* Type and binding attributes */
167
  unsigned char	st_other[1];		/* No defined meaning, 0 */
168
  unsigned char	st_shndx[2];		/* Associated section index */
169
  unsigned char	st_value[8];		/* Value of the symbol */
170
  unsigned char	st_size[8];		/* Associated symbol size */
171
} Elf64_External_Sym;
172
 
173
typedef struct {
174
  unsigned char est_shndx[4];		/* Section index */
175
} Elf_External_Sym_Shndx;
176
 
177
/* Note segments */
178
 
179
typedef struct {
180
  unsigned char	namesz[4];		/* Size of entry's owner string */
181
  unsigned char	descsz[4];		/* Size of the note descriptor */
182
  unsigned char	type[4];		/* Interpretation of the descriptor */
183
  char		name[1];		/* Start of the name+desc data */
184
} Elf_External_Note;
185
 
186
/* Relocation Entries */
187
typedef struct {
188
  unsigned char r_offset[4];	/* Location at which to apply the action */
189
  unsigned char	r_info[4];	/* index and type of relocation */
190
} Elf32_External_Rel;
191
 
192
typedef struct {
193
  unsigned char r_offset[4];	/* Location at which to apply the action */
194
  unsigned char	r_info[4];	/* index and type of relocation */
195
  unsigned char	r_addend[4];	/* Constant addend used to compute value */
196
} Elf32_External_Rela;
197
 
198
typedef struct {
199
  unsigned char r_offset[8];	/* Location at which to apply the action */
200
  unsigned char	r_info[8];	/* index and type of relocation */
201
} Elf64_External_Rel;
202
 
203
typedef struct {
204
  unsigned char r_offset[8];	/* Location at which to apply the action */
205
  unsigned char	r_info[8];	/* index and type of relocation */
206
  unsigned char	r_addend[8];	/* Constant addend used to compute value */
207
} Elf64_External_Rela;
208
 
209
/* dynamic section structure */
210
 
211
typedef struct {
212
  unsigned char	d_tag[4];		/* entry tag value */
213
  union {
214
    unsigned char	d_val[4];
215
    unsigned char	d_ptr[4];
216
  } d_un;
217
} Elf32_External_Dyn;
218
 
219
typedef struct {
220
  unsigned char	d_tag[8];		/* entry tag value */
221
  union {
222
    unsigned char	d_val[8];
223
    unsigned char	d_ptr[8];
224
  } d_un;
225
} Elf64_External_Dyn;
226
 
227
/* The version structures are currently size independent.  They are
228
   named without a 32 or 64.  If that ever changes, these structures
229
   will need to be renamed.  */
230
 
231
/* This structure appears in a SHT_GNU_verdef section.  */
232
 
233
typedef struct {
234
  unsigned char		vd_version[2];
235
  unsigned char		vd_flags[2];
236
  unsigned char		vd_ndx[2];
237
  unsigned char		vd_cnt[2];
238
  unsigned char		vd_hash[4];
239
  unsigned char		vd_aux[4];
240
  unsigned char		vd_next[4];
241
} Elf_External_Verdef;
242
 
243
/* This structure appears in a SHT_GNU_verdef section.  */
244
 
245
typedef struct {
246
  unsigned char		vda_name[4];
247
  unsigned char		vda_next[4];
248
} Elf_External_Verdaux;
249
 
250
/* This structure appears in a SHT_GNU_verneed section.  */
251
 
252
typedef struct {
253
  unsigned char		vn_version[2];
254
  unsigned char		vn_cnt[2];
255
  unsigned char		vn_file[4];
256
  unsigned char		vn_aux[4];
257
  unsigned char		vn_next[4];
258
} Elf_External_Verneed;
259
 
260
/* This structure appears in a SHT_GNU_verneed section.  */
261
 
262
typedef struct {
263
  unsigned char		vna_hash[4];
264
  unsigned char		vna_flags[2];
265
  unsigned char		vna_other[2];
266
  unsigned char		vna_name[4];
267
  unsigned char		vna_next[4];
268
} Elf_External_Vernaux;
269
 
270
/* This structure appears in a SHT_GNU_versym section.  This is not a
271
   standard ELF structure; ELF just uses Elf32_Half.  */
272
 
273
typedef struct {
274
  unsigned char		vs_vers[2];
275
} ATTRIBUTE_PACKED  Elf_External_Versym;
276
 
277
/* Structure for syminfo section.  */
278
typedef struct
279
{
280
  unsigned char		si_boundto[2];
281
  unsigned char		si_flags[2];
282
} Elf_External_Syminfo;
283
 
284
 
285
/* This structure appears on the stack and in NT_AUXV core file notes.  */
286
typedef struct
287
{
288
  unsigned char		a_type[4];
289
  unsigned char		a_val[4];
290
} Elf32_External_Auxv;
291
 
292
typedef struct
293
{
294
  unsigned char		a_type[8];
295
  unsigned char		a_val[8];
296
} Elf64_External_Auxv;
297
 
298
/* Size of SHT_GROUP section entry.  */
299
 
300
#define GRP_ENTRY_SIZE		4
301
 
302
#endif /* _ELF_EXTERNAL_H */