LCOV - code coverage report
Current view: top level - src/elf - dynamic.rs (source / functions) Coverage Total Hit
Test: lief.lcov Lines: 46.1 % 477 220
Test Date: 2024-11-30:00:00:00 Functions: 76.3 % 59 45

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

Generated by: LCOV version 2.1-1