diff options
author | Pali Rohár <pali.rohar@gmail.com> | 2019-01-29 22:57:04 +0100 |
---|---|---|
committer | Pali Rohár <pali.rohar@gmail.com> | 2019-02-14 09:25:21 +0100 |
commit | 63d7bda42322bb0916e30bc547123a8330a4dcc2 (patch) | |
tree | 71d0ea65a3c604982b20445384392fbdbce6d136 /dlfcn.h | |
parent | 29c46a54ffa31513be1a2cdcd9e8a55938d6e549 (diff) | |
download | dlfcn-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.h | 4 |
1 files changed, 2 insertions, 2 deletions
@@ -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 | ||
50 | DLFCN_EXPORT void *dlopen ( const char *file, int mode ); | 50 | DLFCN_EXPORT void *dlopen ( const char *file, int mode ); |
51 | DLFCN_EXPORT int dlclose(void *handle); | 51 | DLFCN_EXPORT int dlclose(void *handle); |