LCOV - code coverage report
Current view: top level - src/elf - hash.rs (source / functions) Coverage Total Hit
Test: lief.lcov Lines: 100.0 % 64 64
Test Date: 2026-04-12:00:00:00 Functions: 100.0 % 15 15

            Line data    Source code
       1              : use crate::common::FromFFI;
       2              : use lief_ffi as ffi;
       3              : use std::fmt;
       4              : use std::marker::PhantomData;
       5              : 
       6              : /// This structure wraps the sysv-hash info
       7              : pub struct Sysv<'a> {
       8              :     ptr: cxx::UniquePtr<ffi::ELF_SysvHash>,
       9              :     _owner: PhantomData<&'a ffi::ELF_Binary>,
      10              : }
      11              : 
      12              : impl Sysv<'_> {
      13              :     /// Number of bucket used for this hash table
      14           26 :     pub fn nbucket(&self) -> u32 {
      15           26 :         self.ptr.nbucket()
      16           26 :     }
      17              : 
      18              :     /// Number of chains used for this hash table
      19           26 :     pub fn nchain(&self) -> u32 {
      20           26 :         self.ptr.nchain()
      21           26 :     }
      22              : 
      23              :     /// Bucket's values
      24           26 :     pub fn buckets(&self) -> Vec<u32> {
      25           26 :         Vec::from(self.ptr.buckets().as_slice())
      26           26 :     }
      27              : 
      28              :     /// Chain's values
      29           26 :     pub fn chains(&self) -> Vec<u32> {
      30           26 :         Vec::from(self.ptr.chains().as_slice())
      31           26 :     }
      32              : }
      33              : 
      34              : impl fmt::Debug for Sysv<'_> {
      35           26 :     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
      36           26 :         f.debug_struct("Sysv")
      37           26 :             .field("nbucket", &self.nbucket())
      38           26 :             .field("nchain", &self.nchain())
      39           26 :             .field("buckets", &self.buckets())
      40           26 :             .field("chains", &self.chains())
      41           26 :             .finish()
      42           26 :     }
      43              : }
      44              : 
      45              : impl FromFFI<ffi::ELF_SysvHash> for Sysv<'_> {
      46           26 :     fn from_ffi(ptr: cxx::UniquePtr<ffi::ELF_SysvHash>) -> Self {
      47           26 :         Self {
      48           26 :             ptr,
      49           26 :             _owner: PhantomData,
      50           26 :         }
      51           26 :     }
      52              : }
      53              : 
      54              : /// Structure that wraps the GNU-hash implementation
      55              : pub struct Gnu<'a> {
      56              :     ptr: cxx::UniquePtr<ffi::ELF_GnuHash>,
      57              :     _owner: PhantomData<&'a ffi::ELF_Binary>,
      58              : }
      59              : 
      60              : impl Gnu<'_> {
      61              :     /// Number of buckets used in this hash table
      62           78 :     pub fn nb_buckets(&self) -> u32 {
      63           78 :         self.ptr.nb_buckets()
      64           78 :     }
      65              : 
      66              :     /// Index of the first symbol in the dynamic symbols table which accessible with the hash table
      67           78 :     pub fn symbol_index(&self) -> u32 {
      68           78 :         self.ptr.symbol_index()
      69           78 :     }
      70              : 
      71              :     /// Shift count used in the bloom filter
      72           78 :     pub fn shift2(&self) -> u32 {
      73           78 :         self.ptr.shift2()
      74           78 :     }
      75              : 
      76              :     /// Number of bloom filters used. It must be a power of 2.
      77           78 :     pub fn maskwords(&self) -> u32 {
      78           78 :         self.ptr.maskwords()
      79           78 :     }
      80              : 
      81              :     /// Bloom filters
      82           78 :     pub fn bloom_filters(&self) -> Vec<u64> {
      83           78 :         Vec::from(self.ptr.bloom_filters().as_slice())
      84           78 :     }
      85              : 
      86              :     /// Hash bucket values
      87           78 :     pub fn buckets(&self) -> Vec<u32> {
      88           78 :         Vec::from(self.ptr.buckets().as_slice())
      89           78 :     }
      90              : 
      91              :     /// Hash values
      92           78 :     pub fn hash_values(&self) -> Vec<u32> {
      93           78 :         Vec::from(self.ptr.hash_values().as_slice())
      94           78 :     }
      95              : }
      96              : 
      97              : impl fmt::Debug for Gnu<'_> {
      98           78 :     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
      99           78 :         f.debug_struct("GnuHash")
     100           78 :             .field("nb_buckets", &self.nb_buckets())
     101           78 :             .field("symbol_index", &self.symbol_index())
     102           78 :             .field("shift2", &self.shift2())
     103           78 :             .field("maskwords", &self.maskwords())
     104           78 :             .field("bloom_filters", &self.bloom_filters())
     105           78 :             .field("buckets", &self.buckets())
     106           78 :             .field("hash_values", &self.hash_values())
     107           78 :             .finish()
     108           78 :     }
     109              : }
     110              : 
     111              : impl FromFFI<ffi::ELF_GnuHash> for Gnu<'_> {
     112           78 :     fn from_ffi(ptr: cxx::UniquePtr<ffi::ELF_GnuHash>) -> Self {
     113           78 :         Self {
     114           78 :             ptr,
     115           78 :             _owner: PhantomData,
     116           78 :         }
     117           78 :     }
     118              : }
        

Generated by: LCOV version 2.1-1