![]() |
|
Message-ID: <CAORiPTNM7a=QhWNP4NUd0KDNLOubmG0KmGaBWQm2ssrs5CCz7g@mail.gmail.com> Date: Sun, 24 Aug 2025 11:25:25 +0200 From: Tomáš Hulata <hulata@...art.tech> To: musl@...ts.openwall.com Cc: Rich Felker <dalias@...c.org> Subject: Re: [PATCH v3] vdso: add support for GNU hash tables It would be great to get it included, but it's up to you. I'm going to use a fork till it is not released. Thanks Best Regards Tomáš Hulata [ SysArt / Pixel Federation ] On Sun, Aug 24, 2025 at 4:26 AM Rich Felker <dalias@...c.org> wrote: > > On Sat, Aug 23, 2025 at 12:54:04AM +0200, tombo wrote: > > Hi Rich, thanks for the review. Hopefully this version addresses all the points. > > > > --- > > src/internal/vdso.c | 28 ++++++++++++++++++++++++++-- > > 1 file changed, 26 insertions(+), 2 deletions(-) > > > > diff --git a/src/internal/vdso.c b/src/internal/vdso.c > > index d46d3228..2b6e1ae2 100644 > > --- a/src/internal/vdso.c > > +++ b/src/internal/vdso.c > > @@ -40,6 +40,24 @@ static int checkver(Verdef *def, int vsym, const char *vername, char *strings) > > #define OK_TYPES (1<<STT_NOTYPE | 1<<STT_OBJECT | 1<<STT_FUNC | 1<<STT_COMMON) > > #define OK_BINDS (1<<STB_GLOBAL | 1<<STB_WEAK | 1<<STB_GNU_UNIQUE) > > > > +static size_t count_syms_gnu(uint32_t *gh) > > +{ > > + size_t nsym, i; > > + uint32_t *buckets = gh + 4 + (gh[2]*sizeof(size_t)/4); > > + uint32_t *hashval; > > + for (i = nsym = 0; i < gh[0]; i++) { > > + if (buckets[i] > nsym) > > + nsym = buckets[i]; > > + } > > + if (nsym) { > > + hashval = buckets + gh[0] + (nsym - gh[1]); > > + do nsym++; > > + while (!(*hashval++ & 1)); > > + } > > + return nsym; > > +} > > + > > + > > void *__vdsosym(const char *vername, const char *name) > > { > > size_t i; > > @@ -60,6 +78,7 @@ void *__vdsosym(const char *vername, const char *name) > > char *strings = 0; > > Sym *syms = 0; > > Elf_Symndx *hashtab = 0; > > + uint32_t *ghashtab = 0; > > uint16_t *versym = 0; > > Verdef *verdef = 0; > > > > @@ -69,15 +88,20 @@ void *__vdsosym(const char *vername, const char *name) > > case DT_STRTAB: strings = p; break; > > case DT_SYMTAB: syms = p; break; > > case DT_HASH: hashtab = p; break; > > + case DT_GNU_HASH: ghashtab = p; break; > > case DT_VERSYM: versym = p; break; > > case DT_VERDEF: verdef = p; break; > > } > > } > > > > - if (!strings || !syms || !hashtab) return 0; > > + if (!strings || !syms) return 0; > > if (!verdef) versym = 0; > > + size_t nsym = 0; > > + > > + if (hashtab) nsym = hashtab[1]; > > + else if (ghashtab) nsym = count_syms_gnu(ghashtab); > > > > - for (i=0; i<hashtab[1]; i++) { > > + for (i=0; i<nsym; i++) { > > if (!(1<<(syms[i].st_info&0xf) & OK_TYPES)) continue; > > if (!(1<<(syms[i].st_info>>4) & OK_BINDS)) continue; > > if (!syms[i].st_shndx) continue; > > -- > > 2.46.0 > > Thanks! I don't see anything obviously wrong with this. I'll take a > more detailed look over it soon. Are you hoping to get it included in > this release cycle? > > Rich
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.