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

时间:2014-02-09 11:27:33

标签: hash elf

在.hash部分,对于某些x,如果chain [x]!= SHN_UNDEF, 它应该保留hash(name(bucket[x])) === hash(name(bucket[chain[x]])) % nbucket

但是为什么我的共享对象文件不是这样呢? 例如,name(bucket [224])==“_ ZN9VADEnergyD0Ev”,其(ELF hash%nbucket)为224,
name(bucket [8])==“speex_bits_write_whole_bytes”,其(ELF hash%nbucket)为8,
但链[224] == 8。

(该文件可用here

或者我的阅读精灵的代码是错的?

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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

这是我的错。它应该是

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);
    }
}