Skip to content

Commit

Permalink
Fix symbol resolution for malloc_type functions on macOS Sequoia
Browse files Browse the repository at this point in the history
This commit addresses an issue with symbol resolution for malloc_type
functions on the latest macOS Sequoia. The problem arises due to changes
in how these functions are named in the dynamic symbol table of the
system libraries that are part of the linker cache like the ones that
contain the C++ runtime.

This fix ensures that Memray correctly intercepts and tracks allocations
made by malloc_type functions, fixing tracking allocations in the C++
runtime and other system libraries on macOS Sequoia.
  • Loading branch information
pablogsal committed Oct 21, 2024
1 parent f5eb8d7 commit ce20207
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 3 deletions.
1 change: 0 additions & 1 deletion src/memray/_memray.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,6 @@ def set_log_level(int level):
"""
setLogThreshold(level)


cpdef enum AllocatorType:
MALLOC = 1
FREE = 2
Expand Down
15 changes: 13 additions & 2 deletions src/memray/_memray/macho_shenanigans.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,15 @@ patch_symbol(
}
}

static inline const char*
get_canonical_name(const char* name) {
const char* prefix = "_malloc_type";
if (strncmp(name, prefix, strlen(prefix)) != 0) {
return name;
}
return name + strlen(prefix);
}

static void
patch_symbols_in_section(
const section_t* section,
Expand All @@ -49,8 +58,9 @@ patch_symbols_in_section(
if (!symbol_name || !(symbol_name[0] == '_' || symbol_name[0] == '.') || !symbol_name[1]) {
continue;
}
const char* canonical_name = get_canonical_name(symbol_name);
#define FOR_EACH_HOOKED_FUNCTION(hookname) \
if (strcmp(MEMRAY_ORIG(hookname).d_symbol, symbol_name + 1) == 0) { \
if (strcmp(MEMRAY_ORIG(hookname).d_symbol, canonical_name + 1) == 0) { \
LOG(DEBUG) << "Patching " << symbol_name << " symbol pointer at " << std::hex << std::showbase \
<< *(symbol_addr_table + i) << " for relocation entry " << (symbol_addr_table + i); \
patch_symbol( \
Expand Down Expand Up @@ -225,9 +235,10 @@ patch_stubs(
if (!symbol_name || !(symbol_name[0] == '_' || symbol_name[0] == '.') || !symbol_name[1]) {
continue;
}
const char* canonical_name = get_canonical_name(symbol_name);
auto stub_addr = reinterpret_cast<uint64_t>(symbol_addr_table + i * element_size);
#define FOR_EACH_HOOKED_FUNCTION(hookname) \
if (strcmp(MEMRAY_ORIG(hookname).d_symbol, symbol_name + 1) == 0) { \
if (strcmp(MEMRAY_ORIG(hookname).d_symbol, canonical_name + 1) == 0) { \
LOG(DEBUG) << "Extracting symbol address for " << symbol_name << " from stub function at " \
<< std::hex << std::showbase << stub_addr; \
void* symbol_addr = reinterpret_cast<void*>(lazy_pointer_from_stub(stub_addr)); \
Expand Down

0 comments on commit ce20207

Please sign in to comment.