为什么我的ELF文件中的.hash部分无效?

为什么我的ELF文件中的.hash部分无效?,hash,elf,Hash,Elf,在.hash部分中,对于某些x,如果链[x]!=新丁, 它应该保存hashnamebucket[x]==hashnamebucket[chain[x]]]%n bucket 但是为什么我的共享对象文件不是这样呢? 例如,namebucket[224]=_ZN9VADEnergyD0Ev,其ELF哈希%nbucket为224, namebucket[8]==其ELF哈希%n bucket为8的speex_位_写_整_字节, 但是链[224]==8 该文件可用 还是我读elf的代码错了 nbucke

在.hash部分中,对于某些x,如果链[x]!=新丁, 它应该保存hashnamebucket[x]==hashnamebucket[chain[x]]]%n bucket

但是为什么我的共享对象文件不是这样呢? 例如,namebucket[224]=_ZN9VADEnergyD0Ev,其ELF哈希%nbucket为224, namebucket[8]==其ELF哈希%n bucket为8的speex_位_写_整_字节, 但是链[224]==8

该文件可用

还是我读elf的代码错了

nbucket = ((int *)hash)[0];
nchain = ((int *)hash)[1];
memcpy(bucket, hash + 8, nbucket * 4);
memcpy(succ, hash + nbucket * 4 + 8, nchain * 4);

for (i = 0; i < nbucket; i++) {
    printf("%d %d\n", bucket[i], succ[i]);
    if (bucket[i] && succ[i])
        pred[succ[i]] = i;
}

printf("%d %d\n", nbucket, nchain);
#define sym_name(x, symtbl, strtbl) (strtbl + symtbl[x].st_name)
for (i = 0; i < nbucket; i++) {
    if (pred[i] == 0) {
        printf("=======\n");
        for (j = i; j; j = succ[j]) {
            char *sname = sym_name(bucket[j], dynsym, dynstr);
            printf("%d,succ=%d ", j, succ[j]);
            printf("%d:%s\n", _dl_elf_hash(sname) % nbucket, sname);
        }
    }
}

这是我的错。应该是

hash(name(bucket[x])) === hash(name(chain[bucket[x]])) % nbucket

nbucket = ((int *)hash)[0];
nchain = ((int *)hash)[1];
memcpy(bucket, hash + 8, nbucket * 4);
memcpy(succ, hash + nbucket * 4 + 8, nchain * 4);

for (i = 0; i < nbucket; i++) {
    printf("%d %d\n", bucket[i], succ[i]);
    if (bucket[i] && succ[i])
        pred[succ[i]] = i;
}

printf("%d %d\n", nbucket, nchain);
#define sym_name(x, symtbl, strtbl) (strtbl + symtbl[x].st_name)
for (i = 0; i < nbucket; i++) {
    printf("=======\n");
    for (j = bucket[i]; j; j = succ[j]) {
        char *sname = sym_name(j, dynsym, dynstr);
        printf("%d,succ=%d ", j, succ[j]);
        printf("%d:%s\n", _dl_elf_hash(sname) % nbucket, sname);
    }
}