Allow for extrnal DllMain.
authorAndy Polyakov <appro@openssl.org>
Thu, 26 Jul 2007 16:46:54 +0000 (16:46 +0000)
committerAndy Polyakov <appro@openssl.org>
Thu, 26 Jul 2007 16:46:54 +0000 (16:46 +0000)
crypto/cryptlib.c

index 09f25b7077b93cdd24c6164c41f0bbc4929464f9..8f9e88e403d0b434b1cab3ac6c998ff9d287ab77 100644 (file)
@@ -270,7 +270,7 @@ int CRYPTO_add_lock(int *pointer, int amount, int type, const char *file,
 
 #if    defined(__i386)   || defined(__i386__)   || defined(_M_IX86) || \
        defined(__INTEL__) || \
-       defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64)
+       defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64)
 
 unsigned long  OPENSSL_ia32cap_P=0;
 unsigned long *OPENSSL_ia32cap_loc(void) { return &OPENSSL_ia32cap_P; }
@@ -306,6 +306,62 @@ void OPENSSL_cpuid_setup(void) {}
 #endif
 
 #if (defined(_WIN32) || defined(__CYGWIN__)) && defined(_WINDLL)
+
+#ifdef OPENSSL_FIPS
+
+#include <tlhelp32.h>
+#if defined(__GNUC__) && __GNUC__>=2
+static int DllInit(void) __attribute__((constructor));
+#elif defined(_MSC_VER)
+static int DllInit(void);
+# ifdef _WIN64
+# pragma section(".CRT$XCU",read)
+  __declspec(allocate(".CRT$XCU"))
+# else
+# pragma data_seg(".CRT$XCU")
+# endif
+  static int (*p)(void) = DllInit;
+# pragma data_seg()
+#endif
+
+static int DllInit(void)
+{
+#if defined(_WIN32_WINNT)
+       union   { int(*f)(void); BYTE *p; } t = { DllInit };
+        HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
+       IMAGE_DOS_HEADER *dos_header;
+       IMAGE_NT_HEADERS *nt_headers;
+       MODULEENTRY32 me32 = {sizeof(me32)};
+
+       hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0);
+       if (hModuleSnap != INVALID_HANDLE_VALUE &&
+           Module32First(hModuleSnap,&me32)) do
+               {
+               if (t.p >= me32.modBaseAddr &&
+                   t.p <  me32.modBaseAddr+me32.modBaseSize)
+                       {
+                       dos_header=(IMAGE_DOS_HEADER *)me32.modBaseAddr;
+                       if (dos_header->e_magic==IMAGE_DOS_SIGNATURE)
+                               {
+                               nt_headers=(IMAGE_NT_HEADERS *)
+                                       ((BYTE *)dos_header+dos_header->e_lfanew);
+                               if (nt_headers->Signature==IMAGE_NT_SIGNATURE &&
+                                   me32.modBaseAddr!=(BYTE*)nt_headers->OptionalHeader.ImageBase)
+                                       OPENSSL_NONPIC_relocated=1;
+                               }
+                       break;
+                       }
+               } while (Module32Next(hModuleSnap,&me32));
+
+       if (hModuleSnap != INVALID_HANDLE_VALUE)
+               CloseHandle(hModuleSnap);
+#endif
+       OPENSSL_cpuid_setup();
+       return 0;
+}
+
+#else
+
 #ifdef __CYGWIN__
 /* pick DLL_[PROCESS|THREAD]_[ATTACH|DETACH] definitions */
 #include <windows.h>
@@ -349,6 +405,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason,
        }
 #endif
 
+#endif
+
 #if defined(_WIN32) && !defined(__CYGWIN__)
 #include <tchar.h>