|
|
Message-ID: <503741C7.6070807@gmail.com>
Date: Fri, 24 Aug 2012 10:56:39 +0200
From: musl <b.brezillon.musl@...il.com>
To: musl@...ts.openwall.com
Subject: Re: ldso : dladdr support
On 24/08/2012 10:12, Szabolcs Nagy wrote:
> * Rich Felker <dalias@...ifal.cx> [2012-08-23 18:21:13 -0400]:
>> +static Sym *gnu_lookup(const char *s, uint32_t h1, struct dso *dso)
>> +{
>> + Sym *sym;
>> + char *strings;
>> + uint32_t *hashtab = dso->ghashtab;
>> + uint32_t nbuckets = hashtab[0];
>> + uint32_t *buckets = hashtab + 4 + hashtab[2]*(sizeof(size_t)/4);
>> + uint32_t h2;
>> + uint32_t *hashval;
>> + uint32_t n = buckets[h1 % nbuckets];
>> +
>> + if (!n) return 0;
>> +
>> + strings = dso->strings;
>> + sym = dso->syms + n;
>> + hashval = buckets + nbuckets + (n - hashtab[1]);
>> +
>> + for (h1 |= 1; ; sym++) {
>> + h2 = *hashval++;
>> + if ((h1 == (h2|1)) && !strcmp(s, strings + sym->st_name))
>> + return sym;
>> + if (h2 & 1) break;
>> + }
> heh, is this really the gnuhash lookup logic?
> they drop a valuable low bit with h1 |= 1
When h1 |= 1 is done the bucket index and first hashval have already been stored in n and hashval.
Then h1 is only used in the (h1 == (h2 | 1)) comparison.
> high bits are less important for short
> strings because of the *33 logic
> (last 3-4 chars have no effect on the msb)
>
> not that it matters much of course..
> but seems silly design to me especially
> when nbuckets is a power-of-2, then
> highbits are not used for much and
> could be used as flags for whatever
>
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.