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