From 84af71a916d0bfce4dde135e4a5fe60d75f4940c Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Tue, 29 Mar 2016 16:48:02 +0200 Subject: [PATCH] Break out DllMain from crypto/cryptlib.c and use it in shared libs only Reviewed-by: Andy Polyakov --- crypto/build.info | 4 ++++ crypto/cryptlib.c | 49 --------------------------------------------- crypto/dllmain.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 49 deletions(-) create mode 100644 crypto/dllmain.c diff --git a/crypto/build.info b/crypto/build.info index 217dc62430..1b4ed1434a 100644 --- a/crypto/build.info +++ b/crypto/build.info @@ -31,3 +31,7 @@ GENERATE[arm64cpuid.S]=arm64cpuid.pl $(PERLASM_SCHEME) INCLUDE[arm64cpuid.o]=. GENERATE[armv4cpuid.S]=armv4cpuid.pl $(PERLASM_SCHEME) INCLUDE[armv4cpuid.o]=. + +IF[{- $config{target} =~ /^(?:Cygwin|mingw|VC-)/ -}] + SHARED_SOURCE[../libcrypto]=dllmain.c +ENDIF diff --git a/crypto/cryptlib.c b/crypto/cryptlib.c index e41a6fc117..7e1d780f6c 100644 --- a/crypto/cryptlib.c +++ b/crypto/cryptlib.c @@ -195,55 +195,6 @@ void OPENSSL_cpuid_setup(void) } #endif -#if (defined(_WIN32) || defined(__CYGWIN__)) && defined(_WINDLL) -# ifdef __CYGWIN__ -/* pick DLL_[PROCESS|THREAD]_[ATTACH|DETACH] definitions */ -# include -/* - * this has side-effect of _WIN32 getting defined, which otherwise is - * mutually exclusive with __CYGWIN__... - */ -# endif - -/* - * All we really need to do is remove the 'error' state when a thread - * detaches - */ - -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved); -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) -{ - switch (fdwReason) { - case DLL_PROCESS_ATTACH: - OPENSSL_cpuid_setup(); -# if defined(_WIN32_WINNT) - { - IMAGE_DOS_HEADER *dos_header = (IMAGE_DOS_HEADER *) hinstDLL; - IMAGE_NT_HEADERS *nt_headers; - - if (dos_header->e_magic == IMAGE_DOS_SIGNATURE) { - nt_headers = (IMAGE_NT_HEADERS *) ((char *)dos_header - + dos_header->e_lfanew); - if (nt_headers->Signature == IMAGE_NT_SIGNATURE && - hinstDLL != - (HINSTANCE) (nt_headers->OptionalHeader.ImageBase)) - OPENSSL_NONPIC_relocated = 1; - } - } -# endif - break; - case DLL_THREAD_ATTACH: - break; - case DLL_THREAD_DETACH: - OPENSSL_thread_stop(); - break; - case DLL_PROCESS_DETACH: - break; - } - return (TRUE); -} -#endif - #if defined(_WIN32) && !defined(__CYGWIN__) # include # include diff --git a/crypto/dllmain.c b/crypto/dllmain.c new file mode 100644 index 0000000000..0a229b57f9 --- /dev/null +++ b/crypto/dllmain.c @@ -0,0 +1,51 @@ +#include "internal/cryptlib_int.h" + +#if defined(_WIN32) || defined(__CYGWIN__) +# ifdef __CYGWIN__ +/* pick DLL_[PROCESS|THREAD]_[ATTACH|DETACH] definitions */ +# include +/* + * this has side-effect of _WIN32 getting defined, which otherwise is + * mutually exclusive with __CYGWIN__... + */ +# endif + +/* + * All we really need to do is remove the 'error' state when a thread + * detaches + */ + +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved); +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + switch (fdwReason) { + case DLL_PROCESS_ATTACH: + OPENSSL_cpuid_setup(); +# if defined(_WIN32_WINNT) + { + IMAGE_DOS_HEADER *dos_header = (IMAGE_DOS_HEADER *) hinstDLL; + IMAGE_NT_HEADERS *nt_headers; + + if (dos_header->e_magic == IMAGE_DOS_SIGNATURE) { + nt_headers = (IMAGE_NT_HEADERS *) ((char *)dos_header + + dos_header->e_lfanew); + if (nt_headers->Signature == IMAGE_NT_SIGNATURE && + hinstDLL != + (HINSTANCE) (nt_headers->OptionalHeader.ImageBase)) + OPENSSL_NONPIC_relocated = 1; + } + } +# endif + break; + case DLL_THREAD_ATTACH: + break; + case DLL_THREAD_DETACH: + OPENSSL_thread_stop(); + break; + case DLL_PROCESS_DETACH: + break; + } + return (TRUE); +} +#endif + -- 2.25.1