Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- char *
- symbol_name_lookup_rel(char *data,
- Elf64_Ehdr *ehdr,
- Elf64_Shdr *strtabhdr,
- Elf64_Shdr *symtabhdr,
- uint64_t addr)
- {
- char *strtab = (char *) (data + strtabhdr->sh_offset);
- Elf64_Sym *symtab = (Elf64_Sym *) (data + symtabhdr->sh_offset);
- Elf64_Phdr *phdrtab = (Elf64_Phdr *) (data + ehdr->e_phoff);
- char *s_name = NULL;
- uint64_t s_offset;
- int s_type, s_bind;
- for (size_t i = 0; i < symtabhdr->sh_size / sizeof(Elf64_Sym); i++) {
- s_offset = sym[i].st_value;
- s_type = ELF64_ST_TYPE(sym[i].st_info);
- s_bind = ELF64_ST_BIND(sym[i].st_info);
- if (s_type != STT_FUNC)
- continue;
- Elf64_Phdr phdr;
- for (size_t j = 0; j < ehdr->e_phnum; j++) {
- phdr = phdrtab[j];
- if (phdr.p_type == PT_LOAD) {
- if (s_offset >= phdr.p_vaddr && s_offset < phdr.p_vaddr + phdr.p_memsz)
- break;
- }
- }
- if (s_offset == addr + phdr.p_vaddr) {
- s_name = str + sym[i].st_name;
- break;
- }
- }
- return s_name;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement