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