void EHFrameManager::writeAndRegister(void* func_addr, uint64_t func_size) { assert(eh_frame_addr == NULL); eh_frame_addr = malloc(EH_FRAME_SIZE); writeTrivialEhFrame(eh_frame_addr, func_addr, func_size); // (EH_FRAME_SIZE - 4) to omit the 4-byte null terminator, otherwise we trip an assert in parseEhFrame. // TODO: can we omit the terminator in general? registerDynamicEhFrame((uint64_t)func_addr, func_size, (uint64_t)eh_frame_addr, EH_FRAME_SIZE - 4); registerEHFrames((uint8_t*)eh_frame_addr, (uint64_t)eh_frame_addr, EH_FRAME_SIZE); }
void EHFrameManager::writeAndRegister(void* func_addr, uint64_t func_size) { assert(eh_frame_addr == NULL); const int size = omit_frame_pointer ? _eh_frame_template_ofp_size : _eh_frame_template_fp_size; #ifdef NVALGRIND eh_frame_addr = malloc(size); #else eh_frame_addr = mmap(NULL, (size + (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); RELEASE_ASSERT(eh_frame_addr != MAP_FAILED, ""); #endif writeTrivialEhFrame(eh_frame_addr, func_addr, func_size, omit_frame_pointer); // (EH_FRAME_SIZE - 4) to omit the 4-byte null terminator, otherwise we trip an assert in parseEhFrame. // TODO: can we omit the terminator in general? registerDynamicEhFrame((uint64_t)func_addr, func_size, (uint64_t)eh_frame_addr, size - 4); registerEHFrames((uint8_t*)eh_frame_addr, (uint64_t)eh_frame_addr, size); }