From c81d959afbac852bee0c6ff940ea67977d745d5e Mon Sep 17 00:00:00 2001 From: Gunnar Beutner Date: Tue, 29 Jun 2021 00:41:30 +0200 Subject: [PATCH] LibELF: Implement GNU hash section lookups for x86_64 --- Userland/Libraries/LibELF/DynamicObject.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibELF/DynamicObject.cpp b/Userland/Libraries/LibELF/DynamicObject.cpp index 21acbe77f5..1f2bc7d015 100644 --- a/Userland/Libraries/LibELF/DynamicObject.cpp +++ b/Userland/Libraries/LibELF/DynamicObject.cpp @@ -276,8 +276,7 @@ auto DynamicObject::HashSection::lookup_sysv_symbol(const StringView& name, u32 auto DynamicObject::HashSection::lookup_gnu_symbol(const StringView& name, u32 hash_value) const -> Optional { // Algorithm reference: https://ent-voy.blogspot.com/2011/02/ - // TODO: Handle 64bit bloomwords for ELF_CLASS64 - using BloomWord = u32; + using BloomWord = FlatPtr; constexpr size_t bloom_word_size = sizeof(BloomWord) * 8; const u32* hash_table_begin = (u32*)address().as_ptr(); @@ -289,13 +288,13 @@ auto DynamicObject::HashSection::lookup_gnu_symbol(const StringView& name, u32 h const u32 num_maskwords_bitmask = num_maskwords - 1; const u32 shift2 = hash_table_begin[3]; - const BloomWord* bloom_words = &hash_table_begin[4]; - const u32* const buckets = &bloom_words[num_maskwords]; + const BloomWord* bloom_words = (BloomWord const*)&hash_table_begin[4]; + const u32* const buckets = (u32 const*)&bloom_words[num_maskwords]; const u32* const chains = &buckets[num_buckets]; BloomWord hash1 = hash_value; BloomWord hash2 = hash1 >> shift2; - const BloomWord bitmask = (1 << (hash1 % bloom_word_size)) | (1 << (hash2 % bloom_word_size)); + const BloomWord bitmask = ((BloomWord)1 << (hash1 % bloom_word_size)) | ((BloomWord)1 << (hash2 % bloom_word_size)); if ((bloom_words[(hash1 / bloom_word_size) & num_maskwords_bitmask] & bitmask) != bitmask) return {};