Changeset View
Changeset View
Standalone View
Standalone View
src/track/heaptrack_inject.cpp
Show First 20 Lines • Show All 224 Lines • ▼ Show 20 Line(s) | 224 | } else if (dyn->d_tag == SizeTag) { | |||
---|---|---|---|---|---|
225 | size = dyn->d_un.d_val; | 225 | size = dyn->d_un.d_val; | ||
226 | return true; | 226 | return true; | ||
227 | } | 227 | } | ||
228 | return false; | 228 | return false; | ||
229 | } | 229 | } | ||
230 | }; | 230 | }; | ||
231 | 231 | | |||
232 | using elf_string_table = elftable<const char, DT_STRTAB, DT_STRSZ>; | 232 | using elf_string_table = elftable<const char, DT_STRTAB, DT_STRSZ>; | ||
233 | using elf_rela_table = elftable<Elf::Rela, DT_RELA, DT_RELASZ>; | ||||
233 | using elf_jmprel_table = elftable<Elf::Rela, DT_JMPREL, DT_PLTRELSZ>; | 234 | using elf_jmprel_table = elftable<Elf::Rela, DT_JMPREL, DT_PLTRELSZ>; | ||
234 | using elf_symbol_table = elftable<Elf::Sym, DT_SYMTAB, DT_SYMENT>; | 235 | using elf_symbol_table = elftable<Elf::Sym, DT_SYMTAB, DT_SYMENT>; | ||
235 | 236 | | |||
237 | template <typename T> | ||||
238 | void try_overwrite_elftable(const T& jumps, const elf_string_table& strings, const elf_symbol_table& symbols, | ||||
239 | const Elf::Addr base, const bool restore) noexcept | ||||
240 | { | ||||
241 | const auto rela_end = reinterpret_cast<Elf::Rela*>(reinterpret_cast<char*>(jumps.table) + jumps.size); | ||||
242 | for (auto rela = jumps.table; rela < rela_end; rela++) { | ||||
243 | const auto index = ELF_R_SYM(rela->r_info); | ||||
244 | const char* symname = strings.table + symbols.table[index].st_name; | ||||
245 | auto addr = rela->r_offset + base; | ||||
246 | hooks::apply(symname, addr, restore); | ||||
247 | } | ||||
248 | } | ||||
249 | | ||||
236 | void try_overwrite_symbols(const Elf::Dyn* dyn, const Elf::Addr base, const bool restore) noexcept | 250 | void try_overwrite_symbols(const Elf::Dyn* dyn, const Elf::Addr base, const bool restore) noexcept | ||
mwolff: please use a template function for this instead of a macro | |||||
237 | { | 251 | { | ||
238 | elf_symbol_table symbols; | 252 | elf_symbol_table symbols; | ||
253 | elf_rela_table relas; | ||||
239 | elf_jmprel_table jmprels; | 254 | elf_jmprel_table jmprels; | ||
240 | elf_string_table strings; | 255 | elf_string_table strings; | ||
241 | 256 | | |||
242 | // initialize the elf tables | 257 | // initialize the elf tables | ||
243 | for (; dyn->d_tag != DT_NULL; ++dyn) { | 258 | for (; dyn->d_tag != DT_NULL; ++dyn) { | ||
244 | symbols.consume(dyn) || jmprels.consume(dyn) || strings.consume(dyn); | 259 | symbols.consume(dyn) || relas.consume(dyn) || jmprels.consume(dyn) || strings.consume(dyn); | ||
245 | } | 260 | } | ||
246 | 261 | | |||
247 | // find symbols to overwrite | 262 | // find symbols to overwrite | ||
248 | const auto rela_end = reinterpret_cast<Elf::Rela*>(reinterpret_cast<char*>(jmprels.table) + jmprels.size); | 263 | try_overwrite_elftable(relas, strings, symbols, base, restore); | ||
249 | for (auto rela = jmprels.table; rela < rela_end; rela++) { | 264 | try_overwrite_elftable(jmprels, strings, symbols, base, restore); | ||
250 | const auto index = ELF_R_SYM(rela->r_info); | | |||
251 | const char* symname = strings.table + symbols.table[index].st_name; | | |||
252 | auto addr = rela->r_offset + base; | | |||
253 | | ||||
254 | hooks::apply(symname, addr, restore); | | |||
255 | } | | |||
256 | } | 265 | } | ||
257 | 266 | | |||
258 | int iterate_phdrs(dl_phdr_info* info, size_t /*size*/, void* data) noexcept | 267 | int iterate_phdrs(dl_phdr_info* info, size_t /*size*/, void* data) noexcept | ||
259 | { | 268 | { | ||
260 | if (strstr(info->dlpi_name, "/libheaptrack_inject.so")) { | 269 | if (strstr(info->dlpi_name, "/libheaptrack_inject.so")) { | ||
261 | // prevent infinite recursion: do not overwrite our own symbols | 270 | // prevent infinite recursion: do not overwrite our own symbols | ||
262 | return 0; | 271 | return 0; | ||
263 | } else if (strstr(info->dlpi_name, "/ld-linux")) { | 272 | } else if (strstr(info->dlpi_name, "/ld-linux")) { | ||
Show All 29 Lines |
please use a template function for this instead of a macro