为什么我的ELF文件中的.hash部分无效?
在.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的代码错了为什么我的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
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);
}
}