"OS390-Unix","c89.sh:-O -DB_ENDIAN -DCHARSET_EBCDIC -DNO_SYS_PARAM_H -D_ALL_SOURCE::(unknown):::THIRTY_TWO_BIT DES_PTR DES_UNROLL MD2_CHAR RC4_INDEX RC4_CHAR BF_PTR:::",
# Win64 targets, WIN64I denotes IA-64 and WIN64A - AMD64
-"VC-WIN64I","cl::::WIN64I::SIXTY_FOUR_BIT EXPORT_VAR_AS_FN:${no_asm}:win32",
-"VC-WIN64A","cl::::WIN64A::SIXTY_FOUR_BIT EXPORT_VAR_AS_FN:${no_asm}:win32",
+"VC-WIN64I","cl::::WIN64I::SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN:${no_asm}:win32",
+"VC-WIN64A","cl::::WIN64A::SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN:${no_asm}:win32",
# Visual C targets
"VC-NT","cl::::WINNT::BN_LLONG RC4_INDEX EXPORT_VAR_AS_FN ${x86_gcc_opts}:${no_asm}:win32",
----------------------------------
[Instructions for building for Windows CE can be found in INSTALL.WCE]
+ [Instructions for building for Win64 can be found in INSTALL.W64]
Heres a few comments about building OpenSSL in Windows environments. Most
of this is tested on Win32 but it may also work in Win 3.1 with some
--- /dev/null
+
+ INSTALLATION ON THE WIN64 PLATFORM
+ ----------------------------------
+
+ Caveat lector
+ -------------
+
+ As of moment of this writing Win64 support is classified "initial"
+ for the following reasons.
+
+ - No assembler modules are engaged upon initial 0.9.8 release.
+ - API might change within 0.9.8 life-span, *but* in a manner which
+ doesn't break backward binary compatibility. Or in other words,
+ application programs compiled with initial 0.9.8 headers will
+ be expected to work with future minor release .DLL without need
+ to re-compile, even if future minor release features modified API.
+ - Above mentioned API modifications have everything to do with
+ elimination of a number of limitations, which are normally
+ considered inherent to 32-bit platforms. Which in turn is why they
+ are treated as limitations on 64-bit platform such as Win64:-)
+ The current list comprises [but not necessarily limited to]:
+
+ - null-terminated strings may not be longer than 2G-1 bytes,
+ longer strings are treated as zero-length;
+ - dynamically and *internally* allocated chunks can't be larger
+ than 2G-1 bytes;
+ - inability to encrypt/decrypt chunks of data larger than 4GB
+ [it's possibly to *hash* chunks of arbitrary size through];
+
+ Neither of these is actually big deal and hardly encountered
+ in real-life applications.
+
+ Compiling procedure
+ -------------------
+
+ You will need Perl. You can run under Cygwin or you can download
+ ActiveState Perl from http://www.activestate.com/ActivePerl.
+
+ You will need Microsoft Platform SDK, available for download at
+ http://www.microsoft.com/msdownload/platformsdk/sdkupdate/. As per
+ April 2005 Platform SDK is equipped with Win64 compilers, as well
+ as assemblers, but it might change in the future.
+
+ To build for Win64/x64:
+
+ > perl Configure VC-WIN64A
+ > ms\do_win64a
+ > nmake -f ms\ntdll.mak
+ > cd out32dll
+ > ..\ms\test
+
+ To build for Win64/IA64:
+
+ > perl Configure VC-WIN64I
+ > ms\do_win64i
+ > nmake -f ms\ntdll.mak
+ > cd out32dll
+ > ..\ms\test
+
+ Naturally test-suite itself has to be executed on the target platform.
+
+ Installation
+ ------------
+
+ TBD, for now see INSTALL.W32.
+
unsigned long OPENSSL_ia32cap_P=0;
unsigned long *OPENSSL_ia32cap_loc(void) { return &OPENSSL_ia32cap_P; }
-int OPENSSL_NONPIC_relocated=0;
#if defined(OPENSSL_CPUID_OBJ) && !defined(OPENSSL_NO_ASM) && !defined(I386_ONLY)
#define OPENSSL_CPUID_SETUP
#else
unsigned long *OPENSSL_ia32cap_loc(void) { return NULL; }
#endif
+int OPENSSL_NONPIC_relocated = 0;
#if !defined(OPENSSL_CPUID_SETUP)
void OPENSSL_cpuid_setup(void) {}
#endif
/* static int mem_cmp(MEM *a, MEM *b) */
static int mem_cmp(const void *a_void, const void *b_void)
{
+#ifdef _WIN64
+ const char *a=(const char *)((const MEM *)a_void)->addr,
+ *b=(const char *)((const MEM *)b_void)->addr;
+ if (a==b) return 0;
+ else if (a>b) return 1;
+ else return -1;
+#else
return((const char *)((const MEM *)a_void)->addr
- (const char *)((const MEM *)b_void)->addr);
+#endif
}
/* static unsigned long mem_hash(MEM *a) */
# include <stddef.h>
# include <errno.h>
# include <string.h>
+# ifdef _WIN64
+# define strlen(s) _strlen31(s)
+/* cut strings to 2GB */
+static unsigned int _strlen31(const char *str)
+ {
+ unsigned int len=0;
+ while (*str && len<0x80000000U) str++, len++;
+ return len&0x7FFFFFFF;
+ }
+# endif
# include <malloc.h>
# endif
# include <io.h>
# elif !defined(__DJGPP__)
# include <winsock.h>
extern HINSTANCE _hInstance;
+# ifdef _WIN64
+/*
+ * Even though sizeof(SOCKET) is 8, it's safe to cast it to int, because
+ * the value constitutes an index in per-process table of limited size
+ * and not a real pointer.
+ */
+# define socket(d,t,p) ((int)socket(d,t,p))
+# define accept(s,f,l) ((int)accept(s,f,l))
+# endif
# define SSLeay_Write(a,b,c) send((a),(b),(c),0)
# define SSLeay_Read(a,b,c) recv((a),(b),(c),0)
# define SHUTDOWN(fd) { shutdown((fd),0); closesocket(fd); }
--- /dev/null
+\r
+perl util\mkfiles.pl >MINFO\r
+perl ms\uplink.pl win64a > ms\uptable.asm\r
+ml64 -c -Foms\uptable.obj ms\uptable.asm\r
+perl util\mk1mf.pl no-asm VC-WIN64A >ms\nt.mak\r
+perl util\mk1mf.pl dll no-asm VC-WIN64A >ms\ntdll.mak\r
+\r
+perl util\mkdef.pl 32 libeay > ms\libeay32.def\r
+perl util\mkdef.pl 32 ssleay > ms\ssleay32.def\r
--- /dev/null
+\r
+perl util\mkfiles.pl >MINFO\r
+perl ms\uplink.pl win64i > ms\uptable.asm\r
+ias -o ms\uptable.obj ms\uptable.asm\r
+perl util\mk1mf.pl no-asm VC-WIN64I >ms\nt.mak\r
+perl util\mk1mf.pl dll no-asm VC-WIN64I >ms\ntdll.mak\r
+\r
+perl util\mkdef.pl 32 libeay > ms\libeay32.def\r
+perl util\mkdef.pl 32 ssleay > ms\ssleay32.def\r
%ops=(
"VC-WIN32", "Microsoft Visual C++ [4-6] - Windows NT or 9X",
+ "VC-WIN64I", "Microsoft C/C++ - Win64/IA-64",
+ "VC-WIN64A", "Microsoft C/C++ - Win64/x64",
"VC-CE", "Microsoft eMbedded Visual C++ 3.0 - Windows CE ONLY",
"VC-NT", "Microsoft Visual C++ [4-6] - Windows NT ONLY",
"Mingw32", "GNU C++ - Windows NT or 9x",
$NT=0;
push(@INC,"util/pl","pl");
-if (($platform eq "VC-WIN32") || ($platform eq "VC-NT"))
+if (($platform =~ /VC-(.+)/))
{
- $NT = 1 if $platform eq "VC-NT";
+ $FLAVOR=$1;
+ $NT = 1 if $1 eq "NT";
require 'VC-32.pl';
}
elsif ($platform eq "VC-CE")
# C compiler stuff
$cc='cl';
-$cflags=' /MD /W3 /WX /G5 /Ox /O2 /Ob2 /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32';
-$lflags="/nologo /subsystem:console /machine:I386 /opt:ref";
+if ($FLAVOR =~ /WIN64/)
+ {
+ # Note that we currently don't have /WX on Win64! There is a lot of
+ # warnings, but only of two types:
+ #
+ # C4344: conversion from '__int64' to 'int/long', possible loss of data
+ # C4267: conversion from 'size_t' to 'int/long', possible loss of data
+ #
+ # Amount of latter type is minimized by aliasing strlen to function of
+ # own desing and limiting its return value to 2GB-1 (see e_os.h). As
+ # per 0.9.8 release remaining warnings were explicitly examines and
+ # considered safe to ignore.
+ #
+ $cflags=' /MD /W3 /Ox /Gs0 /GF /Gy /nologo -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -DOPENSSL_SYSNAME_WIN32 -DOPENSSL_SYSNAME_WINNT -DUNICODE -D_UNICODE';
+ $lflags="/nologo /subsystem:console /opt:ref";
+ }
+else
+ {
+ $cflags=' /MD /W3 /WX /G5 /Ox /O2 /Ob2 /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32';
+ $lflags="/nologo /subsystem:console /machine:I386 /opt:ref";
+ }
$mlflags='';
$out_def="out32";
if ($no_sock)
{ $ex_libs=""; }
else { $ex_libs="wsock32.lib user32.lib gdi32.lib"; }
+$ex_libs="$ex_libs bufferoverflowu.lib" if ($FLAVOR =~ /WIN64/);
# static library stuff
$mklib='lib';
LIBS_DEP=$(LIBS_DEP) $(OBJ_D)\applink.obj
CRYPTOOBJ=$(OBJ_D)\uplink.obj $(CRYPTOOBJ)
+___
+ $banner.=<<'___' if ($FLAVOR =~ /WIN64/);
+CRYPTOOBJ=ms\uptable.obj $(CRYPTOOBJ)
___
}
{
local($ex)=($target =~ /O_SSL/)?' $(L_CRYPTO)':'';
$ex.=' wsock32.lib gdi32.lib advapi32.lib user32.lib';
+ $ex.=' bufferoverflowu.lib' if ($FLAVOR =~ /WIN64/);
$ret.="\t\$(LINK) \$(MLFLAGS) $efile$target /def:ms/${Name}.def @<<\n \$(SHLIB_EX_OBJ) $objs $ex\n<<\n";
}
$ret.="\n";