this repo has no description
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request #1355 from zhaofengli/fix-wrapgen-vaddr

wrapgen: Fix address resolution in dynamic section

authored by

Ariel Abreu and committed by
GitHub
565f9639 6dcf8d8d

+21 -2
+21 -2
src/libelfloader/wrapgen/wrapgen.cpp
··· 26 26 void parse_elf(const char* elf, std::string& soname_out, std::set<std::string>& functions_out, std::set<std::string>& vars_out); 27 27 void generate_wrapper(std::ofstream& output, const char* soname, const std::set<std::string>& symbols); 28 28 void generate_var_wrappers(std::ofstream& output, std::ofstream& outputHeader, const std::set<std::string>& vars); 29 + Elf64_Off vaddr_to_offset(const Elf64_Ehdr* ehdr, Elf64_Addr vaddr); 29 30 30 31 int main(int argc, const char** argv) 31 32 { ··· 168 169 switch (dyn->d_tag) 169 170 { 170 171 case DT_STRTAB: 171 - off_strtab = dyn->d_un.d_val; 172 + off_strtab = vaddr_to_offset(ehdr, dyn->d_un.d_val); 172 173 break; 173 174 case DT_SONAME: 174 - off_soname = dyn->d_un.d_val; 175 + off_soname = vaddr_to_offset(ehdr, dyn->d_un.d_val); 175 176 break; 176 177 case DT_NULL: 177 178 goto end_dyn; ··· 298 299 "}\n" 299 300 "#endif\n\n"; 300 301 } 302 + 303 + Elf64_Off vaddr_to_offset(const Elf64_Ehdr* ehdr, Elf64_Xword vaddr) 304 + { 305 + for (int i = 0; i < ehdr->e_phnum; i++) 306 + { 307 + const Elf64_Phdr* phdr; 308 + Elf64_Addr vstart, vend; 309 + 310 + phdr = (const Elf64_Phdr*) (((char*) ehdr) + ehdr->e_phoff + (i * ehdr->e_phentsize)); 311 + vstart = phdr->p_vaddr; 312 + vend = phdr->p_vaddr + phdr->p_memsz; 313 + if (vstart <= vaddr && vaddr < vend) { 314 + return phdr->p_offset + vaddr - vstart; 315 + } 316 + } 317 + 318 + return 0; 319 + }