Skip to content

Commit d117b0c

Browse files
committed
Fix crashes when libobjcdarwin is unloaded
1 parent 243b0ad commit d117b0c

File tree

6 files changed

+40
-4
lines changed

6 files changed

+40
-4
lines changed

src/libdyld/MachOMgr.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,21 @@ void MachOMgr::registerUnloadHook(LoaderHookFunc* func)
8888
m_unloadHooks.insert(func);
8989
}
9090

91+
void MachOMgr::deregisterLoadHook(LoaderHookFunc* func)
92+
{
93+
Darling::RWMutexWriteLock l(m_lock);
94+
95+
m_loadHooks.erase(func);
96+
}
97+
98+
void MachOMgr::deregisterUnloadHook(LoaderHookFunc* func)
99+
{
100+
Darling::RWMutexWriteLock l(m_lock);
101+
102+
m_unloadHooks.erase(func);
103+
}
104+
105+
91106
void MachOMgr::add(MachOObject* obj, bool mainModule)
92107
{
93108
Darling::RWMutexWriteLock l(m_lock);

src/libdyld/MachOMgr.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ class MachOMgr
5555
void registerLoadHook(LoaderHookFunc* func);
5656
void registerUnloadHook(LoaderHookFunc* func);
5757

58+
void deregisterLoadHook(LoaderHookFunc* func);
59+
void deregisterUnloadHook(LoaderHookFunc* func);
60+
5861
// DYLD_BIND_AT_LAUNCH
5962
inline void setBindAtLaunch(bool bindAtLaunch) { m_bindAtLaunch = bindAtLaunch; }
6063
inline bool bindAtLaunch() const { return m_bindAtLaunch || useTrampolines(); }

src/libdyld/dl_public.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
static thread_local char g_lastError[1024];
1919
static thread_local bool g_lastErrorRead = false;
2020

21-
static std::set<Darling::DlsymHookFunc> g_dlsymHooks;
21+
static std::set<Darling::DlsymHookFunc>* g_dlsymHooks = new std::set<Darling::DlsymHookFunc>;
2222

2323
using namespace Darling;
2424

@@ -116,7 +116,7 @@ static std::string processSymbolViaHooks(const std::string& symbol)
116116

117117
strcpy(translated, symbol.c_str());
118118

119-
for (Darling::DlsymHookFunc hook : g_dlsymHooks)
119+
for (Darling::DlsymHookFunc hook : *g_dlsymHooks)
120120
{
121121
if (hook(translated))
122122
return translated;
@@ -268,11 +268,11 @@ const char* NSLibraryNameForModule(NSModule m)
268268

269269
void Darling::registerDlsymHook(DlsymHookFunc func)
270270
{
271-
g_dlsymHooks.insert(func);
271+
g_dlsymHooks->insert(func);
272272
}
273273

274274
void Darling::deregisterDlsymHook(DlsymHookFunc func)
275275
{
276-
//g_dlsymHooks.erase(func);
276+
g_dlsymHooks->erase(func);
277277
}
278278

src/libdyld/dyld_public.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,16 @@ void _dyld_register_func_for_remove_image(MachOMgr::LoaderHookFunc* func)
7979
MachOMgr::instance()->registerUnloadHook(func);
8080
}
8181

82+
void _dyld_deregister_func_for_add_image(MachOMgr::LoaderHookFunc* func)
83+
{
84+
MachOMgr::instance()->deregisterLoadHook(func);
85+
}
86+
87+
void _dyld_deregister_func_for_remove_image(MachOMgr::LoaderHookFunc* func)
88+
{
89+
MachOMgr::instance()->deregisterUnloadHook(func);
90+
}
91+
8292

8393
const char* dyld_image_path_containing_address(const void* addr)
8494
{

src/libdyld/dyld_public.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ char* getsectdata(const struct mach_header* header, const char* segname, const c
4949

5050
void _dyld_register_func_for_add_image(Darling::MachOMgr::LoaderHookFunc* func);
5151
void _dyld_register_func_for_remove_image(Darling::MachOMgr::LoaderHookFunc* func);
52+
void _dyld_deregister_func_for_add_image(Darling::MachOMgr::LoaderHookFunc* func);
53+
void _dyld_deregister_func_for_remove_image(Darling::MachOMgr::LoaderHookFunc* func);
5254

5355
void __dyld_make_delayed_module_initializer_calls();
5456
void __dyld_mod_term_funcs();

src/libobjcdarwin/ClassRegister.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@ __attribute__((constructor))
4949
//std::cout << "Done registering\n";
5050
}
5151

52+
__attribute__((destructor))
53+
void DeregisterHooks()
54+
{
55+
_dyld_deregister_func_for_add_image(ProcessImageLoad);
56+
_dyld_deregister_func_for_remove_image(ProcessImageUnload);
57+
}
5258

5359
void ProcessImageLoad(const struct mach_header* mh, intptr_t slide)
5460
{

0 commit comments

Comments
 (0)