-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathdlsym_hook.cpp
More file actions
51 lines (39 loc) · 1.18 KB
/
dlsym_hook.cpp
File metadata and controls
51 lines (39 loc) · 1.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <dlfcn.h>
#include <string>
#include <stdexcept>
#include "globals.hpp"
#include "generic_hook.hpp"
#include "dlsym_hook.hpp"
#include "malloc_hook.hpp"
typedef void *(*dlopen_fp)(const char*, int);
dlsym_fp real_dlsym = NULL;
dlopen_fp real_dlopen = NULL;
void *last_dlopen_handle = NULL;
extern "C" {
extern void *_dl_sym(void *, const char *, void *);
void *dlsym(void *handle, const char *symbol) {
if (real_dlsym == NULL)
real_dlsym = reinterpret_cast<dlsym_fp>(_dl_sym(RTLD_NEXT, "dlsym", reinterpret_cast<void *>(dlsym)));
void *ret = NULL;
try {
ret = fps.at(symbol);
}
catch(std::out_of_range) {
void *real_fp = real_dlsym(handle, symbol);
#ifdef USE_GENERIC_HOOK
if (symbol[0] == 'c' && symbol[1] == 'u') {
ret = make_generic_hook(symbol, real_fp);
fps[symbol] = ret;
} else
#endif /* USE_GENERIC_HOOK */
ret = real_fp;
}
return ret;
}
void *dlopen(const char *filename, int flags) {
if (real_dlopen == NULL)
real_dlopen = reinterpret_cast<dlopen_fp>(_dl_sym(RTLD_NEXT, "dlopen", reinterpret_cast<void *>(dlopen)));
last_dlopen_handle = real_dlopen(filename, flags);
return last_dlopen_handle;
}
} /* extern "C" */