Break out DllMain from crypto/cryptlib.c and use it in shared libs only

Reviewed-by: Andy Polyakov <appro@openssl.org>
This commit is contained in:
Richard Levitte 2016-03-29 16:48:02 +02:00
parent 2a08d1a05d
commit 84af71a916
3 changed files with 55 additions and 49 deletions

View file

@ -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

View file

@ -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 <windows.h>
/*
* 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 <tchar.h>
# include <signal.h>

51
crypto/dllmain.c Normal file
View file

@ -0,0 +1,51 @@
#include "internal/cryptlib_int.h"
#if defined(_WIN32) || defined(__CYGWIN__)
# ifdef __CYGWIN__
/* pick DLL_[PROCESS|THREAD]_[ATTACH|DETACH] definitions */
# include <windows.h>
/*
* 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