2

I searched online for building both the x86 and x64 version of OpenSSL and found many with the same issue I had. The problem is the DLLs use the same directory and file names ending with 32.

How do I build OpenSSL for both x64 and x86 when the DLLs must reside side-by-side?

jww
  • 97,681
  • 90
  • 411
  • 885
user3161924
  • 1,849
  • 18
  • 33

1 Answers1

0

The unified diff below was created for openssl-1.0.2h and will allow building both the x86 (win32) and x64 (win64) versions without conflicts using visual studio. Nothing changes with the build instructions included with openssl, you simple run the perl configure, the ms/do_xxx, and then nmake the build, and nmake the install. You do those for x64 and x86 environment without having to undo anything from the prior build.

+++ Configure   Mon Jan 19 14:26:32 1970
@@ -584,10 +584,10 @@
 # Visual C targets
 #
 # Win64 targets, WIN64I denotes IA-64 and WIN64A - AMD64
-"VC-WIN64I","cl:-W3 -Gs0 -Gy -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DUNICODE -D_UNICODE -D_CRT_SECURE_NO_DEPRECATE:::WIN64I::SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN:ia64cpuid.o:ia64.o ia64-mont.o:::aes_core.o aes_cbc.o aes-ia64.o::md5-ia64.o:sha1-ia64.o sha256-ia64.o sha512-ia64.o:::::::ghash-ia64.o::ias:win32",
-"VC-WIN64A","cl:-W3 -Gs0 -Gy -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DUNICODE -D_UNICODE -D_CRT_SECURE_NO_DEPRECATE:::WIN64A::SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN:".eval{my $asm=$x86_64_asm;$asm=~s/x86_64-gcc\.o/bn_asm.o/;$asm}.":auto:win32",
-"debug-VC-WIN64I","cl:-W3 -Gs0 -Gy -Zi -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DUNICODE -D_UNICODE -D_CRT_SECURE_NO_DEPRECATE:::WIN64I::SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN:ia64cpuid.o:ia64.o:::aes_core.o aes_cbc.o aes-ia64.o::md5-ia64.o:sha1-ia64.o sha256-ia64.o sha512-ia64.o:::::::ghash-ia64.o::ias:win32",
-"debug-VC-WIN64A","cl:-W3 -Gs0 -Gy -Zi -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DUNICODE -D_UNICODE -D_CRT_SECURE_NO_DEPRECATE:::WIN64A::SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN:".eval{my $asm=$x86_64_asm;$asm=~s/x86_64-gcc\.o/bn_asm.o/;$asm}.":auto:win32",
+"VC-WIN64I","cl:-W3 -Gs0 -Gy -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DUNICODE -D_UNICODE -D_CRT_SECURE_NO_DEPRECATE:::WIN64I::SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN:ia64cpuid.o:ia64.o ia64-mont.o:::aes_core.o aes_cbc.o aes-ia64.o::md5-ia64.o:sha1-ia64.o sha256-ia64.o sha512-ia64.o:::::::ghash-ia64.o::ias:win64",
+"VC-WIN64A","cl:-W3 -Gs0 -Gy -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DUNICODE -D_UNICODE -D_CRT_SECURE_NO_DEPRECATE:::WIN64A::SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN:".eval{my $asm=$x86_64_asm;$asm=~s/x86_64-gcc\.o/bn_asm.o/;$asm}.":auto:win64",
+"debug-VC-WIN64I","cl:-W3 -Gs0 -Gy -Zi -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DUNICODE -D_UNICODE -D_CRT_SECURE_NO_DEPRECATE:::WIN64I::SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN:ia64cpuid.o:ia64.o:::aes_core.o aes_cbc.o aes-ia64.o::md5-ia64.o:sha1-ia64.o sha256-ia64.o sha512-ia64.o:::::::ghash-ia64.o::ias:win64",
+"debug-VC-WIN64A","cl:-W3 -Gs0 -Gy -Zi -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DUNICODE -D_UNICODE -D_CRT_SECURE_NO_DEPRECATE:::WIN64A::SIXTY_FOUR_BIT RC4_CHUNK_LL DES_INT EXPORT_VAR_AS_FN:".eval{my $asm=$x86_64_asm;$asm=~s/x86_64-gcc\.o/bn_asm.o/;$asm}.":auto:win64",
 # x86 Win32 target defaults to ANSI API, if you want UNICODE, complement
 # 'perl Configure VC-WIN32' with '-DUNICODE -D_UNICODE'
 "VC-WIN32","cl:-W3 -Gs0 -GF -Gy -nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -D_CRT_SECURE_NO_DEPRECATE:::WIN32::BN_LLONG RC4_INDEX EXPORT_VAR_AS_FN ${x86_gcc_opts}:${x86_asm}:win32n:win32",
@@ -2078,11 +2078,21 @@
        VALUE "FileDescription", "OpenSSL Shared Library\\0"
        VALUE "FileVersion", "$version\\0"
 #if defined(CRYPTO)
+   #if defined(_WIN64)
+       VALUE "InternalName", "libeay64\\0"
+       VALUE "OriginalFilename", "libeay64.dll\\0"
+   #else
        VALUE "InternalName", "libeay32\\0"
        VALUE "OriginalFilename", "libeay32.dll\\0"
+   #endif
 #elif defined(SSL)
+   #if defined(_WIN64)
+       VALUE "InternalName", "ssleay64\\0"
+       VALUE "OriginalFilename", "ssleay64.dll\\0"
+   #else
        VALUE "InternalName", "ssleay32\\0"
        VALUE "OriginalFilename", "ssleay32.dll\\0"
+   #endif
 #endif
        VALUE "ProductName", "The OpenSSL Toolkit\\0"
        VALUE "ProductVersion", "$version\\0"
@@ -2262,23 +2272,23 @@
        {
        @fields = split(/\s*:\s*/,$table{$target} . ":" x 30 , -1);

-       if ($fields[$idx_dso_scheme-1] =~ /^(beos|dl|dlfcn|win32|vms)$/)
+       if ($fields[$idx_dso_scheme-1] =~ /^(beos|dl|dlfcn|win32|win64|vms)$/)
            {
            $errorcnt++;
            print STDERR "SANITY ERROR: '$target' has the dso_scheme [$idx_dso_scheme] values\n";
            print STDERR "              in the previous field\n";
            }
-       elsif ($fields[$idx_dso_scheme+1] =~ /^(beos|dl|dlfcn|win32|vms)$/)
+       elsif ($fields[$idx_dso_scheme+1] =~ /^(beos|dl|dlfcn|win32|win64|vms)$/)
            {
            $errorcnt++;
            print STDERR "SANITY ERROR: '$target' has the dso_scheme [$idx_dso_scheme] values\n";
            print STDERR "              in the following field\n";
            }
-       elsif ($fields[$idx_dso_scheme] !~ /^(beos|dl|dlfcn|win32|vms|)$/)
+       elsif ($fields[$idx_dso_scheme] !~ /^(beos|dl|dlfcn|win32|win64|vms|)$/)
            {
            $errorcnt++;
            print STDERR "SANITY ERROR: '$target' has the dso_scheme [$idx_dso_scheme] field = ",$fields[$idx_dso_scheme],"\n";
-           print STDERR "              valid values are 'beos', 'dl', 'dlfcn', 'win32' and 'vms'\n";
+           print STDERR "              valid values are 'beos', 'dl', 'dlfcn', 'win32', 'win64', and 'vms'\n";
            }
        }
    print STDERR "No sanity errors detected!\n" if $errorcnt == 0;
--- ms/do_ms.bat    Mon Jan 19 14:26:32 1970
+++ ms/do_ms.bat    Mon Jan 19 14:26:32 1970
@@ -1,7 +1,9 @@

 perl util\mkfiles.pl >MINFO
 perl util\mk1mf.pl no-asm VC-WIN32 >ms\nt.mak
+perl util\mk1mf.pl no-asm debug VC-WIN32 >ms\ntdebug.mak
 perl util\mk1mf.pl dll no-asm VC-WIN32 >ms\ntdll.mak
+perl util\mk1mf.pl dll no-asm debug VC-WIN32 >ms\ntdlldebug.mak
 if x%OSVERSION% == x goto skipce
 perl util\mk1mf.pl no-asm VC-CE >ms\ce.mak
 perl util\mk1mf.pl dll no-asm VC-CE >ms\cedll.mak
--- ms/do_nasm.bat  Mon Jan 19 14:26:32 1970
+++ ms/do_nasm.bat  Mon Jan 19 14:26:32 1970
@@ -1,7 +1,9 @@

 perl util\mkfiles.pl >MINFO
 perl util\mk1mf.pl nasm VC-WIN32 >ms\nt.mak
+perl util\mk1mf.pl nasm debug VC-WIN32 >ms\ntdebug.mak
 perl util\mk1mf.pl dll nasm VC-WIN32 >ms\ntdll.mak
+perl util\mk1mf.pl dll nasm debug VC-WIN32 >ms\ntdlldebug.mak
 perl util\mk1mf.pl nasm BC-NT >ms\bcb.mak

 perl util\mkdef.pl 32 libeay > ms\libeay32.def
--- ms/do_win64a.bat    Mon Jan 19 14:26:32 1970
+++ ms/do_win64a.bat    Mon Jan 19 14:26:32 1970
@@ -13,7 +13,9 @@

 :proceed
 perl util\mk1mf.pl VC-WIN64A >ms\nt.mak
+perl util\mk1mf.pl debug VC-WIN64A >ms\ntdebug.mak
 perl util\mk1mf.pl dll VC-WIN64A >ms\ntdll.mak
+perl util\mk1mf.pl dll debug VC-WIN64A >ms\ntdlldebug.mak

-perl util\mkdef.pl 32 libeay > ms\libeay32.def
-perl util\mkdef.pl 32 ssleay > ms\ssleay32.def
+perl util\mkdef.pl 64 libeay > ms\libeay64.def
+perl util\mkdef.pl 64 ssleay > ms\ssleay64.def
--- util/mk1mf.pl   Mon Jan 19 14:26:32 1970
+++ util/mk1mf.pl   Mon Jan 19 14:26:32 1970
@@ -178,6 +178,12 @@

 $NT=0;

+$configuniqueundefinedtag="undefined";
+$confpreprocessorundefinedcondif="#if !defined(OPENSSL_UNIQUE_CONFIG)";
+# these values are to be overridden by specific patform .pl file
+$configuniquetag=$configuniqueundefinedtag;
+$confpreprocessorcondif=$confpreprocessorundefinedcondif;
+
 push(@INC,"util/pl","pl");

 if ($platform eq "auto" || $platform eq 'copy') {
@@ -242,6 +248,7 @@
    $cflags.=' -DTERMIO';
    }

+
 $fipsdir =~ s/\//${o}/g;

 $out_dir=(defined($VARS{'OUT'}))?$VARS{'OUT'}:$out_def.($debug?".dbg":"");
@@ -444,6 +451,14 @@
        $ex_l_libs .= " \$(O_FIPSCANISTER)";
        }
    }
+   
+if ($installpdb) 
+   {
+   $extra_install .= <<"EOF";
+   \$(CP) \"\$(TMP_D)${o}*.pdb\" \"\$(INSTALLTOP)${o}lib\"
+EOF
+   }
+   

 $defs= <<"EOF";
 # N.B. You MUST use -j on FreeBSD.
@@ -607,6 +622,8 @@
    \$(MKDIR) \"\$(INSTALLTOP)${o}include${o}openssl\"
    \$(MKDIR) \"\$(INSTALLTOP)${o}lib\"
    \$(CP) \"\$(INCO_D)${o}*.\[ch\]\" \"\$(INSTALLTOP)${o}include${o}openssl\"
+   \$(CP) \"\$(INSTALLTOP)${o}include${o}openssl${o}opensslconf.h\" \"\$(INSTALLTOP)${o}include${o}openssl${o}opensslconf.${configuniquetag}.h\"
+   \$(CP) \"crypto${o}opensslconf.common.h\" \"\$(INSTALLTOP)${o}include${o}openssl${o}opensslconf.h\"
    \$(CP) \"\$(BIN_D)$o\$(E_EXE)$exep \$(INSTALLTOP)${o}bin\"
    \$(MKDIR) \"\$(OPENSSLDIR)\"
    \$(CP) apps${o}openssl.cnf \"\$(OPENSSLDIR)\"
@@ -824,6 +841,67 @@
 }
 print "###################################################################\n";
 print $rules;
+
+###    
+# Create a common multi-platform opensslconf.common.h file that will become 
+# opensslconf.h as part of the make install process.  This relies on
+# the variables $configuniquetag and $confpreprocessorcondif being configured
+# by the lower level platform pl file.
+
+unlink("crypto/opensslconf.common.bak") || die "unable to remove old crypto/opensslconf.common.bak:$!\n" if ((-e "crypto/opensslconf.common.bak") && (-e "crypto/opensslconf.common.h"));
+rename("crypto/opensslconf.common.h","crypto/opensslconf.common.bak") || die "unable to rename crypto/opensslconf.common.h\n" if -e "crypto/opensslconf.common.h";
+
+open(OUT,'>crypto/opensslconf.common.h') || die "unable to create crypto/opensslconf.common.h:$!\n";
+print OUT "/* opensslconf.h - multi-platform conf file to include specific platform conf files */\n";
+print OUT "/* WARNING: Generated automatically by mk1mf.pl as opensslconf.common.h */\n\n";
+print OUT "#undef OPENSSL_UNIQUE_CONFIG\n\n";
+
+if (-e "crypto/opensslconf.common.bak") {
+   my $sectionhdr="//-- SECTION ";
+   my $insection=0;
+   my $skipsec=0;
+   
+   open(IN,'<crypto/opensslconf.common.bak') || die "unable to read crypto/crypto/opensslconf.common.bak:$!\n";
+   while (my $line = <IN>)
+   {
+       if ($line =~ /^$sectionhdr/) {
+           $insection=1;
+           if (($line =~ /${configuniquetag}$/) || ($line =~ /${configuniqueundefinedtag}$/)) {
+               $skipsec=1;
+           }
+           else {
+               $skipsec=0;
+           }
+       }
+       
+       if ($insection && !$skipsec) {
+           print OUT $line;
+       }
+   }
+   close(IN);
+}              
+
+print OUT "//-- SECTION ${configuniquetag}\n";
+print OUT $confpreprocessorcondif."\n";
+print OUT "  #define OPENSSL_UNIQUE_CONFIG ${configuniquetag}\n";
+print OUT "  #include \"opensslconf.${configuniquetag}.h\"\n";
+print OUT "#endif\n";
+print OUT "\n";
+
+# undefined has to be last
+if ($configuniquetag ne $configuniqueundefinedtag) {
+   print OUT "//-- SECTION ${configuniqueundefinedtag}\n";
+   print OUT $confpreprocessorundefinedcondif."\n";
+   print OUT "  #define OPENSSL_UNIQUE_CONFIG ${configuniqueundefinedtag}\n";
+   print OUT "  #include \"opensslconf.${configuniqueundefinedtag}.h\"\n";
+   print OUT "#endif\n";
+   print OUT "\n";
+}
+
+close(OUT);
+
+###    
+

 ###############################################
 # strip off any trailing .[och] and append the relative directory
--- util/mkdef.pl   Mon Jan 19 14:26:32 1970
+++ util/mkdef.pl   Mon Jan 19 14:26:32 1970
@@ -71,6 +71,7 @@
 my $VMSVAX=0;
 my $VMSNonVAX=0;
 my $VMS=0;
+my $W64=0;
 my $W32=0;
 my $W16=0;
 my $NT=0;
@@ -80,7 +81,7 @@

 my @known_platforms = ( "__FreeBSD__", "PERL5", "NeXT",
            "EXPORT_VAR_AS_FUNCTION", "ZLIB", "OPENSSL_FIPS" );
-my @known_ossl_platforms = ( "VMS", "WIN16", "WIN32", "WINNT", "OS2" );
+my @known_ossl_platforms = ( "VMS", "WIN16", "WIN32", "WIN64", "WINNT", "OS2" );
 my @known_algorithms = ( "RC2", "RC4", "RC5", "IDEA", "DES", "BF",
             "CAST", "MD2", "MD4", "MD5", "SHA", "SHA0", "SHA1",
             "SHA256", "SHA512", "RIPEMD",
@@ -157,6 +158,7 @@
 foreach (@ARGV, split(/ /, $options))
    {
    $debug=1 if $_ eq "debug";
+   $W64=1 if $_ eq "64";
    $W32=1 if $_ eq "32";
    $W16=1 if $_ eq "16";
    if($_ eq "NT") {
@@ -264,7 +266,7 @@
 }

 # If no platform is given, assume WIN32
-if ($W32 + $W16 + $VMS + $OS2 == 0) {
+if ($W64 + $W32 + $W16 + $VMS + $OS2 == 0) {
    $W32 = 1;
 }

@@ -275,7 +277,7 @@

 if (!$do_ssl && !$do_crypto)
    {
-   print STDERR "usage: $0 ( ssl | crypto ) [ 16 | 32 | NT | OS2 ]\n";
+   print STDERR "usage: $0 ( ssl | crypto ) [ 16 | 32 | 64 | NT | OS2 ]\n";
    exit(1);
    }

@@ -1001,7 +1003,7 @@
    # Prune the returned symbols

         delete $syms{"bn_dump1"};
-   $platform{"BIO_s_log"} .= ",!WIN32,!WIN16,!macintosh";
+   $platform{"BIO_s_log"} .= ",!WIN64,!WIN32,!WIN16,!macintosh";

    $platform{"PEM_read_NS_CERT_SEQ"} = "VMS";
    $platform{"PEM_write_NS_CERT_SEQ"} = "VMS";
@@ -1153,6 +1155,7 @@
            if ($keyword eq "VMSVAX" && $VMSVAX) { return 1; }
            if ($keyword eq "VMSNonVAX" && $VMSNonVAX) { return 1; }
            if ($keyword eq "VMS" && $VMS) { return 1; }
+           if ($keyword eq "WIN64" && $W64) { return 1; }
            if ($keyword eq "WIN32" && $W32) { return 1; }
            if ($keyword eq "WIN16" && $W16) { return 1; }
            if ($keyword eq "WINNT" && $NT) { return 1; }
@@ -1161,7 +1164,7 @@
            # EXPORT_VAR_AS_FUNCTION means that global variables
            # will be represented as functions.  This currently
            # only happens on VMS-VAX.
-           if ($keyword eq "EXPORT_VAR_AS_FUNCTION" && ($VMSVAX || $W32 || $W16)) {
+           if ($keyword eq "EXPORT_VAR_AS_FUNCTION" && ($VMSVAX || $W64 || $W32 || $W16)) {
                return 1;
            }
            if ($keyword eq "OPENSSL_FIPS" && $fips) {
@@ -1304,7 +1307,9 @@
    my $what = "OpenSSL: implementation of Secure Socket Layer";
    my $description = "$what $version, $name - http://$http_vendor";

-   if ($W32)
+   if ($W64)
+       { $libname.="64"; }
+   elsif ($W32)
        { $libname.="32"; }
    elsif ($W16)
        { $libname.="16"; }
@@ -1372,9 +1377,9 @@
                }
                $prev = $s2;    # To warn about duplicates...
                if($v && !$OS2) {
-                   printf OUT "    %s%-39s @%-8d DATA\n",($W32)?"":"_",$s2,$n;
+                   printf OUT "    %s%-39s @%-8d DATA\n",($W32||$W64)?"":"_",$s2,$n;
                } else {
-                   printf OUT "    %s%-39s @%d\n",($W32||$OS2)?"":"_",$s2,$n;
+                   printf OUT "    %s%-39s @%d\n",($W32||$W64||$OS2)?"":"_",$s2,$n;
                }
            }
        }
--- util/pl/linux.pl    Mon Jan 19 14:26:32 1970
+++ util/pl/linux.pl    Mon Jan 19 14:26:32 1970
@@ -7,6 +7,9 @@
 $cp='/bin/cp';
 $rm='/bin/rm -f';

+$configuniquetag="linux";
+$confpreprocessorcondif="#if defined(__linux__) || defined(linux)";
+
 # C compiler stuff

 $cc='gcc';
--- util/pl/VC-32.pl    Mon Jan 19 14:26:32 1970
+++ util/pl/VC-32.pl    Mon Jan 19 14:26:32 1970
@@ -3,19 +3,6 @@
 # Win64 and WinCE [follow $FLAVOR variable to trace the differences].
 #

-$ssl=  "ssleay32";
-$crypto="libeay32";
-
-if ($fips && !$shlib)
-   {
-   $crypto="libeayfips32";
-   $crypto_compat = "libeaycompat32.lib";
-   }
-else
-   {
-   $crypto="libeay32";
-   }
-
 $o='\\';
 $cp='$(PERL) util/copy.pl';
 $mkdir='$(PERL) util/mkdir-p.pl';
@@ -44,6 +31,11 @@
     # per 0.9.8 release remaining warnings were explicitly examined and
     # considered safe to ignore.
     # 
+   
+   $suffix="64";
+   $configuniquetag="win64";
+   $confpreprocessorcondif="#if defined(_WIN64)";
+   
     $base_cflags= " $mf_cflag";
     my $f = $shlib || $fips ?' /MD':' /MT';
     $opt_cflags=$f.' /Ox';
@@ -68,6 +60,11 @@
     }
 elsif ($FLAVOR =~ /CE/)
     {
+   
+   $suffix="ce32";
+   $configuniquetag="ce32";
+   $confpreprocessorcondif="#if defined(_WIN32_WCE)"; 
+   
     # sanity check
     die '%OSVERSION% is not defined'   if (!defined($ENV{'OSVERSION'}));
     die '%PLATFORM% is not defined'    if (!defined($ENV{'PLATFORM'}));
@@ -129,6 +126,10 @@
     }
 else   # Win32
     {
+   $suffix="32";
+   $configuniquetag="win32";
+   $confpreprocessorcondif="#if defined(_WIN32) && !defined(_WIN64)";
+   
     $base_cflags= " $mf_cflag";
     my $f = $shlib || $fips ?' /MD':' /MT';
     $ff = "/fixed";
@@ -136,27 +137,49 @@
     $dbg_cflags=$f.'d /Od -DDEBUG -D_DEBUG';
     $lflags="/nologo /subsystem:console /opt:ref";
     }
+   
+$ssl=  "ssleay".$suffix;   $ssl.="dll" if ($shlib);    $ssl.="dbg" if ($debug);
+$crypto="libeay".$suffix;  $crypto.="dll"  if ($shlib);    $crypto.="dbg"  if ($debug);
+
+if ($fips && !$shlib)
+   {
+   $crypto="libeayfips".$suffix;   $crypto.="dbg"  if ($debug);
+   $crypto_compat = "libeaycompat".$suffix; $crypto_compat.="dbg"  if ($debug);  $crypto_compat.=".lib";
+   }
+   
+   
 $lib_cflag='/Zl' if (!$shlib); # remove /DEFAULTLIBs from static lib
 $mlflags='';

-$out_def ="out32"; $out_def.="dll"         if ($shlib);
+$out_def ="out".$suffix;   $out_def.="dll"         if ($shlib);    $out_def.="dbg" if ($debug);
            $out_def.='_$(TARGETCPU)'   if ($FLAVOR =~ /CE/);
-$tmp_def ="tmp32"; $tmp_def.="dll"         if ($shlib);
+$tmp_def ="tmp".$suffix;   $tmp_def.="dll"         if ($shlib);    $tmp_def.="dbg" if ($debug);
            $tmp_def.='_$(TARGETCPU)'   if ($FLAVOR =~ /CE/);
-$inc_def="inc32";
+$inc_def="inc".$suffix;
+
+# generate .pdb 
+$installpdb=1;
+$app_cflag.=" /Zi";
+$lib_cflag.=" /Zi"; 

 if ($debug)
    {
    $cflags=$dbg_cflags.$base_cflags;
+   
+   if ($FLAVOR !~ /WIN64/) 
+       {
+       $app_cflag.=" /ZI";
+       $lib_cflag.=" /ZI"; 
+       }
+   
    }
 else
    {
    $cflags=$opt_cflags.$base_cflags;
    }

-# generate symbols.pdb unconditionally
-$app_cflag.=" /Zi /Fd\$(TMP_D)/app";
-$lib_cflag.=" /Zi /Fd\$(TMP_D)/lib";
+$lib_cflag.= " /Fd\$(TMP_D)/lib".$suffix;  $lib_cflag.="dll"   if ($shlib);    $lib_cflag.="dbg"   if ($debug);
+$app_cflag.= " /Fd\$(TMP_D)/app".$suffix;  $app_cflag.="dll"   if ($shlib);    $app_cflag.="dbg"   if ($debug);
 $lflags.=" /debug";

 $obj='.obj';

Also for myself I setup a couple batch files for the configuration so I don't forget the prefix.

perl Configure VC-WIN32 --prefix=d:\lib\openssl

and

perl Configure VC-WIN64A --prefix=d:\lib\openssl

Also, for debug versions, instead of configure with debug-xxx you just use the two configs above and the patched do_win64a.bat and do_ms.bat/do_nasm.bat will also create a ntdebug.mak and ntddldebug.mak so you can just run nmake -f ms\ntdebug.mak. There were some last minute changes to not use /ZI on x64 to get rid of the warning (hope i didn't break something).

user3161924
  • 1,849
  • 18
  • 33
  • Keep in mind the header files will be different for WIN32 and WIN64. The differences arise in `` and ``. If you are building OpenSSL for development, then you will need to do something like described at [Build Multiarch OpenSSL on OS X](http://stackoverflow.com/q/25530429/608639). – jww Jul 06 '16 at 21:35
  • The patch above already handles opensslconf.h. I didn't find any difference in the bn.h across the win x64 and x86 nor in the linux build. The only change detected on the builds was the conf file. `Comparing files INC32\OPENSSL\bn.h and INC64\OPENSSL\BN.H FC: no differences encountered` – user3161924 Jul 08 '16 at 04:31