EHFrameDesc::~EHFrameDesc() { if (m_buf == nullptr) return; for_each_fde([] (const FDE& fde) { __deregister_frame(fde.get()); }); }
EHFrameHandle EHFrameWriter::register_and_release() { auto& vec = *m_buf; auto const fde = m_fde; if (fde != kInvalidFDE) __register_frame(&vec[fde]); return std::shared_ptr<std::vector<uint8_t>>( m_buf.release(), [fde] (std::vector<uint8_t>* p) { SCOPE_EXIT { delete p; }; if (fde != kInvalidFDE) __deregister_frame(&((*p)[fde])); }
static const char *processFDE(const char *Entry, bool isDeregister) { const char *P = Entry; uint32_t Length = *((const uint32_t *)P); P += 4; uint32_t Offset = *((const uint32_t *)P); if (Offset != 0) { if (isDeregister) __deregister_frame(const_cast<char *>(Entry)); else __register_frame(const_cast<char *>(Entry)); } return P + Length; }
void __libc_fini (void) #endif { /* Call destructor functions. */ run_hooks (__DTOR_LIST__); #ifdef HAVE_DWARF2_UNWIND_INFO # ifdef HAVE_DWARF2_UNWIND_INFO_STATIC # if defined CRT_GET_RFIB_TEXT || defined CRT_GET_RFIB_DATA __deregister_frame_info_bases (__EH_FRAME_BEGIN__); # else __deregister_frame_info (__EH_FRAME_BEGIN__); # endif # else __deregister_frame (__EH_FRAME_BEGIN__); # endif #endif }
/* static */ void XDataAllocator::Unregister(XDataAllocation * xdataInfo) { #ifdef _WIN32 // Delete the table if (AutoSystemInfo::Data.IsWin8OrLater()) { NtdllLibrary::Instance->DeleteGrowableFunctionTable(xdataInfo->functionTable); } else { BOOLEAN success = RtlDeleteFunctionTable(&xdataInfo->pdata); Assert(success); } #else // !_WIN32 Assert(ReadHead(xdataInfo->address)); // should be non-empty .eh_frame __deregister_frame(xdataInfo->address); #endif }
void deregister_unwind_region(std::vector<char>* p) { std::auto_ptr<std::vector<char> > del(p); __deregister_frame(&(*p)[0]); }
void RTDyldMemoryManager::deregisterEHFramesInProcess(uint8_t *Addr, size_t Size) { __deregister_frame(Addr); }
extern void _force_link() { __register_frame(nullptr); __deregister_frame(nullptr); }
void deregister_frame(void* frame_begin) { #if !defined(USE_KEYMGR_HACK) __deregister_frame(frame_begin); #endif }
void RTDyldMemoryManager::deregisterEHFrames(uint8_t *Addr, uint64_t LoadAddr, size_t Size) { __deregister_frame(Addr); }