diff options
| -rw-r--r-- | ldso/ldso/dl-hash.c | 14 | 
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;  } | 
