File: elf_dyn.h

package info (click to toggle)
edb-debugger 1.3.0-2.2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,124 kB
  • sloc: cpp: 46,241; xml: 4,998; ansic: 3,088; sh: 52; asm: 33; makefile: 5
file content (276 lines) | stat: -rw-r--r-- 12,739 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
/*
Copyright (C) 2012 - 2015 Evan Teran
                          evan.teran@gmail.com

Copyright (C) 1995-2003,2004,2005,2006,2007,2008,2009,2010,2011
                   Free Software Foundation, Inc.

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef ELF_DYN_H_20121007_
#define ELF_DYN_H_20121007_

#include "elf_types.h"

/* Dynamic section entry.  */

struct elf32_dyn {
	elf32_sword d_tag; /* Dynamic entry type */
	union {
		elf32_word d_val; /* Integer value */
		elf32_addr d_ptr; /* Address value */
	} d_un;
};

struct elf64_dyn {
	elf64_sxword d_tag; /* Dynamic entry type */
	union {
		elf64_xword d_val; /* Integer value */
		elf64_addr d_ptr;  /* Address value */
	} d_un;
};

/* Legal values for d_tag field of Elf32_Dyn.  */
enum {
	DT_MIPS_RLD_VERSION           = 0x70000001, /* Runtime linker interface version */
	DT_MIPS_TIME_STAMP            = 0x70000002, /* Timestamp */
	DT_MIPS_ICHECKSUM             = 0x70000003, /* Checksum */
	DT_MIPS_IVERSION              = 0x70000004, /* Version string (string tbl index) */
	DT_MIPS_FLAGS                 = 0x70000005, /* Flags */
	DT_MIPS_BASE_ADDRESS          = 0x70000006, /* Base address */
	DT_MIPS_MSYM                  = 0x70000007,
	DT_MIPS_CONFLICT              = 0x70000008, /* Address of CONFLICT section */
	DT_MIPS_LIBLIST               = 0x70000009, /* Address of LIBLIST section */
	DT_MIPS_LOCAL_GOTNO           = 0x7000000a, /* Number of local GOT entries */
	DT_MIPS_CONFLICTNO            = 0x7000000b, /* Number of CONFLICT entries */
	DT_MIPS_LIBLISTNO             = 0x70000010, /* Number of LIBLIST entries */
	DT_MIPS_SYMTABNO              = 0x70000011, /* Number of DYNSYM entries */
	DT_MIPS_UNREFEXTNO            = 0x70000012, /* First external DYNSYM */
	DT_MIPS_GOTSYM                = 0x70000013, /* First GOT entry in DYNSYM */
	DT_MIPS_HIPAGENO              = 0x70000014, /* Number of GOT page table entries */
	DT_MIPS_RLD_MAP               = 0x70000016, /* Address of run time loader map.  */
	DT_MIPS_DELTA_CLASS           = 0x70000017, /* Delta C++ class definition.  */
	DT_MIPS_DELTA_CLASS_NO        = 0x70000018, /* Number of entries in DT_MIPS_DELTA_CLASS.  */
	DT_MIPS_DELTA_INSTANCE        = 0x70000019, /* Delta C++ class instances.  */
	DT_MIPS_DELTA_INSTANCE_NO     = 0x7000001a, /* Number of entries in DT_MIPS_DELTA_INSTANCE.  */
	DT_MIPS_DELTA_RELOC           = 0x7000001b, /* Delta relocations.  */
	DT_MIPS_DELTA_RELOC_NO        = 0x7000001c, /* Number of entries in DT_MIPS_DELTA_RELOC.  */
	DT_MIPS_DELTA_SYM             = 0x7000001d, /* Delta symbols that Delta    relocations refer to.  */
	DT_MIPS_DELTA_SYM_NO          = 0x7000001e, /* Number of entries in    DT_MIPS_DELTA_SYM.  */
	DT_MIPS_DELTA_CLASSSYM        = 0x70000020, /* Delta symbols that hold the	class declaration.  */
	DT_MIPS_DELTA_CLASSSYM_NO     = 0x70000021, /* Number of entries in DT_MIPS_DELTA_CLASSSYM.  */
	DT_MIPS_CXX_FLAGS             = 0x70000022, /* Flags indicating for C++ flavor.  */
	DT_MIPS_PIXIE_INIT            = 0x70000023,
	DT_MIPS_SYMBOL_LIB            = 0x70000024,
	DT_MIPS_LOCALPAGE_GOTIDX      = 0x70000025,
	DT_MIPS_LOCAL_GOTIDX          = 0x70000026,
	DT_MIPS_HIDDEN_GOTIDX         = 0x70000027,
	DT_MIPS_PROTECTED_GOTIDX      = 0x70000028,
	DT_MIPS_OPTIONS               = 0x70000029, /* Address of .options.  */
	DT_MIPS_INTERFACE             = 0x7000002a, /* Address of .interface.  */
	DT_MIPS_DYNSTR_ALIGN          = 0x7000002b,
	DT_MIPS_INTERFACE_SIZE        = 0x7000002c, /* Size of the .interface section. */
	DT_MIPS_RLD_TEXT_RESOLVE_ADDR = 0x7000002d, /* Address of rld_text_rsolve function stored in GOT.  */
	DT_MIPS_PERF_SUFFIX           = 0x7000002e, /* Default suffix of dso to be added by rld on dlopen() calls.  */
	DT_MIPS_COMPACT_SIZE          = 0x7000002f, /* (O32)Size of compact rel section. */
	DT_MIPS_GP_VALUE              = 0x70000030, /* GP value for aux GOTs.  */
	DT_MIPS_AUX_DYNAMIC           = 0x70000031, /* Address of aux .dynamic.  */

	/* The address of .got.plt in an executable using the new non-PIC ABI.  */
	DT_MIPS_PLTGOT = 0x70000032,

	/* The base of the PLT in an executable using the new non-PIC ABI if that
	   PLT is writable.  For a non-writable PLT, this is omitted or has a zero
	   value.  */
	DT_MIPS_RWPLT = 0x70000034,
	DT_MIPS_NUM   = 0x35,
};

/* Legal values for d_tag (dynamic entry type).  */
enum {
	DT_NULL            = 0,          /* Marks end of dynamic section */
	DT_NEEDED          = 1,          /* Name of needed library */
	DT_PLTRELSZ        = 2,          /* Size in bytes of PLT relocs */
	DT_PLTGOT          = 3,          /* Processor defined value */
	DT_HASH            = 4,          /* Address of symbol hash table */
	DT_STRTAB          = 5,          /* Address of string table */
	DT_SYMTAB          = 6,          /* Address of symbol table */
	DT_RELA            = 7,          /* Address of Rela relocs */
	DT_RELASZ          = 8,          /* Total size of Rela relocs */
	DT_RELAENT         = 9,          /* Size of one Rela reloc */
	DT_STRSZ           = 10,         /* Size of string table */
	DT_SYMENT          = 11,         /* Size of one symbol table entry */
	DT_INIT            = 12,         /* Address of init function */
	DT_FINI            = 13,         /* Address of termination function */
	DT_SONAME          = 14,         /* Name of shared object */
	DT_RPATH           = 15,         /* Library search path (deprecated) */
	DT_SYMBOLIC        = 16,         /* Start symbol search here */
	DT_REL             = 17,         /* Address of Rel relocs */
	DT_RELSZ           = 18,         /* Total size of Rel relocs */
	DT_RELENT          = 19,         /* Size of one Rel reloc */
	DT_PLTREL          = 20,         /* Type of reloc in PLT */
	DT_DEBUG           = 21,         /* For debugging; unspecified */
	DT_TEXTREL         = 22,         /* Reloc might modify .text */
	DT_JMPREL          = 23,         /* Address of PLT relocs */
	DT_BIND_NOW        = 24,         /* Process relocations of object */
	DT_INIT_ARRAY      = 25,         /* Array with addresses of init fct */
	DT_FINI_ARRAY      = 26,         /* Array with addresses of fini fct */
	DT_INIT_ARRAYSZ    = 27,         /* Size in bytes of DT_INIT_ARRAY */
	DT_FINI_ARRAYSZ    = 28,         /* Size in bytes of DT_FINI_ARRAY */
	DT_RUNPATH         = 29,         /* Library search path */
	DT_FLAGS           = 30,         /* Flags for the object being loaded */
	DT_ENCODING        = 32,         /* Start of encoded range */
	DT_PREINIT_ARRAY   = 32,         /* Array with addresses of preinit fct*/
	DT_PREINIT_ARRAYSZ = 33,         /* size in bytes of DT_PREINIT_ARRAY */
	DT_NUM             = 34,         /* Number used */
	DT_LOOS            = 0x6000000d, /* Start of OS-specific */
	DT_HIOS            = 0x6ffff000, /* End of OS-specific */
	DT_LOPROC          = 0x70000000, /* Start of processor-specific */
	DT_HIPROC          = 0x7fffffff, /* End of processor-specific */

	DT_PROCNUM = DT_MIPS_NUM /* Most used by any processor */
};

/* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the
   Dyn.d_un.d_val field of the Elf*_Dyn structure.  This follows Sun's
   approach.  */
enum {
	DT_VALRNGLO       = 0x6ffffd00,
	DT_GNU_PRELINKED  = 0x6ffffdf5, /* Prelinking timestamp */
	DT_GNU_CONFLICTSZ = 0x6ffffdf6, /* Size of conflict section */
	DT_GNU_LIBLISTSZ  = 0x6ffffdf7, /* Size of library list */
	DT_CHECKSUM       = 0x6ffffdf8,
	DT_PLTPADSZ       = 0x6ffffdf9,
	DT_MOVEENT        = 0x6ffffdfa,
	DT_MOVESZ         = 0x6ffffdfb,
	DT_FEATURE_1      = 0x6ffffdfc, /* Feature selection (DTF_*).  */
	DT_POSFLAG_1      = 0x6ffffdfd, /* Flags for DT_* entries, effecting the following DT_* entry.  */
	DT_SYMINSZ        = 0x6ffffdfe, /* Size of syminfo table (in bytes) */
	DT_SYMINENT       = 0x6ffffdff, /* Entry size of syminfo */
	DT_VALRNGHI       = 0x6ffffdff,
	DT_VALNUM         = 12,
};

constexpr inline uint32_t DT_VALTAGIDX(uint32_t tag) {
	return DT_VALRNGHI - tag; /* Reverse order! */
}

/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the
   Dyn.d_un.d_ptr field of the Elf*_Dyn structure.

   If any adjustment is made to the ELF object after it has been
   built these entries will need to be adjusted.  */
enum {
	DT_ADDRRNGLO    = 0x6ffffe00,
	DT_GNU_HASH     = 0x6ffffef5, /* GNU-style hash table.  */
	DT_TLSDESC_PLT  = 0x6ffffef6,
	DT_TLSDESC_GOT  = 0x6ffffef7,
	DT_GNU_CONFLICT = 0x6ffffef8, /* Start of conflict section */
	DT_GNU_LIBLIST  = 0x6ffffef9, /* Library list */
	DT_CONFIG       = 0x6ffffefa, /* Configuration information.  */
	DT_DEPAUDIT     = 0x6ffffefb, /* Dependency auditing.  */
	DT_AUDIT        = 0x6ffffefc, /* Object auditing.  */
	DT_PLTPAD       = 0x6ffffefd, /* PLT padding.  */
	DT_MOVETAB      = 0x6ffffefe, /* Move table.  */
	DT_SYMINFO      = 0x6ffffeff, /* Syminfo table.  */
	DT_ADDRRNGHI    = 0x6ffffeff,
	DT_ADDRNUM      = 11,
};

constexpr inline uint32_t DT_ADDRTAGIDX(uint32_t tag) {
	return DT_ADDRRNGHI - tag; /* Reverse order! */
}

/* The versioning entry types.  The next are defined as part of the
   GNU extension.  */
enum {
	DT_VERSYM = 0x6ffffff0,
};

enum {
	DT_RELACOUNT = 0x6ffffff9,
	DT_RELCOUNT  = 0x6ffffffa,
};

/* These were chosen by Sun.  */
enum {
	DT_FLAGS_1       = 0x6ffffffb, /* State flags, see DF_1_* below.  */
	DT_VERDEF        = 0x6ffffffc, /* Address of version definition table */
	DT_VERDEFNUM     = 0x6ffffffd, /* Number of version definitions */
	DT_VERNEED       = 0x6ffffffe, /* Address of table with needed versions */
	DT_VERNEEDNUM    = 0x6fffffff, /* Number of needed versions */
	DT_VERSIONTAGNUM = 16,
};

constexpr inline uint32_t DT_VERSIONTAGIDX(uint32_t tag) {
	return DT_VERNEEDNUM - tag; /* Reverse order! */
}

/* Sun added these machine-independent extensions in the "processor-specific"
   range.  Be compatible.  */
enum {
	DT_AUXILIARY = 0x7ffffffd, /* Shared object to load before self */
	DT_FILTER    = 0x7fffffff, /* Shared object to get values from */
	DT_EXTRANUM  = 3,
};

constexpr inline uint32_t DT_EXTRATAGIDX(uint32_t tag) {
	return static_cast<elf32_word>(-(static_cast<elf32_sword>(tag) << 1 >> 1) - 1);
}

/* Values of `d_un.d_val' in the DT_FLAGS entry.  */
enum {
	DF_ORIGIN     = 0x00000001, /* Object may use DF_ORIGIN */
	DF_SYMBOLIC   = 0x00000002, /* Symbol resolutions starts here */
	DF_TEXTREL    = 0x00000004, /* Object contains text relocations */
	DF_BIND_NOW   = 0x00000008, /* No lazy binding for this object */
	DF_STATIC_TLS = 0x00000010, /* Module uses the static TLS model */
};

/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1
   entry in the dynamic section.  */
enum {
	DF_1_NOW        = 0x00000001, /* Set RTLD_NOW for this object.  */
	DF_1_GLOBAL     = 0x00000002, /* Set RTLD_GLOBAL for this object.  */
	DF_1_GROUP      = 0x00000004, /* Set RTLD_GROUP for this object.  */
	DF_1_NODELETE   = 0x00000008, /* Set RTLD_NODELETE for this object.*/
	DF_1_LOADFLTR   = 0x00000010, /* Trigger filtee loading at runtime.*/
	DF_1_INITFIRST  = 0x00000020, /* Set RTLD_INITFIRST for this object*/
	DF_1_NOOPEN     = 0x00000040, /* Set RTLD_NOOPEN for this object.  */
	DF_1_ORIGIN     = 0x00000080, /* $ORIGIN must be handled.  */
	DF_1_DIRECT     = 0x00000100, /* Direct binding enabled.  */
	DF_1_TRANS      = 0x00000200,
	DF_1_INTERPOSE  = 0x00000400, /* Object is used to interpose.  */
	DF_1_NODEFLIB   = 0x00000800, /* Ignore default lib search path.  */
	DF_1_NODUMP     = 0x00001000, /* Object can't be dldump'ed.  */
	DF_1_CONFALT    = 0x00002000, /* Configuration alternative created.*/
	DF_1_ENDFILTEE  = 0x00004000, /* Filtee terminates filters search. */
	DF_1_DISPRELDNE = 0x00008000, /* Disp reloc applied at build time. */
	DF_1_DISPRELPND = 0x00010000, /* Disp reloc applied at run-time.  */
};

/* Flags for the feature selection in DT_FEATURE_1.  */
enum {
	DTF_1_PARINIT = 0x00000001,
	DTF_1_CONFEXP = 0x00000002,
};

/* Flags in the DT_POSFLAG_1 entry effecting only the next DT_* entry.  */
enum {
	DF_P1_LAZYLOAD  = 0x00000001, /* Lazyload following object.  */
	DF_P1_GROUPPERM = 0x00000002, /* Symbols from next object are not generally available.  */
};

#endif