|
|
Message-ID: <20120824081227.GG10731@port70.net>
Date: Fri, 24 Aug 2012 10:12:27 +0200
From: Szabolcs Nagy <nsz@...t70.net>
To: musl@...ts.openwall.com
Subject: Re: ldso : dladdr support
* 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
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.