diff --git a/heaptrack_inject.cpp.orig b/heaptrack_inject.cpp --- a/heaptrack_inject.cpp.orig +++ b/heaptrack_inject.cpp @@ -236,28 +236,35 @@ using elf_string_table = elftable; using elf_jmprel_table = elftable; +using elf_rela_table = elftable; using elf_symbol_table = elftable; +template +void try_overwrite_elftable(T* et, elf_string_table* strings, elf_symbol_table* symbols, const Elf::Addr base, const bool restore) { + const auto rela_end = reinterpret_cast(reinterpret_cast(et->table) + et->size); + for (auto rela = et->table; rela < rela_end; rela++) { + const auto index = ELF_R_SYM(rela->r_info); + const char* symname = strings->table + symbols->table[index].st_name; + auto addr = rela->r_offset + base; + hooks::apply(symname, addr, restore); + } +} + void try_overwrite_symbols(const Elf::Dyn* dyn, const Elf::Addr base, const bool restore) noexcept { elf_symbol_table symbols; + elf_rela_table relas; elf_jmprel_table jmprels; elf_string_table strings; // initialize the elf tables for (; dyn->d_tag != DT_NULL; ++dyn) { - symbols.consume(dyn) || jmprels.consume(dyn) || strings.consume(dyn); + symbols.consume(dyn) || relas.consume(dyn) || jmprels.consume(dyn) || strings.consume(dyn); } // find symbols to overwrite - const auto rela_end = reinterpret_cast(reinterpret_cast(jmprels.table) + jmprels.size); - for (auto rela = jmprels.table; rela < rela_end; rela++) { - const auto index = ELF_R_SYM(rela->r_info); - const char* symname = strings.table + symbols.table[index].st_name; - auto addr = rela->r_offset + base; - - hooks::apply(symname, addr, restore); - } + try_overwrite_elftable(&relas, &strings, &symbols, base, restore); + try_overwrite_elftable(&jmprels, &strings, &symbols, base, restore); } int iterate_phdrs(dl_phdr_info* info, size_t /*size*/, void* data) noexcept