Advertisement
Guest User

Untitled

a guest
Jul 17th, 2022
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.18 KB | None | 0 0
  1. char *
  2. symbol_name_lookup_rel(char *data,
  3.                        Elf64_Ehdr *ehdr,
  4.                        Elf64_Shdr *strtabhdr,
  5.                        Elf64_Shdr *symtabhdr,
  6.                        uint64_t addr)
  7. {
  8.     char *strtab = (char *) (data + strtabhdr->sh_offset);
  9.     Elf64_Sym *symtab = (Elf64_Sym *) (data + symtabhdr->sh_offset);
  10.     Elf64_Phdr *phdrtab = (Elf64_Phdr *) (data + ehdr->e_phoff);
  11.     char *s_name = NULL;
  12.     uint64_t s_offset;
  13.     int s_type, s_bind;
  14.     for (size_t i = 0; i < symtabhdr->sh_size / sizeof(Elf64_Sym); i++) {
  15.         s_offset = sym[i].st_value;
  16.         s_type = ELF64_ST_TYPE(sym[i].st_info);
  17.         s_bind = ELF64_ST_BIND(sym[i].st_info);
  18.  
  19.         if (s_type != STT_FUNC)
  20.             continue;
  21.  
  22.         Elf64_Phdr phdr;
  23.         for (size_t j = 0; j < ehdr->e_phnum; j++) {
  24.             phdr = phdrtab[j];
  25.             if (phdr.p_type == PT_LOAD) {
  26.                 if (s_offset >= phdr.p_vaddr && s_offset < phdr.p_vaddr + phdr.p_memsz)
  27.                     break;
  28.             }
  29.         }
  30.  
  31.         if (s_offset == addr + phdr.p_vaddr) {
  32.             s_name = str + sym[i].st_name;
  33.             break;
  34.         }
  35.     }
  36.  
  37.     return s_name;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement