/* Now figure out whether it matches. */
ELF(Verdaux) *aux = (ELF(Verdaux)*)((char *)def + def->vd_aux); return def->vd_hash == hash
&& !strcmp(name, vdso_info.symstrings + aux->vda_name);
}
staticbool check_sym(ELF(Sym) *sym, ELF(Word) i, constchar *name, constchar *version, unsignedlong ver_hash)
{ /* Check for a defined global or weak function w/ right name. */ if (ELF64_ST_TYPE(sym->st_info) != STT_FUNC) returnfalse; if (ELF64_ST_BIND(sym->st_info) != STB_GLOBAL &&
ELF64_ST_BIND(sym->st_info) != STB_WEAK) returnfalse; if (strcmp(name, vdso_info.symstrings + sym->st_name)) returnfalse;
/* Check symbol version. */ if (vdso_info.versym &&
!vdso_match_version(vdso_info.versym[i], version, ver_hash)) returnfalse;
if (vdso_info.gnu_hash) {
uint32_t h1 = gnu_hash(name), h2, *hashval;
i = vdso_info.gnu_bucket[h1 % vdso_info.nbucket]; if (i == 0) return0;
h1 |= 1;
hashval = vdso_info.gnu_bucket + vdso_info.nbucket +
(i - vdso_info.gnu_hash[1]); for (;; i++) {
ELF(Sym) *sym = &vdso_info.symtab[i];
h2 = *hashval++; if (h1 == (h2 | 1) &&
check_sym(sym, i, name, version, ver_hash)) return (void *)(vdso_info.load_offset +
sym->st_value); if (h2 & 1) break;
}
} else {
i = vdso_info.bucket[elf_hash(name) % vdso_info.nbucket]; for (; i; i = vdso_info.chain[i]) {
ELF(Sym) *sym = &vdso_info.symtab[i]; if (sym->st_shndx != SHN_UNDEF &&
check_sym(sym, i, name, version, ver_hash)) return (void *)(vdso_info.load_offset +
sym->st_value);
}
}
return0;
}
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.53Bemerkung:
(vorverarbeitet am 2026-10-12)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.