LCOV - code coverage report
Current view: top level - src/elf - dynamic.rs (source / functions) Coverage Total Hit
Test: lief.lcov Lines: 48.0 % 404 194
Test Date: 2024-10-27:00:00:00 Functions: 86.4 % 44 38

            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);
        

Generated by: LCOV version 2.1-1