aboutsummaryrefslogtreecommitdiff
path: root/dlfcn.c (follow)
Commit message (Collapse)AuthorAgeFilesLines
* Implement support for dlsym() with RTLD_DEFAULT and RTLD_NEXTPali Rohár2019-02-141-6/+59
| | | | | | | | | | | | | | | | | | | 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.
* Fix resolving global symbols when LoadLibrary() is called after dlopen()Pali Rohár2019-02-141-110/+70
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Usage of first_automatic_object cache is wrong. This cache is filled by all loaded DLL files (either implicitly or explicitly with LoadLibrary() call) by EnumProcessModules() call at first usage of dlopen(). So dlsym() can resolve global symbols only if they were loaded prior to dlopen() call. Any future usage of LoadLibrary() does not include newly loaded DLLs into first_automatic_object cache. To fix this problem, first_automatic_object cache is fully removed and EnumProcessModules() call is issued directly in dlsym() call. As EnumProcessModules() returns all DLLs, included those which were loaded by dlopen() with RTLD_LOCAL, it may break RTLD_LOCAL support. To address this problem switch linked-list of all loaded DLLs with RTLD_GLOBAL to linked-list of all loaded DLLs with RTLD_LOCAL flag. And then skip modules from EnumProcessModules() which are in linked-list. Also in WinAPI all DLLs loaded by LoadLibrary() behaves like RTLD_GLOBAL. So above change is compatible with this behavior. There may be another problem. Before retrieving HMODULE for DLL filename (which is done by LoadLibrary()), it is not possible to detect if DLL was already loaded by RTLD_LOCAL or not. And after calling LoadLibrary() it is not possible to know if DLL was loaded either by dlsym() with RTLD_LOCAL or by LoadLibrary() (which is equivalent to RTLD_GLOBAL). To address this problem, compare number of loaded modules (counted by EnumProcessModules()) before and after LoadLibrary() called from dlsym(). If number does not change it means that DLL was already loaded. So based on this result either add or remove HMODULE from linked-list of RTLD_LOCAL modules. Added test demonstrate usage of: global = dlopen(NULL, RTLD_GLOBAL); /* global handle */ LoadLibrary("library.dll"); /* this provides function */ function = dlsym(global, "function"); /* resolve function from library.dll */
* #include <stdlib.h>Jean-Damien Durand2018-01-171-0/+1
|
* Fix bug in dlerror second consecutive callSilvio2017-05-011-0/+6
| | | | | | | | | | | | | According to the specs, a second consecutive call to dlerror should always return NULL . This was the case in dlfcn-win32 before https://github.com/dlfcn-win32/dlfcn-win32/pull/20 introduce a regression that caused dlerror to crash on the second consecutive call. In this commit the issue is fixed as suggested in https://github.com/dlfcn-win32/dlfcn-win32/issues/34 and a regression test has been added.
* Added support for unicode character set.Guohui Wang2015-04-091-22/+90
|
* Add my copyrightTimothy Gu2015-03-151-0/+1
| | | Not that I care…
* Warning control in MSVCTimothy Gu2015-03-151-0/+5
|
* Use SHARED macro to handle DLL exportTimothy Gu2015-03-151-0/+2
| | | | | | | (Originally the SHARED macro is created not to handle this case, but it seems like it works fine for this purpose as well.) Closes #12.
* Add linked modules to a separate global listTimothy Gu2015-03-151-27/+115
| | | | Fixes #2.
* Check for memory leak when _DEBUG is definedTimothy Gu2015-03-151-0/+5
|
* Add import/export symbols for MSVC.Dennis Nienhüser2015-03-111-0/+1
| | | | | | | | | | This results in an import .lib file. Closes #4. Some fixes by Timothy Gu <timothygu99@gmail.com> Signed-off-by: Timothy Gu <timothygu99@gmail.com>
* Use more secure sprintf_s()Timothy Gu2015-03-111-1/+1
|
* License stuffTimothy Gu2014-02-101-4/+4
|
* Fix error checking in copy_string()Timothy Gu2014-01-221-1/+1
|
* Remove extraneous CloseHandleTimothy Gu2014-01-201-2/+0
| | | | Fixes issue 13.
* Clear ->next after creating nobject.r19Ramiro Polla2009-01-111-0/+1
|
* Rename save_err_ptr( ) to save_err_ptr_str( ) to avoid confusion.r11Ramiro Polla2008-12-091-3/+3
| | | Based on patch by Dan DuVarney.
* Fix bug reported by Dan DuVarney, based on a patch by himself.Ramiro Polla2008-12-091-9/+10
| | | | | | | | POSIX says: If no dynamic linking errors have occurred since the last invocation of dlerror(), dlerror() shall return NULL. The code was returning an empty string. The way dlerror( ) returns the error string has been changed.
* Use double linked list instead of static array of 255 global objects.Ramiro Polla2007-06-291-35/+68
|
* Take care of our own error messagesRamiro Polla2007-06-291-46/+64
|
* Fix copy_string( )Ramiro Polla2007-06-291-8/+9
|
* Cosmetics: white spaceRamiro Polla2007-06-291-2/+2
|
* Initial RevisionRamiro Polla2007-06-281-0/+260