Skip to content

Commit

Permalink
[ELF] Provide the GNU hash function in libObject
Browse files Browse the repository at this point in the history
GNU uses a different hashing function compared to the sys-V standard
function already provided in libObject. This is already used internally
in LLD for generating synthetic sections. This patch simply extracts
this definition and makes it availible to other users of `libObject`.
This is done in preparation for supporting symbol name lookups via the
GNU hash table.

Reviewed By: MaskRay, jhenderson

Differential Revision: https://reviews.llvm.org/D132696
  • Loading branch information
jhuber6 committed Sep 5, 2022
1 parent 456c7ef commit c1d19a8
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 7 deletions.
7 changes: 0 additions & 7 deletions lld/ELF/SyntheticSections.cpp
Expand Up @@ -2397,13 +2397,6 @@ void GnuHashTableSection::writeTo(uint8_t *buf) {
}
}

static uint32_t hashGnu(StringRef name) {
uint32_t h = 5381;
for (uint8_t c : name)
h = (h << 5) + h + c;
return h;
}

// Add symbols to this symbol hash table. Note that this function
// destructively sort a given vector -- which is needed because
// GNU-style hash table places some sorting requirements.
Expand Down
10 changes: 10 additions & 0 deletions llvm/include/llvm/Object/ELF.h
Expand Up @@ -1223,6 +1223,16 @@ inline unsigned hashSysV(StringRef SymbolName) {
return h;
}

/// This function returns the hash value for a symbol in the .dynsym section
/// for the GNU hash table. The implementation is defined in the GNU hash ABI.
/// REF : https://sourceware.org/git/?p=binutils-gdb.git;a=blob;f=bfd/elf.c#l222
inline uint32_t hashGnu(StringRef Name) {
uint32_t H = 5381;
for (uint8_t C : Name)
H = (H << 5) + H + C;
return H;
}

} // end namespace object
} // end namespace llvm

Expand Down

0 comments on commit c1d19a8

Please sign in to comment.