Changeset View
Changeset View
Standalone View
Standalone View
heaptrack_inject.cpp
Context not available. | |||||
236 | 236 | | |||
---|---|---|---|---|---|
237 | using elf_string_table = elftable<const char, DT_STRTAB, DT_STRSZ>; | 237 | using elf_string_table = elftable<const char, DT_STRTAB, DT_STRSZ>; | ||
238 | using elf_jmprel_table = elftable<Elf::Rela, DT_JMPREL, DT_PLTRELSZ>; | 238 | using elf_jmprel_table = elftable<Elf::Rela, DT_JMPREL, DT_PLTRELSZ>; | ||
239 | using elf_rela_table = elftable<Elf::Rela, DT_RELA, DT_RELASZ>; | ||||
239 | using elf_symbol_table = elftable<Elf::Sym, DT_SYMTAB, DT_SYMENT>; | 240 | using elf_symbol_table = elftable<Elf::Sym, DT_SYMTAB, DT_SYMENT>; | ||
240 | 241 | | |||
242 | template <typename T> | ||||
243 | void try_overwrite_elftable(T* et, elf_string_table* strings, elf_symbol_table* symbols, const Elf::Addr base, const bool restore) { | ||||
244 | const auto rela_end = reinterpret_cast<Elf::Rela*>(reinterpret_cast<char*>(et->table) + et->size); | ||||
245 | for (auto rela = et->table; rela < rela_end; rela++) { | ||||
246 | const auto index = ELF_R_SYM(rela->r_info); | ||||
247 | const char* symname = strings->table + symbols->table[index].st_name; | ||||
248 | auto addr = rela->r_offset + base; | ||||
249 | hooks::apply(symname, addr, restore); | ||||
250 | } | ||||
251 | } | ||||
252 | | ||||
241 | void try_overwrite_symbols(const Elf::Dyn* dyn, const Elf::Addr base, const bool restore) noexcept | 253 | void try_overwrite_symbols(const Elf::Dyn* dyn, const Elf::Addr base, const bool restore) noexcept | ||
242 | { | 254 | { | ||
243 | elf_symbol_table symbols; | 255 | elf_symbol_table symbols; | ||
256 | elf_rela_table relas; | ||||
244 | elf_jmprel_table jmprels; | 257 | elf_jmprel_table jmprels; | ||
245 | elf_string_table strings; | 258 | elf_string_table strings; | ||
246 | 259 | | |||
247 | // initialize the elf tables | 260 | // initialize the elf tables | ||
248 | for (; dyn->d_tag != DT_NULL; ++dyn) { | 261 | for (; dyn->d_tag != DT_NULL; ++dyn) { | ||
249 | symbols.consume(dyn) || jmprels.consume(dyn) || strings.consume(dyn); | 262 | symbols.consume(dyn) || relas.consume(dyn) || jmprels.consume(dyn) || strings.consume(dyn); | ||
250 | } | 263 | } | ||
251 | 264 | | |||
252 | // find symbols to overwrite | 265 | // find symbols to overwrite | ||
253 | const auto rela_end = reinterpret_cast<Elf::Rela*>(reinterpret_cast<char*>(jmprels.table) + jmprels.size); | 266 | try_overwrite_elftable(&relas, &strings, &symbols, base, restore); | ||
254 | for (auto rela = jmprels.table; rela < rela_end; rela++) { | 267 | try_overwrite_elftable(&jmprels, &strings, &symbols, base, restore); | ||
255 | const auto index = ELF_R_SYM(rela->r_info); | | |||
256 | const char* symname = strings.table + symbols.table[index].st_name; | | |||
257 | auto addr = rela->r_offset + base; | | |||
258 | | ||||
259 | hooks::apply(symname, addr, restore); | | |||
260 | } | | |||
261 | } | 268 | } | ||
262 | 269 | | |||
263 | int iterate_phdrs(dl_phdr_info* info, size_t /*size*/, void* data) noexcept | 270 | int iterate_phdrs(dl_phdr_info* info, size_t /*size*/, void* data) noexcept | ||
Context not available. |