* Generate VDSO_HASH
@ 2019-11-11 23:57 Alistair Francis
2019-11-12 9:47 ` Florian Weimer
0 siblings, 1 reply; 3+ messages in thread
From: Alistair Francis @ 2019-11-11 23:57 UTC (permalink / raw)
To: GNU C Library
Hey,
How is VDSO_HASH generated? I would like to generate one for the 5.4 kernel.
Alistair
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Generate VDSO_HASH
2019-11-11 23:57 Generate VDSO_HASH Alistair Francis
@ 2019-11-12 9:47 ` Florian Weimer
2019-11-12 17:34 ` Alistair Francis
0 siblings, 1 reply; 3+ messages in thread
From: Florian Weimer @ 2019-11-12 9:47 UTC (permalink / raw)
To: Alistair Francis; +Cc: GNU C Library
* Alistair Francis:
> How is VDSO_HASH generated? I would like to generate one for the 5.4
> kernel.
It's the ELF hash. Not to be confused with the GNU hash, which is used
for symbol name lookup these days. See <sysdeps/generic/dl-hash.h> and
the program below.
LINUX_5.4: ELF: 61765876 (0x3ae78f4), GNU: 650524491 (0x26c6374b)
The ELF hash is still used for symbol versions, only the symbol names
switched to the GNU hash.
Thanks,
Florian
/* Compute hash value for given string according to ELF standard.
Copyright (C) 1995-2019 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#ifndef _DL_HASH_H
#define _DL_HASH_H 1
/* This is the hashing function specified by the ELF ABI. In the
first five operations no overflow is possible so we optimized it a
bit. */
static unsigned int
__attribute__ ((unused))
_dl_elf_hash (const char *name_arg)
{
const unsigned char *name = (const unsigned char *) name_arg;
unsigned long int hash = *name;
if (hash != 0 && name[1] != '\0')
{
hash = (hash << 4) + name[1];
if (name[2] != '\0')
{
hash = (hash << 4) + name[2];
if (name[3] != '\0')
{
hash = (hash << 4) + name[3];
if (name[4] != '\0')
{
hash = (hash << 4) + name[4];
name += 5;
while (*name != '\0')
{
unsigned long int hi;
hash = (hash << 4) + *name++;
hi = hash & 0xf0000000;
/* The algorithm specified in the ELF ABI is as
follows:
if (hi != 0)
hash ^= hi >> 24;
hash &= ~hi;
But the following is equivalent and a lot
faster, especially on modern processors. */
hash ^= hi >> 24;
}
/* Second part of the modified formula. This
operation can be lifted outside the loop. */
hash &= 0x0fffffff;
}
}
}
}
return hash;
}
#endif /* dl-hash.h */
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Generate VDSO_HASH
2019-11-12 9:47 ` Florian Weimer
@ 2019-11-12 17:34 ` Alistair Francis
0 siblings, 0 replies; 3+ messages in thread
From: Alistair Francis @ 2019-11-12 17:34 UTC (permalink / raw)
To: Florian Weimer; +Cc: GNU C Library
On Tue, Nov 12, 2019 at 1:47 AM Florian Weimer <fweimer@redhat.com> wrote:
>
> * Alistair Francis:
>
> > How is VDSO_HASH generated? I would like to generate one for the 5.4
> > kernel.
>
> It's the ELF hash. Not to be confused with the GNU hash, which is used
> for symbol name lookup these days. See <sysdeps/generic/dl-hash.h> and
> the program below.
>
> LINUX_5.4: ELF: 61765876 (0x3ae78f4), GNU: 650524491 (0x26c6374b)
>
> The ELF hash is still used for symbol versions, only the symbol names
> switched to the GNU hash.
Thanks!
Alistair
>
> Thanks,
> Florian
>
> /* Compute hash value for given string according to ELF standard.
> Copyright (C) 1995-2019 Free Software Foundation, Inc.
> This file is part of the GNU C Library.
>
> The GNU C Library is free software; you can redistribute it and/or
> modify it under the terms of the GNU Lesser General Public
> License as published by the Free Software Foundation; either
> version 2.1 of the License, or (at your option) any later version.
>
> The GNU C Library is distributed in the hope that it will be useful,
> but WITHOUT ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> Lesser General Public License for more details.
>
> You should have received a copy of the GNU Lesser General Public
> License along with the GNU C Library; if not, see
> <https://www.gnu.org/licenses/>. */
>
> #ifndef _DL_HASH_H
> #define _DL_HASH_H 1
>
>
> /* This is the hashing function specified by the ELF ABI. In the
> first five operations no overflow is possible so we optimized it a
> bit. */
> static unsigned int
> __attribute__ ((unused))
> _dl_elf_hash (const char *name_arg)
> {
> const unsigned char *name = (const unsigned char *) name_arg;
> unsigned long int hash = *name;
> if (hash != 0 && name[1] != '\0')
> {
> hash = (hash << 4) + name[1];
> if (name[2] != '\0')
> {
> hash = (hash << 4) + name[2];
> if (name[3] != '\0')
> {
> hash = (hash << 4) + name[3];
> if (name[4] != '\0')
> {
> hash = (hash << 4) + name[4];
> name += 5;
> while (*name != '\0')
> {
> unsigned long int hi;
> hash = (hash << 4) + *name++;
> hi = hash & 0xf0000000;
>
> /* The algorithm specified in the ELF ABI is as
> follows:
>
> if (hi != 0)
> hash ^= hi >> 24;
>
> hash &= ~hi;
>
> But the following is equivalent and a lot
> faster, especially on modern processors. */
>
> hash ^= hi >> 24;
> }
>
> /* Second part of the modified formula. This
> operation can be lifted outside the loop. */
> hash &= 0x0fffffff;
> }
> }
> }
> }
> return hash;
> }
>
> #endif /* dl-hash.h */
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2019-11-12 17:40 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-11 23:57 Generate VDSO_HASH Alistair Francis
2019-11-12 9:47 ` Florian Weimer
2019-11-12 17:34 ` Alistair Francis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).