Line data Source code
1 : use std::marker::PhantomData;
2 :
3 : use lief_ffi as ffi;
4 : use bitflags::bitflags;
5 :
6 : use crate::common::FromFFI;
7 : use crate::declare_iterator;
8 :
9 :
10 : #[allow(non_camel_case_types)]
11 1490 : #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
12 : pub enum Tag {
13 : DT_NULL_,
14 : NEEDED,
15 : PLTRELSZ,
16 : PLTGOT,
17 : HASH,
18 : STRTAB,
19 : SYMTAB,
20 : RELA,
21 : RELASZ,
22 : RELAENT,
23 : STRSZ,
24 : SYMENT,
25 : INIT,
26 : FINI,
27 : SONAME,
28 : RPATH,
29 : SYMBOLIC,
30 : REL,
31 : RELSZ,
32 : RELENT,
33 : PLTREL,
34 : DEBUG_TAG,
35 : TEXTREL,
36 : JMPREL,
37 : BIND_NOW,
38 : INIT_ARRAY,
39 : FINI_ARRAY,
40 : INIT_ARRAYSZ,
41 : FINI_ARRAYSZ,
42 : RUNPATH,
43 : FLAGS,
44 : PREINIT_ARRAY,
45 : PREINIT_ARRAYSZ,
46 : SYMTAB_SHNDX,
47 : RELRSZ,
48 : RELR,
49 : RELRENT,
50 : GNU_HASH,
51 : RELACOUNT,
52 : RELCOUNT,
53 : FLAGS_1,
54 : VERSYM,
55 : VERDEF,
56 : VERDEFNUM,
57 : VERNEED,
58 : VERNEEDNUM,
59 : ANDROID_REL_OFFSET,
60 : ANDROID_REL_SIZE,
61 : ANDROID_REL,
62 : ANDROID_RELSZ,
63 : ANDROID_RELA,
64 : ANDROID_RELASZ,
65 : ANDROID_RELR,
66 : ANDROID_RELRSZ,
67 : ANDROID_RELRENT,
68 : ANDROID_RELRCOUNT,
69 : MIPS_RLD_VERSION,
70 : MIPS_TIME_STAMP,
71 : MIPS_ICHECKSUM,
72 : MIPS_IVERSION,
73 : MIPS_FLAGS,
74 : MIPS_BASE_ADDRESS,
75 : MIPS_MSYM,
76 : MIPS_CONFLICT,
77 : MIPS_LIBLIST,
78 : MIPS_LOCAL_GOTNO,
79 : MIPS_CONFLICTNO,
80 : MIPS_LIBLISTNO,
81 : MIPS_SYMTABNO,
82 : MIPS_UNREFEXTNO,
83 : MIPS_GOTSYM,
84 : MIPS_HIPAGENO,
85 : MIPS_RLD_MAP,
86 : MIPS_DELTA_CLASS,
87 : MIPS_DELTA_CLASS_NO,
88 : MIPS_DELTA_INSTANCE,
89 : MIPS_DELTA_INSTANCE_NO,
90 : MIPS_DELTA_RELOC,
91 : MIPS_DELTA_RELOC_NO,
92 : MIPS_DELTA_SYM,
93 : MIPS_DELTA_SYM_NO,
94 : MIPS_DELTA_CLASSSYM,
95 : MIPS_DELTA_CLASSSYM_NO,
96 : MIPS_CXX_FLAGS,
97 : MIPS_PIXIE_INIT,
98 : MIPS_SYMBOL_LIB,
99 : MIPS_LOCALPAGE_GOTIDX,
100 : MIPS_LOCAL_GOTIDX,
101 : MIPS_HIDDEN_GOTIDX,
102 : MIPS_PROTECTED_GOTIDX,
103 : MIPS_OPTIONS,
104 : MIPS_INTERFACE,
105 : MIPS_DYNSTR_ALIGN,
106 : MIPS_INTERFACE_SIZE,
107 : MIPS_RLD_TEXT_RESOLVE_ADDR,
108 : MIPS_PERF_SUFFIX,
109 : MIPS_COMPACT_SIZE,
110 : MIPS_GP_VALUE,
111 : MIPS_AUX_DYNAMIC,
112 : MIPS_PLTGOT,
113 : MIPS_RWPLT,
114 : MIPS_RLD_MAP_REL,
115 : MIPS_XHASH,
116 : AARCH64_BTI_PLT,
117 : AARCH64_PAC_PLT,
118 : AARCH64_VARIANT_PCS,
119 : AARCH64_MEMTAG_MODE,
120 : AARCH64_MEMTAG_HEAP,
121 : AARCH64_MEMTAG_STACK,
122 : AARCH64_MEMTAG_GLOBALS,
123 : AARCH64_MEMTAG_GLOBALSSZ,
124 : HEXAGON_SYMSZ,
125 : HEXAGON_VER,
126 : HEXAGON_PLT,
127 : PPC_GOT,
128 : PPC_OPT,
129 : PPC64_GLINK,
130 : PPC64_OPT,
131 : RISCV_VARIANT_CC,
132 : X86_64_PLT,
133 : X86_64_PLTSZ,
134 : X86_64_PLTENT,
135 : IA_64_PLT_RESERVE,
136 : IA_64_VMS_SUBTYPE,
137 : IA_64_VMS_IMGIOCNT,
138 : IA_64_VMS_LNKFLAGS,
139 : IA_64_VMS_VIR_MEM_BLK_SIZ,
140 : IA_64_VMS_IDENT,
141 : IA_64_VMS_NEEDED_IDENT,
142 : IA_64_VMS_IMG_RELA_CNT,
143 : IA_64_VMS_SEG_RELA_CNT,
144 : IA_64_VMS_FIXUP_RELA_CNT,
145 : IA_64_VMS_FIXUP_NEEDED,
146 : IA_64_VMS_SYMVEC_CNT,
147 : IA_64_VMS_XLATED,
148 : IA_64_VMS_STACKSIZE,
149 : IA_64_VMS_UNWINDSZ,
150 : IA_64_VMS_UNWIND_CODSEG,
151 : IA_64_VMS_UNWIND_INFOSEG,
152 : IA_64_VMS_LINKTIME,
153 : IA_64_VMS_SEG_NO,
154 : IA_64_VMS_SYMVEC_OFFSET,
155 : IA_64_VMS_SYMVEC_SEG,
156 : IA_64_VMS_UNWIND_OFFSET,
157 : IA_64_VMS_UNWIND_SEG,
158 : IA_64_VMS_STRTAB_OFFSET,
159 : IA_64_VMS_SYSVER_OFFSET,
160 : IA_64_VMS_IMG_RELA_OFF,
161 : IA_64_VMS_SEG_RELA_OFF,
162 : IA_64_VMS_FIXUP_RELA_OFF,
163 : IA_64_VMS_PLTGOT_OFFSET,
164 : IA_64_VMS_PLTGOT_SEG,
165 : IA_64_VMS_FPMODE,
166 : UNKNOWN(u64),
167 : }
168 :
169 : impl From<u64> for Tag {
170 1490 : fn from(value: u64) -> Self {
171 1490 : match value {
172 50 : 0x00000000 => Tag::DT_NULL_,
173 180 : 0x00000001 => Tag::NEEDED,
174 50 : 0x00000002 => Tag::PLTRELSZ,
175 50 : 0x00000003 => Tag::PLTGOT,
176 20 : 0x00000004 => Tag::HASH,
177 50 : 0x00000005 => Tag::STRTAB,
178 50 : 0x00000006 => Tag::SYMTAB,
179 40 : 0x00000007 => Tag::RELA,
180 40 : 0x00000008 => Tag::RELASZ,
181 40 : 0x00000009 => Tag::RELAENT,
182 50 : 0x0000000a => Tag::STRSZ,
183 50 : 0x0000000b => Tag::SYMENT,
184 50 : 0x0000000c => Tag::INIT,
185 50 : 0x0000000d => Tag::FINI,
186 10 : 0x0000000e => Tag::SONAME,
187 10 : 0x0000000f => Tag::RPATH,
188 10 : 0x00000010 => Tag::SYMBOLIC,
189 10 : 0x00000011 => Tag::REL,
190 10 : 0x00000012 => Tag::RELSZ,
191 10 : 0x00000013 => Tag::RELENT,
192 50 : 0x00000014 => Tag::PLTREL,
193 40 : 0x00000015 => Tag::DEBUG_TAG,
194 0 : 0x00000016 => Tag::TEXTREL,
195 50 : 0x00000017 => Tag::JMPREL,
196 0 : 0x00000018 => Tag::BIND_NOW,
197 40 : 0x00000019 => Tag::INIT_ARRAY,
198 30 : 0x0000001a => Tag::FINI_ARRAY,
199 40 : 0x0000001b => Tag::INIT_ARRAYSZ,
200 30 : 0x0000001c => Tag::FINI_ARRAYSZ,
201 10 : 0x0000001d => Tag::RUNPATH,
202 10 : 0x0000001e => Tag::FLAGS,
203 0 : 0x00000020 => Tag::PREINIT_ARRAY,
204 0 : 0x00000021 => Tag::PREINIT_ARRAYSZ,
205 0 : 0x00000022 => Tag::SYMTAB_SHNDX,
206 0 : 0x00000023 => Tag::RELRSZ,
207 0 : 0x00000024 => Tag::RELR,
208 0 : 0x00000025 => Tag::RELRENT,
209 40 : 0x6ffffef5 => Tag::GNU_HASH,
210 20 : 0x6ffffff9 => Tag::RELACOUNT,
211 0 : 0x6ffffffa => Tag::RELCOUNT,
212 10 : 0x6ffffffb => Tag::FLAGS_1,
213 50 : 0x6ffffff0 => Tag::VERSYM,
214 10 : 0x6ffffffc => Tag::VERDEF,
215 10 : 0x6ffffffd => Tag::VERDEFNUM,
216 50 : 0x6ffffffe => Tag::VERNEED,
217 50 : 0x6fffffff => Tag::VERNEEDNUM,
218 0 : 0x6000000d => Tag::ANDROID_REL_OFFSET,
219 0 : 0x6000000e => Tag::ANDROID_REL_SIZE,
220 0 : 0x6000000f => Tag::ANDROID_REL,
221 0 : 0x60000010 => Tag::ANDROID_RELSZ,
222 0 : 0x60000011 => Tag::ANDROID_RELA,
223 0 : 0x60000012 => Tag::ANDROID_RELASZ,
224 0 : 0x6fffe000 => Tag::ANDROID_RELR,
225 0 : 0x6fffe001 => Tag::ANDROID_RELRSZ,
226 0 : 0x6fffe003 => Tag::ANDROID_RELRENT,
227 0 : 0x6fffe005 => Tag::ANDROID_RELRCOUNT,
228 10 : 0x170000001 => Tag::MIPS_RLD_VERSION,
229 0 : 0x170000002 => Tag::MIPS_TIME_STAMP,
230 0 : 0x170000003 => Tag::MIPS_ICHECKSUM,
231 0 : 0x170000004 => Tag::MIPS_IVERSION,
232 10 : 0x170000005 => Tag::MIPS_FLAGS,
233 10 : 0x170000006 => Tag::MIPS_BASE_ADDRESS,
234 0 : 0x170000007 => Tag::MIPS_MSYM,
235 0 : 0x170000008 => Tag::MIPS_CONFLICT,
236 0 : 0x170000009 => Tag::MIPS_LIBLIST,
237 10 : 0x17000000a => Tag::MIPS_LOCAL_GOTNO,
238 0 : 0x17000000b => Tag::MIPS_CONFLICTNO,
239 0 : 0x170000010 => Tag::MIPS_LIBLISTNO,
240 10 : 0x170000011 => Tag::MIPS_SYMTABNO,
241 10 : 0x170000012 => Tag::MIPS_UNREFEXTNO,
242 10 : 0x170000013 => Tag::MIPS_GOTSYM,
243 0 : 0x170000014 => Tag::MIPS_HIPAGENO,
244 10 : 0x170000016 => Tag::MIPS_RLD_MAP,
245 0 : 0x170000017 => Tag::MIPS_DELTA_CLASS,
246 0 : 0x170000018 => Tag::MIPS_DELTA_CLASS_NO,
247 0 : 0x170000019 => Tag::MIPS_DELTA_INSTANCE,
248 0 : 0x17000001a => Tag::MIPS_DELTA_INSTANCE_NO,
249 0 : 0x17000001b => Tag::MIPS_DELTA_RELOC,
250 0 : 0x17000001c => Tag::MIPS_DELTA_RELOC_NO,
251 0 : 0x17000001d => Tag::MIPS_DELTA_SYM,
252 0 : 0x17000001e => Tag::MIPS_DELTA_SYM_NO,
253 0 : 0x170000020 => Tag::MIPS_DELTA_CLASSSYM,
254 0 : 0x170000021 => Tag::MIPS_DELTA_CLASSSYM_NO,
255 0 : 0x170000022 => Tag::MIPS_CXX_FLAGS,
256 0 : 0x170000023 => Tag::MIPS_PIXIE_INIT,
257 0 : 0x170000024 => Tag::MIPS_SYMBOL_LIB,
258 0 : 0x170000025 => Tag::MIPS_LOCALPAGE_GOTIDX,
259 0 : 0x170000026 => Tag::MIPS_LOCAL_GOTIDX,
260 0 : 0x170000027 => Tag::MIPS_HIDDEN_GOTIDX,
261 0 : 0x170000028 => Tag::MIPS_PROTECTED_GOTIDX,
262 0 : 0x170000029 => Tag::MIPS_OPTIONS,
263 0 : 0x17000002a => Tag::MIPS_INTERFACE,
264 0 : 0x17000002b => Tag::MIPS_DYNSTR_ALIGN,
265 0 : 0x17000002c => Tag::MIPS_INTERFACE_SIZE,
266 0 : 0x17000002d => Tag::MIPS_RLD_TEXT_RESOLVE_ADDR,
267 0 : 0x17000002e => Tag::MIPS_PERF_SUFFIX,
268 0 : 0x17000002f => Tag::MIPS_COMPACT_SIZE,
269 0 : 0x170000030 => Tag::MIPS_GP_VALUE,
270 0 : 0x170000031 => Tag::MIPS_AUX_DYNAMIC,
271 10 : 0x170000032 => Tag::MIPS_PLTGOT,
272 0 : 0x170000034 => Tag::MIPS_RWPLT,
273 10 : 0x170000035 => Tag::MIPS_RLD_MAP_REL,
274 0 : 0x170000036 => Tag::MIPS_XHASH,
275 0 : 0x270000001 => Tag::AARCH64_BTI_PLT,
276 0 : 0x270000003 => Tag::AARCH64_PAC_PLT,
277 0 : 0x270000005 => Tag::AARCH64_VARIANT_PCS,
278 0 : 0x270000009 => Tag::AARCH64_MEMTAG_MODE,
279 0 : 0x27000000b => Tag::AARCH64_MEMTAG_HEAP,
280 0 : 0x27000000c => Tag::AARCH64_MEMTAG_STACK,
281 0 : 0x27000000d => Tag::AARCH64_MEMTAG_GLOBALS,
282 0 : 0x27000000f => Tag::AARCH64_MEMTAG_GLOBALSSZ,
283 0 : 0x370000000 => Tag::HEXAGON_SYMSZ,
284 0 : 0x370000001 => Tag::HEXAGON_VER,
285 0 : 0x370000002 => Tag::HEXAGON_PLT,
286 0 : 0x470000000 => Tag::PPC_GOT,
287 0 : 0x470000001 => Tag::PPC_OPT,
288 0 : 0x570000000 => Tag::PPC64_GLINK,
289 0 : 0x570000003 => Tag::PPC64_OPT,
290 0 : 0x670000003 => Tag::RISCV_VARIANT_CC,
291 0 : 0x770000000 => Tag::X86_64_PLT,
292 0 : 0x770000001 => Tag::X86_64_PLTSZ,
293 0 : 0x770000003 => Tag::X86_64_PLTENT,
294 0 : 0x870000000 => Tag::IA_64_PLT_RESERVE,
295 0 : 0x860000000 => Tag::IA_64_VMS_SUBTYPE,
296 0 : 0x860000002 => Tag::IA_64_VMS_IMGIOCNT,
297 0 : 0x860000008 => Tag::IA_64_VMS_LNKFLAGS,
298 0 : 0x86000000a => Tag::IA_64_VMS_VIR_MEM_BLK_SIZ,
299 0 : 0x86000000c => Tag::IA_64_VMS_IDENT,
300 0 : 0x860000010 => Tag::IA_64_VMS_NEEDED_IDENT,
301 0 : 0x860000012 => Tag::IA_64_VMS_IMG_RELA_CNT,
302 0 : 0x860000014 => Tag::IA_64_VMS_SEG_RELA_CNT,
303 0 : 0x860000016 => Tag::IA_64_VMS_FIXUP_RELA_CNT,
304 0 : 0x860000018 => Tag::IA_64_VMS_FIXUP_NEEDED,
305 0 : 0x86000001a => Tag::IA_64_VMS_SYMVEC_CNT,
306 0 : 0x86000001e => Tag::IA_64_VMS_XLATED,
307 0 : 0x860000020 => Tag::IA_64_VMS_STACKSIZE,
308 0 : 0x860000022 => Tag::IA_64_VMS_UNWINDSZ,
309 0 : 0x860000024 => Tag::IA_64_VMS_UNWIND_CODSEG,
310 0 : 0x860000026 => Tag::IA_64_VMS_UNWIND_INFOSEG,
311 0 : 0x860000028 => Tag::IA_64_VMS_LINKTIME,
312 0 : 0x86000002a => Tag::IA_64_VMS_SEG_NO,
313 0 : 0x86000002c => Tag::IA_64_VMS_SYMVEC_OFFSET,
314 0 : 0x86000002e => Tag::IA_64_VMS_SYMVEC_SEG,
315 0 : 0x860000030 => Tag::IA_64_VMS_UNWIND_OFFSET,
316 0 : 0x860000032 => Tag::IA_64_VMS_UNWIND_SEG,
317 0 : 0x860000034 => Tag::IA_64_VMS_STRTAB_OFFSET,
318 0 : 0x860000036 => Tag::IA_64_VMS_SYSVER_OFFSET,
319 0 : 0x860000038 => Tag::IA_64_VMS_IMG_RELA_OFF,
320 0 : 0x86000003a => Tag::IA_64_VMS_SEG_RELA_OFF,
321 0 : 0x86000003c => Tag::IA_64_VMS_FIXUP_RELA_OFF,
322 0 : 0x86000003e => Tag::IA_64_VMS_PLTGOT_OFFSET,
323 0 : 0x860000040 => Tag::IA_64_VMS_PLTGOT_SEG,
324 0 : 0x860000042 => Tag::IA_64_VMS_FPMODE,
325 20 : _ => Tag::UNKNOWN(value),
326 :
327 : }
328 1490 : }
329 : }
330 :
331 : impl From<Tag> for u64 {
332 240 : fn from(value: Tag) -> u64 {
333 240 : match value {
334 0 : Tag::DT_NULL_ => 0x00000000,
335 0 : Tag::NEEDED => 0x00000001,
336 0 : Tag::PLTRELSZ => 0x00000002,
337 0 : Tag::PLTGOT => 0x00000003,
338 0 : Tag::HASH => 0x00000004,
339 0 : Tag::STRTAB => 0x00000005,
340 0 : Tag::SYMTAB => 0x00000006,
341 0 : Tag::RELA => 0x00000007,
342 0 : Tag::RELASZ => 0x00000008,
343 0 : Tag::RELAENT => 0x00000009,
344 0 : Tag::STRSZ => 0x0000000a,
345 0 : Tag::SYMENT => 0x0000000b,
346 0 : Tag::INIT => 0x0000000c,
347 0 : Tag::FINI => 0x0000000d,
348 0 : Tag::SONAME => 0x0000000e,
349 0 : Tag::RPATH => 0x0000000f,
350 0 : Tag::SYMBOLIC => 0x00000010,
351 0 : Tag::REL => 0x00000011,
352 0 : Tag::RELSZ => 0x00000012,
353 0 : Tag::RELENT => 0x00000013,
354 0 : Tag::PLTREL => 0x00000014,
355 0 : Tag::DEBUG_TAG => 0x00000015,
356 0 : Tag::TEXTREL => 0x00000016,
357 0 : Tag::JMPREL => 0x00000017,
358 0 : Tag::BIND_NOW => 0x00000018,
359 80 : Tag::INIT_ARRAY => 0x00000019,
360 80 : Tag::FINI_ARRAY => 0x0000001a,
361 0 : Tag::INIT_ARRAYSZ => 0x0000001b,
362 0 : Tag::FINI_ARRAYSZ => 0x0000001c,
363 0 : Tag::RUNPATH => 0x0000001d,
364 0 : Tag::FLAGS => 0x0000001e,
365 80 : Tag::PREINIT_ARRAY => 0x00000020,
366 0 : Tag::PREINIT_ARRAYSZ => 0x00000021,
367 0 : Tag::SYMTAB_SHNDX => 0x00000022,
368 0 : Tag::RELRSZ => 0x00000023,
369 0 : Tag::RELR => 0x00000024,
370 0 : Tag::RELRENT => 0x00000025,
371 0 : Tag::GNU_HASH => 0x6ffffef5,
372 0 : Tag::RELACOUNT => 0x6ffffff9,
373 0 : Tag::RELCOUNT => 0x6ffffffa,
374 0 : Tag::FLAGS_1 => 0x6ffffffb,
375 0 : Tag::VERSYM => 0x6ffffff0,
376 0 : Tag::VERDEF => 0x6ffffffc,
377 0 : Tag::VERDEFNUM => 0x6ffffffd,
378 0 : Tag::VERNEED => 0x6ffffffe,
379 0 : Tag::VERNEEDNUM => 0x6fffffff,
380 0 : Tag::ANDROID_REL_OFFSET => 0x6000000d,
381 0 : Tag::ANDROID_REL_SIZE => 0x6000000e,
382 0 : Tag::ANDROID_REL => 0x6000000f,
383 0 : Tag::ANDROID_RELSZ => 0x60000010,
384 0 : Tag::ANDROID_RELA => 0x60000011,
385 0 : Tag::ANDROID_RELASZ => 0x60000012,
386 0 : Tag::ANDROID_RELR => 0x6fffe000,
387 0 : Tag::ANDROID_RELRSZ => 0x6fffe001,
388 0 : Tag::ANDROID_RELRENT => 0x6fffe003,
389 0 : Tag::ANDROID_RELRCOUNT => 0x6fffe005,
390 0 : Tag::MIPS_RLD_VERSION => 0x170000001,
391 0 : Tag::MIPS_TIME_STAMP => 0x170000002,
392 0 : Tag::MIPS_ICHECKSUM => 0x170000003,
393 0 : Tag::MIPS_IVERSION => 0x170000004,
394 0 : Tag::MIPS_FLAGS => 0x170000005,
395 0 : Tag::MIPS_BASE_ADDRESS => 0x170000006,
396 0 : Tag::MIPS_MSYM => 0x170000007,
397 0 : Tag::MIPS_CONFLICT => 0x170000008,
398 0 : Tag::MIPS_LIBLIST => 0x170000009,
399 0 : Tag::MIPS_LOCAL_GOTNO => 0x17000000a,
400 0 : Tag::MIPS_CONFLICTNO => 0x17000000b,
401 0 : Tag::MIPS_LIBLISTNO => 0x170000010,
402 0 : Tag::MIPS_SYMTABNO => 0x170000011,
403 0 : Tag::MIPS_UNREFEXTNO => 0x170000012,
404 0 : Tag::MIPS_GOTSYM => 0x170000013,
405 0 : Tag::MIPS_HIPAGENO => 0x170000014,
406 0 : Tag::MIPS_RLD_MAP => 0x170000016,
407 0 : Tag::MIPS_DELTA_CLASS => 0x170000017,
408 0 : Tag::MIPS_DELTA_CLASS_NO => 0x170000018,
409 0 : Tag::MIPS_DELTA_INSTANCE => 0x170000019,
410 0 : Tag::MIPS_DELTA_INSTANCE_NO => 0x17000001a,
411 0 : Tag::MIPS_DELTA_RELOC => 0x17000001b,
412 0 : Tag::MIPS_DELTA_RELOC_NO => 0x17000001c,
413 0 : Tag::MIPS_DELTA_SYM => 0x17000001d,
414 0 : Tag::MIPS_DELTA_SYM_NO => 0x17000001e,
415 0 : Tag::MIPS_DELTA_CLASSSYM => 0x170000020,
416 0 : Tag::MIPS_DELTA_CLASSSYM_NO => 0x170000021,
417 0 : Tag::MIPS_CXX_FLAGS => 0x170000022,
418 0 : Tag::MIPS_PIXIE_INIT => 0x170000023,
419 0 : Tag::MIPS_SYMBOL_LIB => 0x170000024,
420 0 : Tag::MIPS_LOCALPAGE_GOTIDX => 0x170000025,
421 0 : Tag::MIPS_LOCAL_GOTIDX => 0x170000026,
422 0 : Tag::MIPS_HIDDEN_GOTIDX => 0x170000027,
423 0 : Tag::MIPS_PROTECTED_GOTIDX => 0x170000028,
424 0 : Tag::MIPS_OPTIONS => 0x170000029,
425 0 : Tag::MIPS_INTERFACE => 0x17000002a,
426 0 : Tag::MIPS_DYNSTR_ALIGN => 0x17000002b,
427 0 : Tag::MIPS_INTERFACE_SIZE => 0x17000002c,
428 0 : Tag::MIPS_RLD_TEXT_RESOLVE_ADDR => 0x17000002d,
429 0 : Tag::MIPS_PERF_SUFFIX => 0x17000002e,
430 0 : Tag::MIPS_COMPACT_SIZE => 0x17000002f,
431 0 : Tag::MIPS_GP_VALUE => 0x170000030,
432 0 : Tag::MIPS_AUX_DYNAMIC => 0x170000031,
433 0 : Tag::MIPS_PLTGOT => 0x170000032,
434 0 : Tag::MIPS_RWPLT => 0x170000034,
435 0 : Tag::MIPS_RLD_MAP_REL => 0x170000035,
436 0 : Tag::MIPS_XHASH => 0x170000036,
437 0 : Tag::AARCH64_BTI_PLT => 0x270000001,
438 0 : Tag::AARCH64_PAC_PLT => 0x270000003,
439 0 : Tag::AARCH64_VARIANT_PCS => 0x270000005,
440 0 : Tag::AARCH64_MEMTAG_MODE => 0x270000009,
441 0 : Tag::AARCH64_MEMTAG_HEAP => 0x27000000b,
442 0 : Tag::AARCH64_MEMTAG_STACK => 0x27000000c,
443 0 : Tag::AARCH64_MEMTAG_GLOBALS => 0x27000000d,
444 0 : Tag::AARCH64_MEMTAG_GLOBALSSZ => 0x27000000f,
445 0 : Tag::HEXAGON_SYMSZ => 0x370000000,
446 0 : Tag::HEXAGON_VER => 0x370000001,
447 0 : Tag::HEXAGON_PLT => 0x370000002,
448 0 : Tag::PPC_GOT => 0x470000000,
449 0 : Tag::PPC_OPT => 0x470000001,
450 0 : Tag::PPC64_GLINK => 0x570000000,
451 0 : Tag::PPC64_OPT => 0x570000003,
452 0 : Tag::RISCV_VARIANT_CC => 0x670000003,
453 0 : Tag::X86_64_PLT => 0x770000000,
454 0 : Tag::X86_64_PLTSZ => 0x770000001,
455 0 : Tag::X86_64_PLTENT => 0x770000003,
456 0 : Tag::IA_64_PLT_RESERVE => 0x870000000,
457 0 : Tag::IA_64_VMS_SUBTYPE => 0x860000000,
458 0 : Tag::IA_64_VMS_IMGIOCNT => 0x860000002,
459 0 : Tag::IA_64_VMS_LNKFLAGS => 0x860000008,
460 0 : Tag::IA_64_VMS_VIR_MEM_BLK_SIZ => 0x86000000a,
461 0 : Tag::IA_64_VMS_IDENT => 0x86000000c,
462 0 : Tag::IA_64_VMS_NEEDED_IDENT => 0x860000010,
463 0 : Tag::IA_64_VMS_IMG_RELA_CNT => 0x860000012,
464 0 : Tag::IA_64_VMS_SEG_RELA_CNT => 0x860000014,
465 0 : Tag::IA_64_VMS_FIXUP_RELA_CNT => 0x860000016,
466 0 : Tag::IA_64_VMS_FIXUP_NEEDED => 0x860000018,
467 0 : Tag::IA_64_VMS_SYMVEC_CNT => 0x86000001a,
468 0 : Tag::IA_64_VMS_XLATED => 0x86000001e,
469 0 : Tag::IA_64_VMS_STACKSIZE => 0x860000020,
470 0 : Tag::IA_64_VMS_UNWINDSZ => 0x860000022,
471 0 : Tag::IA_64_VMS_UNWIND_CODSEG => 0x860000024,
472 0 : Tag::IA_64_VMS_UNWIND_INFOSEG => 0x860000026,
473 0 : Tag::IA_64_VMS_LINKTIME => 0x860000028,
474 0 : Tag::IA_64_VMS_SEG_NO => 0x86000002a,
475 0 : Tag::IA_64_VMS_SYMVEC_OFFSET => 0x86000002c,
476 0 : Tag::IA_64_VMS_SYMVEC_SEG => 0x86000002e,
477 0 : Tag::IA_64_VMS_UNWIND_OFFSET => 0x860000030,
478 0 : Tag::IA_64_VMS_UNWIND_SEG => 0x860000032,
479 0 : Tag::IA_64_VMS_STRTAB_OFFSET => 0x860000034,
480 0 : Tag::IA_64_VMS_SYSVER_OFFSET => 0x860000036,
481 0 : Tag::IA_64_VMS_IMG_RELA_OFF => 0x860000038,
482 0 : Tag::IA_64_VMS_SEG_RELA_OFF => 0x86000003a,
483 0 : Tag::IA_64_VMS_FIXUP_RELA_OFF => 0x86000003c,
484 0 : Tag::IA_64_VMS_PLTGOT_OFFSET => 0x86000003e,
485 0 : Tag::IA_64_VMS_PLTGOT_SEG => 0x860000040,
486 0 : Tag::IA_64_VMS_FPMODE => 0x860000042,
487 0 : Tag::UNKNOWN(value) => value,
488 : }
489 240 : }
490 : }
491 :
492 1490 : #[derive(Debug)]
493 : /// Enum that represents the different variants of a dynamic entry
494 : pub enum Entries<'a> {
495 : /// Entry for `DT_NEEDED`
496 : Library(Library<'a>),
497 :
498 : /// Entry for `DT_INIT_ARRAY, DT_FINI_ARRAY`, ...
499 : Array(Array<'a>),
500 :
501 : /// Entry for `DT_RPATH`
502 : Rpath(Rpath<'a>),
503 :
504 : /// Entry for `DT_RUNPATH`
505 : RunPath(RunPath<'a>),
506 :
507 : /// Entry for `DT_SONAME`
508 : SharedObject(SharedObject<'a>),
509 :
510 : /// Entry for `DT_FLAGS` and `DT_FLAGS_1`
511 : Flags(Flags<'a>),
512 :
513 : /// Generic value
514 : Generic(Generic<'a>),
515 : }
516 :
517 : /// Trait shared by all the [`Entries`]
518 : pub trait DynamicEntry {
519 : #[doc(hidden)]
520 : fn as_base(&self) -> &ffi::ELF_DynamicEntry;
521 :
522 : /// Dynamic TAG associated with the entry
523 149 : fn tag(&self) -> Tag {
524 149 : Tag::from(self.as_base().tag())
525 149 : }
526 :
527 : /// Raw value which should be interpreted according to the [`DynamicEntry::tag`]
528 144 : fn value(&self) -> u64 {
529 144 : self.as_base().value()
530 144 : }
531 : }
532 :
533 : impl DynamicEntry for Entries<'_> {
534 0 : fn as_base(&self) -> &ffi::ELF_DynamicEntry {
535 0 : match &self {
536 0 : Entries::Library(entry) => {
537 0 : entry.as_base()
538 : }
539 :
540 0 : Entries::Array(entry) => {
541 0 : entry.as_base()
542 : }
543 :
544 0 : Entries::Rpath(entry) => {
545 0 : entry.as_base()
546 : }
547 :
548 0 : Entries::RunPath(entry) => {
549 0 : entry.as_base()
550 : }
551 :
552 0 : Entries::SharedObject(entry) => {
553 0 : entry.as_base()
554 : }
555 :
556 0 : Entries::Flags(entry) => {
557 0 : entry.as_base()
558 : }
559 :
560 0 : Entries::Generic(entry) => {
561 0 : entry.as_base()
562 : }
563 : }
564 0 : }
565 : }
566 :
567 : impl FromFFI<ffi::ELF_DynamicEntry> for Entries<'_> {
568 1490 : fn from_ffi(ffi_entry: cxx::UniquePtr<ffi::ELF_DynamicEntry>) -> Self {
569 1490 : unsafe {
570 1490 : let cmd_ref = ffi_entry.as_ref().unwrap();
571 1490 :
572 1490 : if ffi::ELF_DynamicEntryLibrary::classof(cmd_ref) {
573 180 : let raw = {
574 180 : type From = cxx::UniquePtr<ffi::ELF_DynamicEntry>;
575 180 : type To = cxx::UniquePtr<ffi::ELF_DynamicEntryLibrary>;
576 180 : std::mem::transmute::<From, To>(ffi_entry)
577 180 : };
578 180 : Entries::Library(Library::from_ffi(raw))
579 : }
580 1310 : else if ffi::ELF_DynamicEntryArray::classof(cmd_ref) {
581 70 : let raw = {
582 70 : type From = cxx::UniquePtr<ffi::ELF_DynamicEntry>;
583 70 : type To = cxx::UniquePtr<ffi::ELF_DynamicEntryArray>;
584 70 : std::mem::transmute::<From, To>(ffi_entry)
585 70 : };
586 70 : Entries::Array(Array::from_ffi(raw))
587 : }
588 1240 : else if ffi::ELF_DynamicEntryRpath::classof(cmd_ref) {
589 10 : let raw = {
590 10 : type From = cxx::UniquePtr<ffi::ELF_DynamicEntry>;
591 10 : type To = cxx::UniquePtr<ffi::ELF_DynamicEntryRpath>;
592 10 : std::mem::transmute::<From, To>(ffi_entry)
593 10 : };
594 10 : Entries::Rpath(Rpath::from_ffi(raw))
595 : }
596 1230 : else if ffi::ELF_DynamicEntryRunPath::classof(cmd_ref) {
597 10 : let raw = {
598 10 : type From = cxx::UniquePtr<ffi::ELF_DynamicEntry>;
599 10 : type To = cxx::UniquePtr<ffi::ELF_DynamicEntryRunPath>;
600 10 : std::mem::transmute::<From, To>(ffi_entry)
601 10 : };
602 10 : Entries::RunPath(RunPath::from_ffi(raw))
603 : }
604 1220 : else if ffi::ELF_DynamicSharedObject::classof(cmd_ref) {
605 10 : let raw = {
606 10 : type From = cxx::UniquePtr<ffi::ELF_DynamicEntry>;
607 10 : type To = cxx::UniquePtr<ffi::ELF_DynamicSharedObject>;
608 10 : std::mem::transmute::<From, To>(ffi_entry)
609 10 : };
610 10 : Entries::SharedObject(SharedObject::from_ffi(raw))
611 : }
612 1210 : else if ffi::ELF_DynamicEntryFlags::classof(cmd_ref) {
613 20 : let raw = {
614 20 : type From = cxx::UniquePtr<ffi::ELF_DynamicEntry>;
615 20 : type To = cxx::UniquePtr<ffi::ELF_DynamicEntryFlags>;
616 20 : std::mem::transmute::<From, To>(ffi_entry)
617 20 : };
618 20 : Entries::Flags(Flags::from_ffi(raw))
619 : }
620 : else {
621 1190 : Entries::Generic(Generic::from_ffi(ffi_entry))
622 : }
623 : }
624 1490 : }
625 : }
626 :
627 :
628 : /// Generic structure for the dynamic entries whose [`DynamicEntry::value`] can be interpreted
629 : /// as is.
630 : pub struct Generic<'a> {
631 : ptr: cxx::UniquePtr<ffi::ELF_DynamicEntry>,
632 : _owner: PhantomData<&'a ffi::ELF_Binary>
633 : }
634 :
635 : impl FromFFI<ffi::ELF_DynamicEntry> for Generic<'_> {
636 1190 : fn from_ffi(ptr: cxx::UniquePtr<ffi::ELF_DynamicEntry>) -> Self {
637 1190 : Self {
638 1190 : ptr,
639 1190 : _owner: PhantomData
640 1190 : }
641 1190 : }
642 :
643 : }
644 :
645 : impl DynamicEntry for Generic<'_> {
646 2380 : fn as_base(&self) -> &ffi::ELF_DynamicEntry {
647 2380 : self.ptr.as_ref().unwrap()
648 2380 : }
649 : }
650 :
651 : impl std::fmt::Debug for Generic<'_> {
652 1190 : fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
653 1190 : f.debug_struct("Generic").finish()
654 1190 : }
655 : }
656 :
657 : /// Structure that represents a dynamic entry associated with a library name (e.g. `DT_NEEDED`)
658 : pub struct Library<'a> {
659 : ptr: cxx::UniquePtr<ffi::ELF_DynamicEntryLibrary>,
660 : _owner: PhantomData<&'a ffi::ELF_Binary>
661 : }
662 :
663 : impl Library<'_> {
664 180 : pub fn name(&self) -> String {
665 180 : self.ptr.name().to_string()
666 180 : }
667 : }
668 :
669 : impl FromFFI<ffi::ELF_DynamicEntryLibrary> for Library<'_> {
670 200 : fn from_ffi(ptr: cxx::UniquePtr<ffi::ELF_DynamicEntryLibrary>) -> Self {
671 200 : Self {
672 200 : ptr,
673 200 : _owner: PhantomData
674 200 : }
675 200 : }
676 : }
677 :
678 :
679 : impl DynamicEntry for Library<'_> {
680 360 : fn as_base(&self) -> &ffi::ELF_DynamicEntry {
681 360 : self.ptr.as_ref().unwrap().as_ref()
682 360 : }
683 : }
684 :
685 : impl std::fmt::Debug for Library<'_> {
686 180 : fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
687 180 : f.debug_struct("Library").finish()
688 180 : }
689 : }
690 :
691 : /// Structure that represents a dynamic entry associated with an array (e.g. `DT_INIT_ARRAY`)
692 : pub struct Array<'a> {
693 : ptr: cxx::UniquePtr<ffi::ELF_DynamicEntryArray>,
694 : _owner: PhantomData<&'a ffi::ELF_Binary>
695 : }
696 :
697 : impl Array<'_> {
698 70 : pub fn array(&self) -> Vec<u64> {
699 70 : Vec::from(self.ptr.array().as_slice())
700 70 : }
701 : }
702 :
703 : impl FromFFI<ffi::ELF_DynamicEntryArray> for Array<'_> {
704 70 : fn from_ffi(ptr: cxx::UniquePtr<ffi::ELF_DynamicEntryArray>) -> Self {
705 70 : Self {
706 70 : ptr,
707 70 : _owner: PhantomData
708 70 : }
709 70 : }
710 : }
711 :
712 : impl DynamicEntry for Array<'_> {
713 140 : fn as_base(&self) -> &ffi::ELF_DynamicEntry {
714 140 : self.ptr.as_ref().unwrap().as_ref()
715 140 : }
716 : }
717 :
718 : impl std::fmt::Debug for Array<'_> {
719 70 : fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
720 70 : f.debug_struct("Array").finish()
721 70 : }
722 : }
723 :
724 : /// Structure that represents a dynamic entry associated with the rpath info
725 : pub struct Rpath<'a> {
726 : ptr: cxx::UniquePtr<ffi::ELF_DynamicEntryRpath>,
727 : _owner: PhantomData<&'a ffi::ELF_Binary>
728 : }
729 :
730 : impl Rpath<'_> {
731 10 : pub fn rpath(&self) -> String {
732 10 : self.ptr.rpath().to_string()
733 10 : }
734 : }
735 :
736 : impl FromFFI<ffi::ELF_DynamicEntryRpath> for Rpath<'_> {
737 10 : fn from_ffi(ptr: cxx::UniquePtr<ffi::ELF_DynamicEntryRpath>) -> Self {
738 10 : Self {
739 10 : ptr,
740 10 : _owner: PhantomData
741 10 : }
742 10 : }
743 : }
744 :
745 :
746 : impl DynamicEntry for Rpath<'_> {
747 10 : fn as_base(&self) -> &ffi::ELF_DynamicEntry {
748 10 : self.ptr.as_ref().unwrap().as_ref()
749 10 : }
750 : }
751 :
752 : impl std::fmt::Debug for Rpath<'_> {
753 10 : fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
754 10 : f.debug_struct("Rpath").finish()
755 10 : }
756 : }
757 :
758 : /// Structure that represents a dynamic entry associated with the runpath info
759 : pub struct RunPath<'a> {
760 : ptr: cxx::UniquePtr<ffi::ELF_DynamicEntryRunPath>,
761 : _owner: PhantomData<&'a ffi::ELF_Binary>
762 : }
763 :
764 : impl RunPath<'_> {
765 10 : pub fn runpath(&self) -> String {
766 10 : self.ptr.runpath().to_string()
767 10 : }
768 : }
769 :
770 : impl FromFFI<ffi::ELF_DynamicEntryRunPath> for RunPath<'_> {
771 10 : fn from_ffi(ptr: cxx::UniquePtr<ffi::ELF_DynamicEntryRunPath>) -> Self {
772 10 : Self {
773 10 : ptr,
774 10 : _owner: PhantomData
775 10 : }
776 10 : }
777 : }
778 :
779 :
780 : impl DynamicEntry for RunPath<'_> {
781 10 : fn as_base(&self) -> &ffi::ELF_DynamicEntry {
782 10 : self.ptr.as_ref().unwrap().as_ref()
783 10 : }
784 : }
785 :
786 : impl std::fmt::Debug for RunPath<'_> {
787 10 : fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
788 10 : f.debug_struct("RunPath").finish()
789 10 : }
790 : }
791 :
792 : /// Structure that represents a dynamic entry associated with the name of a library (`DT_SONAME`)
793 : pub struct SharedObject<'a> {
794 : ptr: cxx::UniquePtr<ffi::ELF_DynamicSharedObject>,
795 : _owner: PhantomData<&'a ffi::ELF_Binary>
796 : }
797 :
798 : impl SharedObject<'_> {
799 10 : pub fn name(&self) -> String {
800 10 : self.ptr.name().to_string()
801 10 : }
802 : }
803 :
804 : impl FromFFI<ffi::ELF_DynamicSharedObject> for SharedObject<'_> {
805 10 : fn from_ffi(ptr: cxx::UniquePtr<ffi::ELF_DynamicSharedObject>) -> Self {
806 10 : Self {
807 10 : ptr,
808 10 : _owner: PhantomData
809 10 : }
810 10 : }
811 : }
812 :
813 : impl DynamicEntry for SharedObject<'_> {
814 10 : fn as_base(&self) -> &ffi::ELF_DynamicEntry {
815 10 : self.ptr.as_ref().unwrap().as_ref()
816 10 : }
817 : }
818 :
819 : impl std::fmt::Debug for SharedObject<'_> {
820 10 : fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
821 10 : f.debug_struct("SharedObject").finish()
822 10 : }
823 : }
824 :
825 : /// Structure that represents a dynamic flag entry: `DT_FLAGS` or `DT_FLAGS_1`
826 : pub struct Flags<'a> {
827 : ptr: cxx::UniquePtr<ffi::ELF_DynamicEntryFlags>,
828 : _owner: PhantomData<&'a ffi::ELF_Binary>
829 : }
830 :
831 : impl Flags<'_> {
832 20 : pub fn flags(&self) -> DtFlags {
833 20 : DtFlags::from(self.ptr.flags())
834 20 : }
835 : }
836 :
837 : impl FromFFI<ffi::ELF_DynamicEntryFlags> for Flags<'_> {
838 20 : fn from_ffi(ptr: cxx::UniquePtr<ffi::ELF_DynamicEntryFlags>) -> Self {
839 20 : Self {
840 20 : ptr,
841 20 : _owner: PhantomData
842 20 : }
843 20 : }
844 : }
845 :
846 : impl DynamicEntry for Flags<'_> {
847 20 : fn as_base(&self) -> &ffi::ELF_DynamicEntry {
848 20 : self.ptr.as_ref().unwrap().as_ref()
849 20 : }
850 : }
851 :
852 : impl std::fmt::Debug for Flags<'_> {
853 20 : fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
854 20 : f.debug_struct("Flags").finish()
855 20 : }
856 : }
857 :
858 :
859 0 : bitflags! {
860 20 : #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
861 0 : pub struct DtFlags: u64 {
862 0 : const ORIGIN = 0x1;
863 0 : const SYMBOLIC = 0x2;
864 0 : const TEXTREL = 0x4;
865 0 : const BIND_NOW = 0x8;
866 0 : const STATIC_TLS = 0x10;
867 0 : const NOW = 0x100000001;
868 0 : const GLOBAL = 0x100000002;
869 0 : const GROUP = 0x100000004;
870 0 : const NODELETE = 0x100000008;
871 0 : const LOADFLTR = 0x100000010;
872 0 : const INITFIRST = 0x100000020;
873 0 : const NOOPEN = 0x100000040;
874 0 : const HANDLE_ORIGIN = 0x100000080;
875 0 : const DIRECT = 0x100000100;
876 0 : const TRANS = 0x100000200;
877 0 : const INTERPOSE = 0x100000400;
878 0 : const NODEFLIB = 0x100000800;
879 0 : const NODUMP = 0x100001000;
880 0 : const CONFALT = 0x100002000;
881 0 : const ENDFILTEE = 0x100004000;
882 0 : const DISPRELDNE = 0x100008000;
883 0 : const DISPRELPND = 0x100010000;
884 0 : const NODIRECT = 0x100020000;
885 0 : const IGNMULDEF = 0x100040000;
886 0 : const NOKSYMS = 0x100080000;
887 0 : const NOHDR = 0x100100000;
888 0 : const EDITED = 0x100200000;
889 0 : const NORELOC = 0x100400000;
890 0 : const SYMINTPOSE = 0x100800000;
891 0 : const GLOBAUDIT = 0x101000000;
892 0 : const SINGLETON = 0x102000000;
893 0 : const PIE = 0x108000000;
894 0 : const KMOD = 0x110000000;
895 0 : const WEAKFILTER = 0x120000000;
896 0 : const NOCOMMON = 0x140000000;
897 0 : }
898 0 : }
899 :
900 :
901 : impl From<u64> for DtFlags {
902 20 : fn from(value: u64) -> Self {
903 20 : DtFlags::from_bits_truncate(value)
904 20 : }
905 : }
906 : impl From<DtFlags> for u64 {
907 0 : fn from(value: DtFlags) -> Self {
908 0 : value.bits()
909 0 : }
910 : }
911 : impl std::fmt::Display for DtFlags {
912 0 : fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
913 0 : bitflags::parser::to_writer(self, f)
914 0 : }
915 : }
916 :
917 1490 : declare_iterator!(DynamicEntries, Entries<'a>, ffi::ELF_DynamicEntry, ffi::ELF_Binary, ffi::ELF_Binary_it_dynamic_entries);
|