aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPali Rohár <pali.rohar@gmail.com>2024-11-21 01:52:34 +0100
committerSilvio Traversaro <silvio@traversaro.it>2025-05-03 12:30:48 +0200
commit529de2d3d04a41f869dd4803404cd763b9e8f72c (patch)
tree5db110f0fdbf2b785c1a73ae07076ff70ba2d412
parent77152633a5d3d151107ce9a7b876747bce83c8d3 (diff)
downloaddlfcn-win32-fixpatches.tar.gz
dlfcn-win32-fixpatches.tar.bz2
dlfcn-win32-fixpatches.zip
For non-debug DLL builds avoid linking to CRT library as it is not neededfixpatches
Now when dlfcn.c does not call any function from CRT library, it is not needed to link dlfcn library with some specific CRT library (e.g. crtdll.dll, msvcrt.dll, msvcr120.dll or api-ms-win-crt-*.dll) and therefore bound the dlfcn DLL library to specific Visual C++ runtime version. This makes libdl.dll DLL library CRT-neutral and therefore can be used or linked into any EXE application using any CRT library of any version, without any Visual C++ runtime version conflict.
-rw-r--r--Makefile2
-rw-r--r--src/CMakeLists.txt9
-rw-r--r--src/dlfcn.c11
3 files changed, 21 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index 899334a..4042eca 100644
--- a/Makefile
+++ b/Makefile
@@ -32,7 +32,7 @@ libdl.a: $(SOURCES)
32 $(RANLIB) $@ 32 $(RANLIB) $@
33 33
34libdl.dll: $(SOURCES) 34libdl.dll: $(SOURCES)
35 $(CC) $(CFLAGS) $(SHFLAGS) -DDLFCN_WIN32_SHARED -shared -o $@ $^ 35 $(CC) $(CFLAGS) $(SHFLAGS) -DDLFCN_WIN32_SHARED -D_DllMainCRTStartup=DllMainCRTStartup -nostartfiles -nostdlib -lkernel32 -shared -o $@ $^
36 36
37libdl.lib: libdl.dll 37libdl.lib: libdl.dll
38 $(LIBCMD) /machine:i386 /def:libdl.def 38 $(LIBCMD) /machine:i386 /def:libdl.def
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 9066e65..5dc21d3 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -15,6 +15,15 @@ set_target_properties(dl PROPERTIES DEFINE_SYMBOL "")
15 15
16# set shared mode for compiling library and propagate mode to cmake clients 16# set shared mode for compiling library and propagate mode to cmake clients
17if (BUILD_SHARED_LIBS) 17if (BUILD_SHARED_LIBS)
18 # for non-debug shared mode, avoid linking to CRT library as it is not needed
19 if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
20 if (MSVC)
21 set_property(TARGET dl APPEND_STRING PROPERTY COMPILE_FLAGS "/Zl")
22 else (MSVC)
23 set_property(TARGET dl APPEND_STRING PROPERTY COMPILE_FLAGS "-D_DllMainCRTStartup=DllMainCRTStartup")
24 set_property(TARGET dl APPEND_STRING PROPERTY LINK_FLAGS "-nostartfiles -nostdlib -lkernel32")
25 endif (MSVC)
26 endif (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
18 target_compile_definitions(dl PUBLIC DLFCN_WIN32_SHARED) 27 target_compile_definitions(dl PUBLIC DLFCN_WIN32_SHARED)
19endif (BUILD_SHARED_LIBS) 28endif (BUILD_SHARED_LIBS)
20 29
diff --git a/src/dlfcn.c b/src/dlfcn.c
index c128579..5ddf1a7 100644
--- a/src/dlfcn.c
+++ b/src/dlfcn.c
@@ -955,4 +955,15 @@ BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
955 (void) lpvReserved; 955 (void) lpvReserved;
956 return TRUE; 956 return TRUE;
957} 957}
958
959/* For non-debug DLL builds defines DLL entry point which avoids using CRT library */
960#if !defined( _DEBUG )
961#ifdef __cplusplus
962extern "C"
963#endif
964BOOL WINAPI _DllMainCRTStartup( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
965{
966 return DllMain( hinstDLL, fdwReason, lpvReserved );
967}
968#endif
958#endif 969#endif