From: Milian Wolff Date: Fri, 5 Dec 2014 23:50:02 +0000 (+0100) Subject: Also overwrite free. X-Git-Tag: submit/tizen/20180620.112952^2~384^2~11 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5ce62c14f183947f11dffb96c0dbf1d2aaa5a90f;p=sdk%2Ftools%2Fheaptrack.git Also overwrite free. --- diff --git a/heaptrack_inject.cpp b/heaptrack_inject.cpp index 9551078..2187355 100644 --- a/heaptrack_inject.cpp +++ b/heaptrack_inject.cpp @@ -32,6 +32,7 @@ namespace { auto original_malloc = &malloc; +auto original_free = &free; void* overwrite_malloc(size_t size) { @@ -40,6 +41,12 @@ void* overwrite_malloc(size_t size) return ptr; } +void overwrite_free(void* ptr) +{ + heaptrack_free(ptr); + original_free(ptr); +} + template struct elftable { @@ -63,7 +70,7 @@ using elf_string_table = elftable; using elf_jmprel_table = elftable; using elf_symbol_table = elftable; -bool try_overwrite_symbols(const ElfW(Dyn) *dyn, const ElfW(Addr) base) +void try_overwrite_symbols(const ElfW(Dyn) *dyn, const ElfW(Addr) base) { elf_symbol_table symbols; elf_jmprel_table jmprels; @@ -77,12 +84,13 @@ bool try_overwrite_symbols(const ElfW(Dyn) *dyn, const ElfW(Addr) base) for (auto rela = jmprels.table; rela < relaend; rela++) { auto relsymidx = ELF64_R_SYM(rela->r_info); const char *relsymname = strings.table + symbols.table[relsymidx].st_name; - if (strcmp("malloc", relsymname) == 0) { - *reinterpret_cast(rela->r_offset + base) = &overwrite_malloc; - return true; + auto addr = rela->r_offset + base; + if (!strcmp("malloc", relsymname)) { + *reinterpret_cast(addr) = &overwrite_malloc; + } else if (!strcmp("free", relsymname)) { + *reinterpret_cast(addr) = &overwrite_free; } } - return false; } int iterate_phdrs(dl_phdr_info *info, size_t /*size*/, void *data)