OSDN Git Service

Joseph S. Myers writes:
authorJoakim Tjernlund <joakim.tjernlund@transmode.se>
Tue, 9 Jan 2007 22:30:16 +0000 (22:30 -0000)
committerJoakim Tjernlund <joakim.tjernlund@transmode.se>
Tue, 9 Jan 2007 22:30:16 +0000 (22:30 -0000)
ELF symbol names are arbitrary 0-terminated sequences of bytes, and the
ELF hash function is defined in the ELF specification to use unsigned
char.  Thus uClibc's _dl_elf_hash, using plain char, breaks when char is
signed and symbol names contain bytes with the high bit set, as with GCC's
ucnid-* tests.  This patch fixes this problem.

ldso/ldso/dl-hash.c

index 4fd7ba0..f44d0ec 100644 (file)
@@ -57,7 +57,7 @@ struct dyn_elf *_dl_handles = NULL;
 /* This is the hash function that is used by the ELF linker to generate the
  * hash table that each executable and library is required to have.  We need
  * it to decode the hash table.  */
-static inline Elf_Symndx _dl_elf_hash(const char *name)
+static inline Elf_Symndx _dl_elf_hash(const unsigned char *name)
 {
        unsigned long hash=0;
        unsigned long tmp;
@@ -138,7 +138,7 @@ char *_dl_find_hash(const char *name, struct dyn_elf *rpnt, struct elf_resolve *
        const ElfW(Sym) *sym;
        char *weak_result = NULL;
 
-       elf_hash_number = _dl_elf_hash(name);
+       elf_hash_number = _dl_elf_hash((const unsigned char *)name);
 
        for (; rpnt; rpnt = rpnt->next) {
                tpnt = rpnt->dyn;