(hashtab: &'a [u8], dynsyms: &'a [DynEntry])
| 47 | |
| 48 | impl<'a> GnuHashTable<'a> { |
| 49 | unsafe fn new(hashtab: &'a [u8], dynsyms: &'a [DynEntry]) -> GnuHashTable<'a> { |
| 50 | let [nbuckets, symindex, maskwords, shift2] = |
| 51 | (hashtab.as_ptr() as *const u32 as *const [u32; 4]).read(); |
| 52 | |
| 53 | let hashtab = &hashtab[16..]; |
| 54 | |
| 55 | let bloom_filter_ptr = hashtab.as_ptr() as *const usize; |
| 56 | let buckets_ptr = bloom_filter_ptr.add(maskwords as usize) as *const u32; |
| 57 | let chains_ptr = buckets_ptr.add(nbuckets as usize); |
| 58 | let bloom_filter = slice::from_raw_parts(bloom_filter_ptr, maskwords as usize); |
| 59 | let buckets = slice::from_raw_parts(buckets_ptr, nbuckets as usize); |
| 60 | let chains = slice::from_raw_parts(chains_ptr, dynsyms.len() - symindex as usize); |
| 61 | Self { |
| 62 | symindex, |
| 63 | shift2, |
| 64 | bloom_filter, |
| 65 | buckets, |
| 66 | chains, |
| 67 | dynsyms, |
| 68 | } |
| 69 | } |
| 70 | |
| 71 | fn hash(symbol_name: &str) -> u32 { |
| 72 | let mut h: u32 = 5381; |
nothing calls this directly
no outgoing calls
no test coverage detected