summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ldso/ldso/dl-hash.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/ldso/ldso/dl-hash.c b/ldso/ldso/dl-hash.c
index 863f8fb6e..5de38a61e 100644
--- a/ldso/ldso/dl-hash.c
+++ b/ldso/ldso/dl-hash.c
@@ -59,14 +59,20 @@ struct dyn_elf *_dl_handles = NULL;
* it to decode the hash table. */
static inline unsigned long _dl_elf_hash(const unsigned char *name)
{
- unsigned long hash = 0;
+ unsigned long hash=0;
unsigned long tmp;
while (*name) {
hash = (hash << 4) + *name++;
- if ((tmp = hash & 0xf0000000))
- hash ^= tmp >> 24;
- hash &= ~tmp;
+ tmp = hash & 0xf0000000;
+ /* The algorithm specified in the ELF ABI is as follows:
+ if (tmp != 0)
+ hash ^= tmp >> 24;
+ hash &= ~tmp;
+ But the following is equivalent and a lot
+ faster, especially on modern processors. */
+ hash ^= tmp;
+ hash ^= tmp >> 24;
}
return hash;
}