aboutsummaryrefslogtreecommitdiff
path: root/dlfcn.h
diff options
context:
space:
mode:
authorPali Rohár <pali.rohar@gmail.com>2019-01-29 22:57:04 +0100
committerPali Rohár <pali.rohar@gmail.com>2019-02-14 09:25:21 +0100
commit63d7bda42322bb0916e30bc547123a8330a4dcc2 (patch)
tree71d0ea65a3c604982b20445384392fbdbce6d136 /dlfcn.h
parent29c46a54ffa31513be1a2cdcd9e8a55938d6e549 (diff)
downloaddlfcn-win32-63d7bda42322bb0916e30bc547123a8330a4dcc2.tar.gz
dlfcn-win32-63d7bda42322bb0916e30bc547123a8330a4dcc2.tar.bz2
dlfcn-win32-63d7bda42322bb0916e30bc547123a8330a4dcc2.zip
Implement support for dlsym() with RTLD_DEFAULT and RTLD_NEXT
dlsym() with RTLD_DEFAULT handle behaves in same way like with global handle returned by dlopen() with NULL file name. dlsym() with RTLD_NEXT handle search for next loaded module which provides specified symbol. "Next" means module which in EnumProcessModules() result after the module which called dlsym(). To get caller function of dlsym() use _ReturnAddress() intrinsic. To get module where is caller function use the fact that HMODULE is the same value as the module's base address. When compiling under gcc, defines _ReturnAddress() macro via gcc's builtin as it does not provide MSC's specific _ReturnAddress() intrinsic. Added tests demonstrate that both RTLD_DEFAULT and RTLD_NEXT are working as expected.
Diffstat (limited to 'dlfcn.h')
-rw-r--r--dlfcn.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/dlfcn.h b/dlfcn.h
index 711e431..c0d7777 100644
--- a/dlfcn.h
+++ b/dlfcn.h
@@ -44,8 +44,8 @@ extern "C" {
44 * Note: All other RTLD_* flags in any dlfcn.h are not standard compliant. 44 * Note: All other RTLD_* flags in any dlfcn.h are not standard compliant.
45 */ 45 */
46 46
47#define RTLD_DEFAULT 0 47#define RTLD_DEFAULT ((void *)0)
48#define RTLD_NEXT 0 48#define RTLD_NEXT ((void *)-1)
49 49
50DLFCN_EXPORT void *dlopen ( const char *file, int mode ); 50DLFCN_EXPORT void *dlopen ( const char *file, int mode );
51DLFCN_EXPORT int dlclose(void *handle); 51DLFCN_EXPORT int dlclose(void *handle);