diff --git a/CHANGES b/CHANGES
index 3c45bc7f2b..18c984c5c2 100644
--- a/CHANGES
+++ b/CHANGES
@@ -3,6 +3,40 @@
 
  Changes between 0.9.6 and 0.9.7  [xx XXX 2000]
 
+  *) Introduce the possibility to access global variables through
+     functions on platform were that's the best way to handle exporting
+     global variables in shared libraries.  To enable this functionality,
+     one must configure with "EXPORT_VAR_AS_FN" or defined the C macro
+     "OPENSSL_EXPORT_VAR_AS_FUNCTION" in crypto/opensslconf.h (the latter
+     is normally done by Configure or something similar).
+
+     To implement a global variable, use the macro OPENSSL_IMPLEMENT_GLOBAL
+     in the source file (foo.c) like this:
+
+	OPENSSL_IMPLEMENT_GLOBAL(int,foo)=1;
+	OPENSSL_IMPLEMENT_GLOBAL(double,bar);
+
+     To declare a global variable, use the macros OPENSSL_DECLARE_GLOBAL
+     and OPENSSL_GLOBAL_REF in the header file (foo.h) like this:
+
+	OPENSSL_DECLARE_GLOBAL(int,foo);
+	#define foo OPENSSL_GLOBAL_REF(foo)
+	OPENSSL_DECLARE_GLOBAL(double,bar);
+	#define bar OPENSSL_GLOBAL_REF(bar)
+
+     The #defines are very important, and therefore so is including the
+     header file everywere where the defined globals are used.
+
+     The macro OPENSSL_EXPORT_VAR_AS_FUNCTION also affects the definition
+     of ASN.1 items, but that structure is a bt different.
+
+     The largest change is in util/mkdef.pl which has been enhanced with
+     better and easier to understand logic to choose which symbols should
+     go into the Windows .def files as well as a number of fixes and code
+     cleanup (among others, algorithm keywords are now sorted
+     lexicographically to avoid constant rewrites).
+     [Richard Levitte]
+
   *) In copy_email() check for >= 0 as a return value for
      X509_NAME_get_index_by_NID() since 0 is a valid index.
      [Steve Henson reported by Massimiliano Pala <madwolf@opensca.org>]
diff --git a/Configure b/Configure
index 5c69e89f0a..cd6afd8bab 100755
--- a/Configure
+++ b/Configure
@@ -968,6 +968,7 @@ my $rc4_chunk=0;
 my $bf_ptr=0;
 my @type=("char","short","int","long");
 my ($b64l,$b64,$b32,$b16,$b8)=(0,0,1,0,0);
+my $export_var_as_fn=0;
 
 my $des_int;
 
@@ -997,6 +998,7 @@ foreach (sort split(/\s+/,$bn_ops))
 	($b64l,$b64,$b32,$b16,$b8)=(0,0,1,0,0) if /THIRTY_TWO_BIT/;
 	($b64l,$b64,$b32,$b16,$b8)=(0,0,0,1,0) if /SIXTEEN_BIT/;
 	($b64l,$b64,$b32,$b16,$b8)=(0,0,0,0,1) if /EIGHT_BIT/;
+	$export_var_as_fn=1 if /EXPORT_VAR_AS_FN/;
 	}
 
 open(IN,'<crypto/opensslconf.h.in') || die "unable to read crypto/opensslconf.h.in:$!\n";
@@ -1029,6 +1031,11 @@ while (<IN>)
 	{
 	if	(/^#define\s+OPENSSLDIR/)
 		{ print OUT "#define OPENSSLDIR \"$openssldir\"\n"; }
+	elsif	(/^#((define)|(undef))\s+OPENSSL_EXPORT_VAR_AS_FUNCTION/)
+		{ printf OUT "#undef OPENSSL_EXPORT_VAR_AS_FUNCTION\n"
+			if $export_var_as_fn;
+		  printf OUT "#%s OPENSSL_EXPORT_VAR_AS_FUNCTION\n",
+			($export_var_as_fn)?"define":"undef"; }
 	elsif	(/^#define\s+OPENSSL_UNISTD/)
 		{
 		$unistd = "<unistd.h>" if $unistd eq "";
diff --git a/crypto/asn1/asn1.h b/crypto/asn1/asn1.h
index a3b992ff93..ae92ad9954 100644
--- a/crypto/asn1/asn1.h
+++ b/crypto/asn1/asn1.h
@@ -357,7 +357,7 @@ typedef struct ASN1_VALUE_st ASN1_VALUE;
  *
  */
 
-#ifndef ASN1_ITEM_FUNCTIONS
+#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
 
 /* ASN1_ITEM pointer exported type */
 typedef const ASN1_ITEM ASN1_ITEM_EXP;
diff --git a/crypto/asn1/asn1t.h b/crypto/asn1/asn1t.h
index 7d01df0674..6e1bf87e5c 100644
--- a/crypto/asn1/asn1t.h
+++ b/crypto/asn1/asn1t.h
@@ -74,7 +74,7 @@ extern "C" {
 #endif
 
 
-#ifndef ASN1_ITEM_FUNCTIONS
+#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
 
 /* Macro to obtain ASN1_ADB pointer from a type (only used internally) */
 #define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr))
@@ -287,7 +287,7 @@ extern "C" {
 
 /* Any defined by macros: the field used is in the table itself */
 
-#ifndef ASN1_ITEM_FUNCTIONS
+#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
 #define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) }
 #define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) }
 #else
@@ -358,7 +358,7 @@ extern "C" {
 #define ASN1_ADB(name) \
 	const static ASN1_ADB_TABLE name##_adbtbl[] 
 
-#ifndef ASN1_ITEM_FUNCTIONS
+#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
 
 #define ASN1_ADB_END(name, flags, field, app_table, def, none) \
 	;\
diff --git a/crypto/des/des.h b/crypto/des/des.h
index 5fa6aef27b..dc627189b4 100644
--- a/crypto/des/des.h
+++ b/crypto/des/des.h
@@ -116,8 +116,10 @@ typedef struct des_ks_struct
 #define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \
 	des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n))
 
-OPENSSL_EXTERN int des_check_key;	/* defaults to false */
-OPENSSL_EXTERN int des_rw_mode;		/* defaults to DES_PCBC_MODE */
+OPENSSL_DECLARE_GLOBAL(int,des_check_key);	/* defaults to false */
+#define des_check_key OPENSSL_GLOBAL_REF(des_check_key)
+OPENSSL_DECLARE_GLOBAL(int,des_rw_mode);	/* defaults to DES_PCBC_MODE */
+#define des_rw_mode OPENSSL_GLOBAL_REF(des_rw_mode)
 
 const char *des_options(void);
 void des_ecb3_encrypt(const_des_cblock *input, des_cblock *output,
diff --git a/crypto/des/enc_read.c b/crypto/des/enc_read.c
index af2d9177d2..e8a5763abf 100644
--- a/crypto/des/enc_read.c
+++ b/crypto/des/enc_read.c
@@ -63,7 +63,7 @@
 
 /* This has some uglies in it but it works - even over sockets. */
 /*extern int errno;*/
-OPENSSL_GLOBAL int des_rw_mode=DES_PCBC_MODE;
+OPENSSL_IMPLEMENT_GLOBAL(int,des_rw_mode)=DES_PCBC_MODE;
 
 
 /*
diff --git a/crypto/des/set_key.c b/crypto/des/set_key.c
index 6df3ba9a64..0dc79c9461 100644
--- a/crypto/des/set_key.c
+++ b/crypto/des/set_key.c
@@ -65,7 +65,7 @@
  */
 #include "des_locl.h"
 
-OPENSSL_GLOBAL int des_check_key=0;
+OPENSSL_IMPLEMENT_GLOBAL(int,des_check_key);	/* defaults to false */
 
 static const unsigned char odd_parity[256]={
   1,  1,  2,  2,  4,  4,  7,  7,  8,  8, 11, 11, 13, 13, 14, 14,
diff --git a/crypto/opensslconf.h.in b/crypto/opensslconf.h.in
index 5da5911228..a06861b96e 100644
--- a/crypto/opensslconf.h.in
+++ b/crypto/opensslconf.h.in
@@ -12,6 +12,8 @@
 #undef OPENSSL_UNISTD
 #define OPENSSL_UNISTD <unistd.h>
 
+#undef OPENSSL_EXPORT_VAR_AS_FUNCTIONS
+
 #if defined(HEADER_IDEA_H) && !defined(IDEA_INT)
 #define IDEA_INT unsigned int
 #endif
diff --git a/e_os2.h b/e_os2.h
index be20eac623..f279fa1d93 100644
--- a/e_os2.h
+++ b/e_os2.h
@@ -200,6 +200,28 @@ extern "C" {
 #endif
 #define OPENSSL_EXTERN OPENSSL_IMPORT
 
+/* Macros to allow global variables to be reached through function calls when
+   required (if a shared library version requvres it, for example.
+   The way it's done allows definitions like this:
+
+	// in foobar.c
+	OPENSSL_IMPLEMENT_GLOBAL(int,foobar) = 0;
+	// in foobar.h
+	OPENSSL_DECLARE_GLOBAL(int,foobar);
+	#define foobar OPENSSL_GLOBAL_REF(foobar)
+*/
+#ifdef OPENSSL_EXPORT_VAR_AS_FUNCTION
+# define OPENSSL_IMPLEMENT_GLOBAL(type,name) extern static type _hide_##name; \
+        type *_shadow_##name(void) { static type local_var; return &local_var; } \
+        static type _hide_##name
+# define OPENSSL_DECLARE_GLOBAL(type,name) type *_shadow_##name(void)
+# define OPENSSL_GLOBAL_REF(name) (*(_shadow_##name()))
+#else
+# define OPENSSL_IMPLEMENT_GLOBAL(type,name) OPENSSL_GLOBAL type _shadow_##name
+# define OPENSSL_DECLARE_GLOBAL(type,name) OPENSSL_EXPORT type _shadow_##name
+# define OPENSSL_GLOBAL_REF(name) _shadow_##name
+#endif
+
 #ifdef  __cplusplus
 }
 #endif
diff --git a/makevms.com b/makevms.com
index 194e485732..579fcae5a3 100755
--- a/makevms.com
+++ b/makevms.com
@@ -285,6 +285,8 @@ $   WRITE H_FILE "#undef THIRTY_TWO_BIT"
 $   WRITE H_FILE "#undef SIXTEEN_BIT"
 $   WRITE H_FILE "#undef EIGHT_BIT"
 $   WRITE H_FILE "#endif"
+$
+$   WRITE H_FILE "#undef OPENSSL_EXPORT_VAR_AS_FUNCTION"
 $!
 $!  Else...
 $!
@@ -317,6 +319,9 @@ $   WRITE H_FILE "#define THIRTY_TWO_BIT"
 $   WRITE H_FILE "#undef SIXTEEN_BIT"
 $   WRITE H_FILE "#undef EIGHT_BIT"
 $   WRITE H_FILE "#endif"
+$
+$   WRITE H_FILE "#undef OPENSSL_EXPORT_VAR_AS_FUNCTION"
+$   WRITE H_FILE "#define OPENSSL_EXPORT_VAR_AS_FUNCTION"
 $!
 $!  End
 $!
diff --git a/util/libeay.num b/util/libeay.num
index 6c76287f5f..92de2a8f5f 100755
--- a/util/libeay.num
+++ b/util/libeay.num
@@ -203,13 +203,13 @@ DSA_generate_key                        210	EXIST::FUNCTION:DSA
 DSA_generate_parameters                 211	EXIST::FUNCTION:DSA
 DSA_is_prime                            212	NOEXIST::FUNCTION:
 DSA_new                                 213	EXIST::FUNCTION:DSA
-DSA_print                               214	EXIST::FUNCTION:DSA,BIO
+DSA_print                               214	EXIST::FUNCTION:BIO,DSA
 DSA_print_fp                            215	EXIST::FUNCTION:DSA,FP_API
 DSA_sign                                216	EXIST::FUNCTION:DSA
 DSA_sign_setup                          217	EXIST::FUNCTION:DSA
 DSA_size                                218	EXIST::FUNCTION:DSA
 DSA_verify                              219	EXIST::FUNCTION:DSA
-DSAparams_print                         220	EXIST::FUNCTION:DSA,BIO
+DSAparams_print                         220	EXIST::FUNCTION:BIO,DSA
 DSAparams_print_fp                      221	EXIST::FUNCTION:DSA,FP_API
 ERR_clear_error                         222	EXIST::FUNCTION:
 ERR_error_string                        223	EXIST::FUNCTION:
@@ -478,7 +478,7 @@ RSA_generate_key                        485	EXIST::FUNCTION:RSA
 RSA_new                                 486	EXIST::FUNCTION:RSA
 RSA_new_method                          487	EXIST::FUNCTION:RSA
 RSA_print                               488	EXIST::FUNCTION:BIO,RSA
-RSA_print_fp                            489	EXIST::FUNCTION:RSA,FP_API
+RSA_print_fp                            489	EXIST::FUNCTION:FP_API,RSA
 RSA_private_decrypt                     490	EXIST::FUNCTION:RSA
 RSA_private_encrypt                     491	EXIST::FUNCTION:RSA
 RSA_public_decrypt                      492	EXIST::FUNCTION:RSA
@@ -489,14 +489,14 @@ RSA_sign_ASN1_OCTET_STRING              496	EXIST::FUNCTION:RSA
 RSA_size                                497	EXIST::FUNCTION:RSA
 RSA_verify                              498	EXIST::FUNCTION:RSA
 RSA_verify_ASN1_OCTET_STRING            499	EXIST::FUNCTION:RSA
-SHA                                     500	EXIST::FUNCTION:SHA0,SHA
+SHA                                     500	EXIST::FUNCTION:SHA,SHA0
 SHA1                                    501	EXIST::FUNCTION:SHA,SHA1
 SHA1_Final                              502	EXIST::FUNCTION:SHA,SHA1
 SHA1_Init                               503	EXIST::FUNCTION:SHA,SHA1
 SHA1_Update                             504	EXIST::FUNCTION:SHA,SHA1
-SHA_Final                               505	EXIST::FUNCTION:SHA0,SHA
-SHA_Init                                506	EXIST::FUNCTION:SHA0,SHA
-SHA_Update                              507	EXIST::FUNCTION:SHA0,SHA
+SHA_Final                               505	EXIST::FUNCTION:SHA,SHA0
+SHA_Init                                506	EXIST::FUNCTION:SHA,SHA0
+SHA_Update                              507	EXIST::FUNCTION:SHA,SHA0
 OpenSSL_add_all_algorithms              508	EXIST::FUNCTION:
 OpenSSL_add_all_ciphers                 509	EXIST::FUNCTION:
 OpenSSL_add_all_digests                 510	EXIST::FUNCTION:
@@ -719,7 +719,7 @@ d2i_ASN1_bytes                          725	EXIST::FUNCTION:
 d2i_ASN1_type_bytes                     726	EXIST::FUNCTION:
 d2i_DHparams                            727	EXIST::FUNCTION:DH
 d2i_DSAPrivateKey                       728	EXIST::FUNCTION:DSA
-d2i_DSAPrivateKey_bio                   729	EXIST::FUNCTION:DSA,BIO
+d2i_DSAPrivateKey_bio                   729	EXIST::FUNCTION:BIO,DSA
 d2i_DSAPrivateKey_fp                    730	EXIST::FUNCTION:DSA,FP_API
 d2i_DSAPublicKey                        731	EXIST::FUNCTION:DSA
 d2i_DSAparams                           732	EXIST::FUNCTION:DSA
@@ -742,7 +742,7 @@ d2i_PrivateKey                          748	EXIST::FUNCTION:
 d2i_PublicKey                           749	EXIST::FUNCTION:
 d2i_RSAPrivateKey                       750	EXIST::FUNCTION:RSA
 d2i_RSAPrivateKey_bio                   751	EXIST::FUNCTION:BIO,RSA
-d2i_RSAPrivateKey_fp                    752	EXIST::FUNCTION:RSA,FP_API
+d2i_RSAPrivateKey_fp                    752	EXIST::FUNCTION:FP_API,RSA
 d2i_RSAPublicKey                        753	EXIST::FUNCTION:RSA
 d2i_X509                                754	EXIST::FUNCTION:
 d2i_X509_ALGOR                          755	EXIST::FUNCTION:
@@ -821,7 +821,7 @@ i2d_ASN1_UTCTIME                        828	EXIST::FUNCTION:
 i2d_ASN1_bytes                          829	EXIST::FUNCTION:
 i2d_DHparams                            830	EXIST::FUNCTION:DH
 i2d_DSAPrivateKey                       831	EXIST::FUNCTION:DSA
-i2d_DSAPrivateKey_bio                   832	EXIST::FUNCTION:DSA,BIO
+i2d_DSAPrivateKey_bio                   832	EXIST::FUNCTION:BIO,DSA
 i2d_DSAPrivateKey_fp                    833	EXIST::FUNCTION:DSA,FP_API
 i2d_DSAPublicKey                        834	EXIST::FUNCTION:DSA
 i2d_DSAparams                           835	EXIST::FUNCTION:DSA
@@ -844,7 +844,7 @@ i2d_PrivateKey                          851	EXIST::FUNCTION:
 i2d_PublicKey                           852	EXIST::FUNCTION:
 i2d_RSAPrivateKey                       853	EXIST::FUNCTION:RSA
 i2d_RSAPrivateKey_bio                   854	EXIST::FUNCTION:BIO,RSA
-i2d_RSAPrivateKey_fp                    855	EXIST::FUNCTION:RSA,FP_API
+i2d_RSAPrivateKey_fp                    855	EXIST::FUNCTION:FP_API,RSA
 i2d_RSAPublicKey                        856	EXIST::FUNCTION:RSA
 i2d_X509                                857	EXIST::FUNCTION:
 i2d_X509_ALGOR                          858	EXIST::FUNCTION:
@@ -933,8 +933,8 @@ d2i_RSAPublicKey_bio                    945	EXIST::FUNCTION:BIO,RSA
 i2d_RSAPublicKey_bio                    946	EXIST::FUNCTION:BIO,RSA
 PEM_read_RSAPublicKey                   947	EXIST:!WIN16:FUNCTION:RSA
 PEM_write_RSAPublicKey                  949	EXIST:!WIN16:FUNCTION:RSA
-d2i_RSAPublicKey_fp                     952	EXIST::FUNCTION:RSA,FP_API
-i2d_RSAPublicKey_fp                     954	EXIST::FUNCTION:RSA,FP_API
+d2i_RSAPublicKey_fp                     952	EXIST::FUNCTION:FP_API,RSA
+i2d_RSAPublicKey_fp                     954	EXIST::FUNCTION:FP_API,RSA
 BIO_copy_next_retry                     955	EXIST::FUNCTION:
 RSA_flags                               956	EXIST::FUNCTION:RSA
 X509_STORE_add_crl                      957	EXIST::FUNCTION:
@@ -989,7 +989,7 @@ ERR_load_CRYPTOlib_strings              1009	EXIST:WIN16,VMS:FUNCTION:
 EVP_PKEY_bits                           1010	EXIST::FUNCTION:
 MD5_Transform                           1011	EXIST::FUNCTION:MD5
 SHA1_Transform                          1012	EXIST::FUNCTION:SHA,SHA1
-SHA_Transform                           1013	EXIST::FUNCTION:SHA0,SHA
+SHA_Transform                           1013	EXIST::FUNCTION:SHA,SHA0
 X509_STORE_CTX_get_chain                1014	EXIST::FUNCTION:
 X509_STORE_CTX_get_current_cert         1015	EXIST::FUNCTION:
 X509_STORE_CTX_get_error                1016	EXIST::FUNCTION:
@@ -1216,7 +1216,7 @@ name_cmp                                1239	EXIST::FUNCTION:
 str_dup                                 1240	NOEXIST::FUNCTION:
 i2s_ASN1_ENUMERATED                     1241	EXIST::FUNCTION:
 i2s_ASN1_ENUMERATED_TABLE               1242	EXIST::FUNCTION:
-BIO_s_log                               1243	EXIST:!WIN32,!WIN16,!macintosh:FUNCTION:
+BIO_s_log                               1243	EXIST:!WIN16,!WIN32,!macintosh:FUNCTION:
 BIO_f_reliable                          1244	EXIST::FUNCTION:BIO
 PKCS7_dataFinal                         1245	EXIST::FUNCTION:
 PKCS7_dataDecode                        1246	EXIST::FUNCTION:
@@ -1468,7 +1468,7 @@ RSA_get_method                          1847	EXIST::FUNCTION:RSA
 RSA_get_default_method                  1848	NOEXIST::FUNCTION:
 RSA_check_key                           1869	EXIST::FUNCTION:RSA
 OBJ_obj2txt                             1870	EXIST::FUNCTION:
-DSA_dup_DH                              1871	EXIST::FUNCTION:DSA,DH
+DSA_dup_DH                              1871	EXIST::FUNCTION:DH,DSA
 X509_REQ_get_extensions                 1872	EXIST::FUNCTION:
 X509_REQ_set_extension_nids             1873	EXIST::FUNCTION:
 BIO_nwrite                              1874	EXIST::FUNCTION:
@@ -1543,7 +1543,7 @@ ASN1_STRING_set_default_mask_asc        1960	EXIST:!VMS:FUNCTION:
 ASN1_STRING_set_def_mask_asc            1960	EXIST:VMS:FUNCTION:
 PEM_write_bio_RSA_PUBKEY                1961	EXIST::FUNCTION:RSA
 ASN1_INTEGER_cmp                        1963	EXIST::FUNCTION:
-d2i_RSA_PUBKEY_fp                       1964	EXIST::FUNCTION:RSA,FP_API
+d2i_RSA_PUBKEY_fp                       1964	EXIST::FUNCTION:FP_API,RSA
 X509_trust_set_bit_asc                  1967	NOEXIST::FUNCTION:
 PEM_write_bio_DSA_PUBKEY                1968	EXIST::FUNCTION:DSA
 X509_STORE_CTX_free                     1969	EXIST::FUNCTION:
@@ -1576,7 +1576,7 @@ X509_NAME_add_entry_by_OBJ              2008	EXIST::FUNCTION:
 X509_CRL_get_ext_d2i                    2009	EXIST::FUNCTION:
 X509_PURPOSE_get0_name                  2011	EXIST::FUNCTION:
 PEM_read_PUBKEY                         2012	EXIST:!WIN16:FUNCTION:
-i2d_DSA_PUBKEY_bio                      2014	EXIST::FUNCTION:DSA,BIO
+i2d_DSA_PUBKEY_bio                      2014	EXIST::FUNCTION:BIO,DSA
 i2d_OTHERNAME                           2015	EXIST::FUNCTION:
 ASN1_OCTET_STRING_free                  2016	EXIST::FUNCTION:
 ASN1_BIT_STRING_set_asc                 2017	EXIST::FUNCTION:
@@ -1634,7 +1634,7 @@ PEM_read_bio_DSA_PUBKEY                 2088	EXIST::FUNCTION:DSA
 X509_PURPOSE_add                        2090	EXIST::FUNCTION:
 ASN1_STRING_TABLE_get                   2091	EXIST::FUNCTION:
 ASN1_UTF8STRING_free                    2092	EXIST::FUNCTION:
-d2i_DSA_PUBKEY_bio                      2093	EXIST::FUNCTION:DSA,BIO
+d2i_DSA_PUBKEY_bio                      2093	EXIST::FUNCTION:BIO,DSA
 PEM_write_RSA_PUBKEY                    2095	EXIST:!WIN16:FUNCTION:RSA
 d2i_OTHERNAME                           2096	EXIST::FUNCTION:
 X509_reject_set_bit                     2098	NOEXIST::FUNCTION:
@@ -1646,7 +1646,7 @@ ASN1_BIT_STRING_set                     2109	EXIST::FUNCTION:
 X509_TRUST_get_count                    2110	EXIST::FUNCTION:
 ASN1_INTEGER_free                       2111	EXIST::FUNCTION:
 OTHERNAME_free                          2112	EXIST::FUNCTION:
-i2d_RSA_PUBKEY_fp                       2113	EXIST::FUNCTION:RSA,FP_API
+i2d_RSA_PUBKEY_fp                       2113	EXIST::FUNCTION:FP_API,RSA
 ASN1_INTEGER_dup                        2114	EXIST::FUNCTION:
 d2i_X509_CERT_AUX                       2115	EXIST::FUNCTION:
 PEM_write_bio_PUBKEY                    2117	EXIST::FUNCTION:
@@ -1871,8 +1871,10 @@ X509_time_adj                           2453	EXIST::FUNCTION:
 X509_check_issued                       2454	EXIST::FUNCTION:
 ASN1_UTCTIME_cmp_time_t                 2455	EXIST::FUNCTION:
 des_set_weak_key_flag                   2456	NOEXIST::FUNCTION:
-des_check_key                           2457	EXIST::VARIABLE:DES
-des_rw_mode                             2458	EXIST::VARIABLE:DES
+_shadow_des_check_key                   2457	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:DES
+_shadow_des_check_key                   2457	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:DES
+_shadow_des_rw_mode                     2458	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:DES
+_shadow_des_rw_mode                     2458	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:DES
 RSA_PKCS1_RSAref                        2459	NOEXIST::FUNCTION:
 X509_keyid_set1                         2460	EXIST::FUNCTION:
 BIO_next                                2461	EXIST::FUNCTION:
@@ -2077,95 +2079,141 @@ BN_mod_lshift1_quick                    2656	EXIST::FUNCTION:
 BN_mod_lshift_quick                     2657	EXIST::FUNCTION:
 BN_mod_add_quick                        2658	EXIST::FUNCTION:
 BN_mod_sub                              2659	EXIST::FUNCTION:
-ASN1_UTF8STRING_it                      2660	EXIST::VARIABLE:
+ASN1_UTF8STRING_it                      2660	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_UTF8STRING_it                      2660	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 ASN1_item_ex_i2d                        2661	EXIST::FUNCTION:
 X509V3_add1_i2d                         2662	EXIST::FUNCTION:
-PKCS7_ENVELOPE_it                       2663	EXIST::VARIABLE:
+PKCS7_ENVELOPE_it                       2663	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_ENVELOPE_it                       2663	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_ONEREQ_get1_ext_d2i                2664	EXIST::FUNCTION:
-PBKDF2PARAM_it                          2665	EXIST::VARIABLE:
+PBKDF2PARAM_it                          2665	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PBKDF2PARAM_it                          2665	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 EXTENDED_KEY_USAGE_new                  2666	EXIST::FUNCTION:
 OCSP_BASICRESP_delete_ext               2667	EXIST::FUNCTION:
-X509_CRL_it                             2668	EXIST::VARIABLE:
+X509_CRL_it                             2668	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_CRL_it                             2668	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_BASICRESP_add_ext                  2669	EXIST::FUNCTION:
 OCSP_REQUEST_get_ext_by_OBJ             2670	EXIST::FUNCTION:
-ASN1_T61STRING_it                       2671	EXIST::VARIABLE:
+ASN1_T61STRING_it                       2671	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_T61STRING_it                       2671	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_BASICRESP_get_ext_by_OBJ           2672	EXIST::FUNCTION:
 OCSP_SINGLERESP_get_ext_count           2673	EXIST::FUNCTION:
 asn1_do_adb                             2674	EXIST::FUNCTION:
 ASN1_template_i2d                       2675	EXIST::FUNCTION:
-GENERAL_NAME_it                         2676	EXIST::VARIABLE:
-ASN1_GENERALIZEDTIME_it                 2677	EXIST::VARIABLE:
-SXNET_it                                2678	EXIST::VARIABLE:
-POLICYQUALINFO_it                       2679	EXIST::VARIABLE:
+GENERAL_NAME_it                         2676	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+GENERAL_NAME_it                         2676	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+ASN1_GENERALIZEDTIME_it                 2677	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_GENERALIZEDTIME_it                 2677	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+SXNET_it                                2678	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+SXNET_it                                2678	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+POLICYQUALINFO_it                       2679	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+POLICYQUALINFO_it                       2679	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 ASN1_item_free                          2680	EXIST::FUNCTION:
-AUTHORITY_KEYID_it                      2681	EXIST::VARIABLE:
+AUTHORITY_KEYID_it                      2681	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+AUTHORITY_KEYID_it                      2681	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 EXTENDED_KEY_USAGE_free                 2682	EXIST::FUNCTION:
 OCSP_REQUEST_get_ext                    2683	EXIST::FUNCTION:
 ENGINE_load_ubsec                       2684	EXIST::FUNCTION:
-PKEY_USAGE_PERIOD_it                    2685	EXIST::VARIABLE:
-NETSCAPE_SPKAC_it                       2686	EXIST::VARIABLE:
-X509_REVOKED_it                         2687	EXIST::VARIABLE:
+PKEY_USAGE_PERIOD_it                    2685	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKEY_USAGE_PERIOD_it                    2685	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+NETSCAPE_SPKAC_it                       2686	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+NETSCAPE_SPKAC_it                       2686	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+X509_REVOKED_it                         2687	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_REVOKED_it                         2687	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_BASICRESP_get_ext_by_critical      2688	EXIST:!VMS:FUNCTION:
 OCSP_BASICRESP_get_ext_by_crit          2688	EXIST:VMS:FUNCTION:
-PKCS12_it                               2689	EXIST::VARIABLE:
+PKCS12_it                               2689	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS12_it                               2689	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_SINGLERESP_get_ext_by_critical     2690	EXIST:!VMS:FUNCTION:
 OCSP_SINGLERESP_get_ext_by_crit         2690	EXIST:VMS:FUNCTION:
 ASN1_item_i2d                           2691	EXIST::FUNCTION:
 asn1_ex_i2c                             2692	EXIST::FUNCTION:
-X509_EXTENSION_it                       2693	EXIST::VARIABLE:
-SXNETID_it                              2694	EXIST::VARIABLE:
+X509_EXTENSION_it                       2693	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_EXTENSION_it                       2693	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+SXNETID_it                              2694	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+SXNETID_it                              2694	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 EDIPARTYNAME_new                        2695	EXIST::FUNCTION:
 d2i_EXTENDED_KEY_USAGE                  2696	EXIST::FUNCTION:
-X509_PUBKEY_it                          2697	EXIST::VARIABLE:
-PKCS7_ENCRYPT_it                        2698	EXIST::VARIABLE:
+X509_PUBKEY_it                          2697	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_PUBKEY_it                          2697	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS7_ENCRYPT_it                        2698	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_ENCRYPT_it                        2698	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 X509_add1_ext_i2d                       2699	EXIST::FUNCTION:
-PKCS7_SIGNER_INFO_it                    2700	EXIST::VARIABLE:
-PKCS12_SAFEBAG_it                       2701	EXIST::VARIABLE:
+PKCS7_SIGNER_INFO_it                    2700	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_SIGNER_INFO_it                    2700	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS12_SAFEBAG_it                       2701	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS12_SAFEBAG_it                       2701	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 X509_signature_print                    2702	EXIST::FUNCTION:EVP
 OCSP_REQUEST_add_ext                    2703	EXIST::FUNCTION:
-X509_ALGOR_it                           2704	EXIST::VARIABLE:
-ASN1_TIME_it                            2705	EXIST::VARIABLE:
+X509_ALGOR_it                           2704	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_ALGOR_it                           2704	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+ASN1_TIME_it                            2705	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_TIME_it                            2705	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_ONEREQ_get_ext_count               2706	EXIST::FUNCTION:
-ASN1_IA5STRING_it                       2707	EXIST::VARIABLE:
-X509_CERT_AUX_it                        2708	EXIST::VARIABLE:
-CERTIFICATEPOLICIES_it                  2709	EXIST::VARIABLE:
+ASN1_IA5STRING_it                       2707	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_IA5STRING_it                       2707	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+X509_CERT_AUX_it                        2708	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_CERT_AUX_it                        2708	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+CERTIFICATEPOLICIES_it                  2709	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+CERTIFICATEPOLICIES_it                  2709	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 BN_bntest_rand                          2710	EXIST::FUNCTION:
-X509_ATTRIBUTE_it                       2711	EXIST::VARIABLE:
+X509_ATTRIBUTE_it                       2711	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_ATTRIBUTE_it                       2711	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_ONEREQ_get_ext_by_NID              2712	EXIST::FUNCTION:
-OCSP_SERVICELOC_it                      2713	EXIST::VARIABLE:
-ACCESS_DESCRIPTION_it                   2714	EXIST::VARIABLE:
-PKCS7_ISSUER_AND_SERIAL_it              2715	EXIST::VARIABLE:
-PBE2PARAM_it                            2716	EXIST::VARIABLE:
-PKCS7_SIGNED_it                         2717	EXIST::VARIABLE:
-X509_it                                 2718	EXIST::VARIABLE:
-ASN1_BMPSTRING_it                       2719	EXIST::VARIABLE:
+OCSP_SERVICELOC_it                      2713	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_SERVICELOC_it                      2713	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+ACCESS_DESCRIPTION_it                   2714	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ACCESS_DESCRIPTION_it                   2714	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS7_ISSUER_AND_SERIAL_it              2715	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_ISSUER_AND_SERIAL_it              2715	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PBE2PARAM_it                            2716	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PBE2PARAM_it                            2716	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS7_SIGNED_it                         2717	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_SIGNED_it                         2717	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+X509_it                                 2718	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_it                                 2718	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+ASN1_BMPSTRING_it                       2719	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_BMPSTRING_it                       2719	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 ASN1_tag2bit                            2720	EXIST::FUNCTION:
 OCSP_REQUEST_delete_ext                 2721	EXIST::FUNCTION:
-ASN1_PRINTABLESTRING_it                 2722	EXIST::VARIABLE:
+ASN1_PRINTABLESTRING_it                 2722	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_PRINTABLESTRING_it                 2722	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 BN_mod_sqr                              2723	EXIST::FUNCTION:
-NETSCAPE_CERT_SEQUENCE_it               2724	EXIST::VARIABLE:
-GENERAL_NAMES_it                        2725	EXIST::VARIABLE:
-AUTHORITY_INFO_ACCESS_it                2726	EXIST::VARIABLE:
-X509_CINF_it                            2727	EXIST::VARIABLE:
+NETSCAPE_CERT_SEQUENCE_it               2724	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+NETSCAPE_CERT_SEQUENCE_it               2724	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+GENERAL_NAMES_it                        2725	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+GENERAL_NAMES_it                        2725	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+AUTHORITY_INFO_ACCESS_it                2726	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+AUTHORITY_INFO_ACCESS_it                2726	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+X509_CINF_it                            2727	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_CINF_it                            2727	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 d2i_EDIPARTYNAME                        2728	EXIST::FUNCTION:
-OTHERNAME_it                            2729	EXIST::VARIABLE:
+OTHERNAME_it                            2729	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OTHERNAME_it                            2729	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_SINGLERESP_get_ext_by_NID          2730	EXIST::FUNCTION:
 OCSP_REQUEST_add1_ext_i2d               2731	EXIST::FUNCTION:
-X509_VAL_it                             2732	EXIST::VARIABLE:
+X509_VAL_it                             2732	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_VAL_it                             2732	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 X509_CRL_add1_ext_i2d                   2733	EXIST::FUNCTION:
 OCSP_BASICRESP_add1_ext_i2d             2734	EXIST::FUNCTION:
-X509_SIG_it                             2735	EXIST::VARIABLE:
+X509_SIG_it                             2735	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_SIG_it                             2735	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_ONEREQ_get_ext                     2736	EXIST::FUNCTION:
 OCSP_ONEREQ_get_ext_by_OBJ              2737	EXIST::FUNCTION:
 ASN1_primitive_new                      2738	EXIST::FUNCTION:
-ASN1_VISIBLESTRING_it                   2739	EXIST::VARIABLE:
+ASN1_VISIBLESTRING_it                   2739	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_VISIBLESTRING_it                   2739	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_SINGLERESP_add1_ext_i2d            2740	EXIST::FUNCTION:
-CRL_DIST_POINTS_it                      2741	EXIST::VARIABLE:
+CRL_DIST_POINTS_it                      2741	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+CRL_DIST_POINTS_it                      2741	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 GENERAL_NAME_print                      2742	EXIST::FUNCTION:
 OCSP_SINGLERESP_delete_ext              2743	EXIST::FUNCTION:
-ASN1_BIT_STRING_it                      2744	EXIST::VARIABLE:
-X509_REQ_it                             2745	EXIST::VARIABLE:
-PKCS7_SIGN_ENVELOPE_it                  2746	EXIST::VARIABLE:
+ASN1_BIT_STRING_it                      2744	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_BIT_STRING_it                      2744	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+X509_REQ_it                             2745	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_REQ_it                             2745	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS7_SIGN_ENVELOPE_it                  2746	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_SIGN_ENVELOPE_it                  2746	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 EDIPARTYNAME_free                       2747	EXIST::FUNCTION:
 OCSP_REQUEST_get1_ext_d2i               2748	EXIST::FUNCTION:
 asn1_ex_c2i                             2749	EXIST::FUNCTION:
@@ -2173,68 +2221,98 @@ asn1_enc_restore                        2750	EXIST::FUNCTION:
 OCSP_SINGLERESP_get_ext                 2751	EXIST::FUNCTION:
 OCSP_BASICRESP_get1_ext_d2i             2752	EXIST::FUNCTION:
 i2d_EDIPARTYNAME                        2753	EXIST::FUNCTION:
-ASN1_INTEGER_it                         2754	EXIST::VARIABLE:
+ASN1_INTEGER_it                         2754	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_INTEGER_it                         2754	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_ONEREQ_get_ext_by_critical         2755	EXIST::FUNCTION:
-BASIC_CONSTRAINTS_it                    2756	EXIST::VARIABLE:
+BASIC_CONSTRAINTS_it                    2756	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+BASIC_CONSTRAINTS_it                    2756	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_SINGLERESP_get1_ext_d2i            2757	EXIST::FUNCTION:
-X509_NAME_ENTRY_it                      2758	EXIST::VARIABLE:
+X509_NAME_ENTRY_it                      2758	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_NAME_ENTRY_it                      2758	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_ONEREQ_add_ext                     2759	EXIST::FUNCTION:
-DIST_POINT_it                           2760	EXIST::VARIABLE:
-OCSP_SINGLERESP_it                      2761	EXIST::VARIABLE:
+DIST_POINT_it                           2760	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+DIST_POINT_it                           2760	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_SINGLERESP_it                      2761	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_SINGLERESP_it                      2761	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 ASN1_item_ex_d2i                        2762	EXIST::FUNCTION:
 BN_mod_sqrt                             2763	EXIST::FUNCTION:
 OCSP_SINGLERESP_get_ext_by_OBJ          2764	EXIST::FUNCTION:
-PKCS12_BAGS_it                          2765	EXIST::VARIABLE:
+PKCS12_BAGS_it                          2765	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS12_BAGS_it                          2765	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 ASN1_template_free                      2766	EXIST::FUNCTION:
 OCSP_SINGLERESP_add_ext                 2767	EXIST::FUNCTION:
 ASN1_template_d2i                       2768	EXIST::FUNCTION:
-POLICYINFO_it                           2769	EXIST::VARIABLE:
+POLICYINFO_it                           2769	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+POLICYINFO_it                           2769	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 asn1_enc_free                           2770	EXIST::FUNCTION:
-PKCS8_PRIV_KEY_INFO_it                  2771	EXIST::VARIABLE:
-OCSP_REQINFO_it                         2772	EXIST::VARIABLE:
-PBEPARAM_it                             2773	EXIST::VARIABLE:
+PKCS8_PRIV_KEY_INFO_it                  2771	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS8_PRIV_KEY_INFO_it                  2771	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_REQINFO_it                         2772	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_REQINFO_it                         2772	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PBEPARAM_it                             2773	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PBEPARAM_it                             2773	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 X509_CRL_add0_revoked                   2774	EXIST::FUNCTION:
-EDIPARTYNAME_it                         2775	EXIST::VARIABLE:
-NETSCAPE_SPKI_it                        2776	EXIST::VARIABLE:
+EDIPARTYNAME_it                         2775	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+EDIPARTYNAME_it                         2775	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+NETSCAPE_SPKI_it                        2776	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+NETSCAPE_SPKI_it                        2776	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 BN_kronecker                            2777	EXIST::FUNCTION:
-ASN1_ENUMERATED_it                      2778	EXIST::VARIABLE:
+ASN1_ENUMERATED_it                      2778	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_ENUMERATED_it                      2778	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_BASICRESP_get_ext_count            2779	EXIST::FUNCTION:
-ASN1_UTCTIME_it                         2780	EXIST::VARIABLE:
-NOTICEREF_it                            2781	EXIST::VARIABLE:
-ASN1_ANY_it                             2782	EXIST::VARIABLE:
+ASN1_UTCTIME_it                         2780	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_UTCTIME_it                         2780	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+NOTICEREF_it                            2781	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+NOTICEREF_it                            2781	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+ASN1_ANY_it                             2782	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_ANY_it                             2782	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 asn1_enc_init                           2783	EXIST::FUNCTION:
 ASN1_item_d2i                           2784	EXIST::FUNCTION:
 ASN1_primitive_free                     2785	EXIST::FUNCTION:
 i2d_EXTENDED_KEY_USAGE                  2786	EXIST::FUNCTION:
 asn1_enc_save                           2787	EXIST::FUNCTION:
-PKCS12_MAC_DATA_it                      2788	EXIST::VARIABLE:
+PKCS12_MAC_DATA_it                      2788	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS12_MAC_DATA_it                      2788	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 asn1_do_lock                            2789	EXIST::FUNCTION:
 ASN1_item_ex_new                        2790	EXIST::FUNCTION:
 asn1_get_choice_selector                2791	EXIST::FUNCTION:
 OCSP_REQUEST_get_ext_by_NID             2792	EXIST::FUNCTION:
 OCSP_BASICRESP_get_ext_by_NID           2793	EXIST::FUNCTION:
-DIST_POINT_NAME_it                      2794	EXIST::VARIABLE:
+DIST_POINT_NAME_it                      2794	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+DIST_POINT_NAME_it                      2794	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 X509V3_extensions_print                 2795	EXIST::FUNCTION:
 X509_REVOKED_add1_ext_i2d               2796	EXIST::FUNCTION:
-ASN1_OCTET_STRING_it                    2797	EXIST::VARIABLE:
+ASN1_OCTET_STRING_it                    2797	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_OCTET_STRING_it                    2797	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 ASN1_template_new                       2798	EXIST::FUNCTION:
-PKCS7_RECIP_INFO_it                     2799	EXIST::VARIABLE:
-EXTENDED_KEY_USAGE_it                   2800	EXIST::VARIABLE:
-X509_CRL_INFO_it                        2801	EXIST::VARIABLE:
-PKCS7_DIGEST_it                         2802	EXIST::VARIABLE:
-PKCS7_ENC_CONTENT_it                    2803	EXIST::VARIABLE:
+PKCS7_RECIP_INFO_it                     2799	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_RECIP_INFO_it                     2799	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+EXTENDED_KEY_USAGE_it                   2800	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+EXTENDED_KEY_USAGE_it                   2800	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+X509_CRL_INFO_it                        2801	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_CRL_INFO_it                        2801	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS7_DIGEST_it                         2802	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_DIGEST_it                         2802	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS7_ENC_CONTENT_it                    2803	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_ENC_CONTENT_it                    2803	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 asn1_set_choice_selector                2804	EXIST::FUNCTION:
 asn1_get_field_ptr                      2805	EXIST::FUNCTION:
-OCSP_CRLID_it                           2806	EXIST::VARIABLE:
+OCSP_CRLID_it                           2806	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_CRLID_it                           2806	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_REQUEST_get_ext_count              2807	EXIST::FUNCTION:
-X509_NAME_it                            2808	EXIST::VARIABLE:
-USERNOTICE_it                           2809	EXIST::VARIABLE:
+X509_NAME_it                            2808	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_NAME_it                            2808	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+USERNOTICE_it                           2809	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+USERNOTICE_it                           2809	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_BASICRESP_get_ext                  2810	EXIST::FUNCTION:
-X509_REQ_INFO_it                        2811	EXIST::VARIABLE:
+X509_REQ_INFO_it                        2811	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+X509_REQ_INFO_it                        2811	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 ASN1_item_ex_free                       2812	EXIST::FUNCTION:
 OCSP_ONEREQ_add1_ext_i2d                2813	EXIST::FUNCTION:
-ASN1_NULL_it                            2814	EXIST::VARIABLE:
-PKCS7_it                                2815	EXIST::VARIABLE:
+ASN1_NULL_it                            2814	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_NULL_it                            2814	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS7_it                                2815	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_it                                2815	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_REQUEST_get_ext_by_critical        2816	EXIST:!VMS:FUNCTION:
 OCSP_REQUEST_get_ext_by_crit            2816	EXIST:VMS:FUNCTION:
 OCSP_ONEREQ_delete_ext                  2817	EXIST::FUNCTION:
@@ -2245,26 +2323,39 @@ ASN1_item_sign                          2821	EXIST::FUNCTION:EVP
 ASN1_unpack_item                        2822	NOEXIST::FUNCTION:
 ASN1_item_verify                        2823	EXIST::FUNCTION:EVP
 ASN1_pack_item                          2824	NOEXIST::FUNCTION:
-OCSP_CERTID_it                          2825	EXIST::VARIABLE:
-OCSP_SIGNATURE_it                       2826	EXIST::VARIABLE:
+OCSP_CERTID_it                          2825	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_CERTID_it                          2825	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_SIGNATURE_it                       2826	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_SIGNATURE_it                       2826	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 ASN1_item_dup                           2827	EXIST::FUNCTION:
-OCSP_REQUEST_it                         2828	EXIST::VARIABLE:
-OCSP_BASICRESP_it                       2829	EXIST::VARIABLE:
-OCSP_RESPBYTES_it                       2830	EXIST::VARIABLE:
-OCSP_ONEREQ_it                          2831	EXIST::VARIABLE:
-OCSP_RESPDATA_it                        2832	EXIST::VARIABLE:
-OCSP_RESPID_it                          2833	EXIST::VARIABLE:
-OCSP_REVOKEDINFO_it                     2834	EXIST::VARIABLE:
-OCSP_RESPONSE_it                        2835	EXIST::VARIABLE:
-OCSP_CERTSTATUS_it                      2836	EXIST::VARIABLE:
+OCSP_REQUEST_it                         2828	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_REQUEST_it                         2828	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_BASICRESP_it                       2829	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_BASICRESP_it                       2829	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_RESPBYTES_it                       2830	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_RESPBYTES_it                       2830	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_ONEREQ_it                          2831	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_ONEREQ_it                          2831	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_RESPDATA_it                        2832	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_RESPDATA_it                        2832	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_RESPID_it                          2833	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_RESPID_it                          2833	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_REVOKEDINFO_it                     2834	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_REVOKEDINFO_it                     2834	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_RESPONSE_it                        2835	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_RESPONSE_it                        2835	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+OCSP_CERTSTATUS_it                      2836	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+OCSP_CERTSTATUS_it                      2836	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_basic_sign                         2837	EXIST::FUNCTION:
 OCSP_request_onereq_get0                2838	EXIST::FUNCTION:
-ASN1_SEQUENCE_it                        2839	NOEXIST::FUNCTION:
+ASN1_SEQUENCE_it                        2839	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_SEQUENCE_it                        2839	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_crl_reason_str                     2840	EXIST::FUNCTION:
 OCSP_request_set1_name                  2841	EXIST::FUNCTION:
 OCSP_cert_to_id                         2842	EXIST::FUNCTION:
 OCSP_request_add0_id                    2843	EXIST::FUNCTION:
-RSAPrivateKey_it                        2844	EXIST::VARIABLE:RSA
+RSAPrivateKey_it                        2844	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:RSA
+RSAPrivateKey_it                        2844	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:RSA
 PKCS12_unpack_p7data                    2845	EXIST::FUNCTION:
 PKCS12_item_decrypt_d2i                 2846	EXIST::FUNCTION:
 OCSP_resp_count                         2847	EXIST::FUNCTION:
@@ -2273,16 +2364,19 @@ CRYPTO_get_mem_ex_functions             2849	EXIST::FUNCTION:
 OPENSSL_issetugid                       2850	EXIST::FUNCTION:
 PKCS12_item_i2d_encrypt                 2851	EXIST::FUNCTION:
 OCSP_basic_verify                       2852	EXIST::FUNCTION:
-ZLONG_it                                2853	NOEXIST::FUNCTION:
+ZLONG_it                                2853	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ZLONG_it                                2853	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 EVP_aes_128_ecb                         2854	EXIST::FUNCTION:AES
 CRYPTO_set_locked_mem_ex_functions      2855	EXIST:!VMS:FUNCTION:
 CRYPTO_set_locked_mem_ex_funcs          2855	EXIST:VMS:FUNCTION:
 PKCS12_certbag2x509crl                  2856	EXIST::FUNCTION:
-DIRECTORYSTRING_it                      2857	EXIST::VARIABLE:
+DIRECTORYSTRING_it                      2857	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+DIRECTORYSTRING_it                      2857	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 PKCS12_decrypt_skey                     2858	EXIST::FUNCTION:
 EVP_aes_192_cbc                         2859	EXIST::FUNCTION:AES
 OCSP_id_get0_info                       2860	EXIST::FUNCTION:
-ASN1_FBOOLEAN_it                        2861	NOEXIST::FUNCTION:
+ASN1_FBOOLEAN_it                        2861	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_FBOOLEAN_it                        2861	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_id_issuer_cmp                      2862	EXIST::FUNCTION:
 RAND_query_egd_bytes                    2863	EXIST::FUNCTION:
 ASN1_TIME_check                         2864	EXIST::FUNCTION:
@@ -2296,7 +2390,8 @@ EVP_Digest                              2871	EXIST::FUNCTION:
 OCSP_response_status                    2872	EXIST::FUNCTION:
 OCSP_request_add1_nonce                 2873	EXIST::FUNCTION:
 EVP_CIPHER_CTX_set_padding              2874	EXIST::FUNCTION:
-ASN1_PRINTABLE_it                       2875	EXIST::VARIABLE:
+ASN1_PRINTABLE_it                       2875	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_PRINTABLE_it                       2875	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 PKCS12_pack_authsafes                   2876	EXIST::FUNCTION:
 PKCS12_unpack_p7encdata                 2877	EXIST::FUNCTION:
 X509_pubkey_digest                      2878	EXIST::FUNCTION:EVP
@@ -2311,18 +2406,21 @@ ASN1_PRINTABLE_new                      2886	EXIST::FUNCTION:
 ASN1_item_unpack                        2887	EXIST::FUNCTION:
 ASN1_item_d2i_fp                        2888	EXIST::FUNCTION:FP_API
 OCSP_basic_add1_status                  2889	EXIST::FUNCTION:
-DISPLAYTEXT_it                          2890	EXIST::VARIABLE:
+DISPLAYTEXT_it                          2890	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+DISPLAYTEXT_it                          2890	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_response_status_str                2891	EXIST::FUNCTION:
 EVP_aes_128_cbc                         2892	EXIST::FUNCTION:AES
 X509_get0_pubkey_bitstr                 2893	EXIST::FUNCTION:
 OCSP_cert_status_str                    2894	EXIST::FUNCTION:
 OCSP_sendreq_bio                        2895	EXIST::FUNCTION:
 ASN1_item_i2d_bio                       2896	EXIST::FUNCTION:BIO
-CBIGNUM_it                              2897	NOEXIST::FUNCTION:
+CBIGNUM_it                              2897	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+CBIGNUM_it                              2897	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 PKCS8_decrypt                           2898	EXIST::FUNCTION:
 rijndaelKeySetupEnc                     2899	EXIST::FUNCTION:
 OCSP_basic_add1_cert                    2900	EXIST::FUNCTION:
-LONG_it                                 2901	NOEXIST::FUNCTION:
+LONG_it                                 2901	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+LONG_it                                 2901	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 PKCS12_certbag2x509                     2902	EXIST::FUNCTION:
 OCSP_response_create                    2903	EXIST::FUNCTION:
 OCSP_resp_get0                          2904	EXIST::FUNCTION:
@@ -2332,17 +2430,32 @@ EVP_aes_192_ecb                         2906	EXIST::FUNCTION:AES
 OCSP_response_get1_basic                2907	EXIST::FUNCTION:
 PKCS12_item_pack_safebag                2908	EXIST::FUNCTION:
 OCSP_copy_nonce                         2909	EXIST::FUNCTION:
-ASN1_TBOOLEAN_it                        2910	NOEXIST::FUNCTION:
+ASN1_TBOOLEAN_it                        2910	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_TBOOLEAN_it                        2910	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_single_get0_status                 2911	EXIST::FUNCTION:
 OCSP_check_nonce                        2912	EXIST::FUNCTION:
-ASN1_BOOLEAN_it                         2913	NOEXIST::FUNCTION:
-RSAPublicKey_it                         2914	EXIST::VARIABLE:RSA
+ASN1_BOOLEAN_it                         2913	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_BOOLEAN_it                         2913	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+RSAPublicKey_it                         2914	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:RSA
+RSAPublicKey_it                         2914	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:RSA
 ASN1_PRINTABLE_free                     2915	EXIST::FUNCTION:
 CRYPTO_set_mem_ex_functions             2916	EXIST::FUNCTION:
 ASN1_TIME_to_generalizedtime            2917	EXIST::FUNCTION:
-BIGNUM_it                               2918	NOEXIST::FUNCTION:
+BIGNUM_it                               2918	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+BIGNUM_it                               2918	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
 OCSP_onereq_get0_id                     2919	EXIST::FUNCTION:
 EVP_aes_256_cbc                         2920	EXIST::FUNCTION:AES
 OCSP_resp_find                          2921	EXIST::FUNCTION:
 BN_rand_range                           2922	EXIST::FUNCTION:
 OCSP_check_validity                     2923	EXIST::FUNCTION:
+OCSP_request_is_signed                  2924	EXIST::FUNCTION:
+PKCS7_ATTR_SIGN_it                      2925	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_ATTR_SIGN_it                      2925	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS12_AUTHSAFES_it                     2926	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS12_AUTHSAFES_it                     2926	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS12_SAFEBAGS_it                      2927	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS12_SAFEBAGS_it                      2927	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+PKCS7_ATTR_VERIFY_it                    2928	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+PKCS7_ATTR_VERIFY_it                    2928	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
+ASN1_OBJECT_it                          2929	EXIST:!EXPORT_VAR_AS_FUNCTION:VARIABLE:
+ASN1_OBJECT_it                          2929	EXIST:EXPORT_VAR_AS_FUNCTION:FUNCTION:
diff --git a/util/mkdef.pl b/util/mkdef.pl
index 17ac5173bb..b6117499ae 100755
--- a/util/mkdef.pl
+++ b/util/mkdef.pl
@@ -37,17 +37,17 @@
 # - "platforms" is empty if it exists on all platforms, otherwise it contains
 #   comma-separated list of the platform, just as they are if the symbol exists
 #   for those platforms, or prepended with a "!" if not.  This helps resolve
-#   symbol name replacements for platforms where the names are too long for the
+#   symbol name variants for platforms where the names are too long for the
 #   compiler or linker, or if the systems is case insensitive and there is a
-#   clash.  This script assumes those redefinitions are place in the file
-#   crypto/symhacks.h.
-#   The semantics for the platforms list is a bit complicated.  The rule of
-#   thumb is that the list is exclusive, but it seems to mean different things.
-#   So, if the list is all negatives (like "!VMS,!WIN16"), the symbol exists
-#   on all platforms except those listed.  If the list is all positives (like
-#   "VMS,WIN16"), the symbol exists only on those platforms and nowhere else.
-#   The combination of positives and negatives will act as if the positives
-#   weren't there.
+#   clash, or the symbol is implemented differently (see
+#   EXPORT_VAR_AS_FUNCTION).  This script assumes renaming of symbols is found
+#   in the file crypto/symhacks.h.
+#   The semantics for the platforms is that every item is checked against the
+#   enviroment.  For the negative items ("!FOO"), if any of them is false
+#   (i.e. "FOO" is true) in the enviroment, the corresponding symbol can't be
+#   used.  For the positive itms, if all of them are false in the environment,
+#   the corresponding symbol can't be used.  Any combination of positive and
+#   negative items are possible, and of course leave room for some redundancy.
 # - "kind" is "FUNCTION" or "VARIABLE".  The meaning of that is obvious.
 # - "algorithms" is a comma-separated list of algorithm names.  This helps
 #   exclude symbols that are part of an algorithm that some user wants to
@@ -67,6 +67,8 @@ my $do_ctest = 0;
 my $do_ctestall = 0;
 my $do_checkexist = 0;
 
+my $VMSVAX=0;
+my $VMSAlpha=0;
 my $VMS=0;
 my $W32=0;
 my $W16=0;
@@ -74,7 +76,8 @@ my $NT=0;
 # Set this to make typesafe STACK definitions appear in DEF
 my $safe_stack_def = 0;
 
-my @known_platforms = ( "__FreeBSD__", "PERL5", "NeXT" );
+my @known_platforms = ( "__FreeBSD__", "PERL5", "NeXT",
+			"EXPORT_VAR_AS_FUNCTION" );
 my @known_ossl_platforms = ( "VMS", "WIN16", "WIN32", "WINNT" );
 my @known_algorithms = ( "RC2", "RC4", "RC5", "IDEA", "DES", "BF",
 			 "CAST", "MD2", "MD4", "MD5", "SHA", "SHA0", "SHA1",
@@ -106,12 +109,21 @@ my $no_fp_api;
 
 foreach (@ARGV, split(/ /, $options))
 	{
+	$debug=1 if $_ eq "debug";
 	$W32=1 if $_ eq "32";
 	$W16=1 if $_ eq "16";
 	if($_ eq "NT") {
 		$W32 = 1;
 		$NT = 1;
 	}
+	if ($_ eq "VMS-VAX") {
+		$VMS=1;
+		$VMSVAX=1;
+	}
+	if ($_ eq "VMS-Alpha") {
+		$VMS=1;
+		$VMSAlpha=1;
+	}
 	$VMS=1 if $_ eq "VMS";
 
 	$do_ssl=1 if $_ eq "ssleay";
@@ -308,7 +320,9 @@ sub do_defs
 	my %platform;		# For anything undefined, we assume ""
 	my %kind;		# For anything undefined, we assume "FUNCTION"
 	my %algorithm;		# For anything undefined, we assume ""
-	my %rename;
+	my %variant;
+	my %variant_cnt;	# To be able to allocate "name{n}" if "name"
+				# is the same name as the original.
 	my $cpp;
 	my %unknown_algorithms = ();
 
@@ -330,6 +344,53 @@ sub do_defs
 		my @current_platforms = ();
 		my @current_algorithms = ();
 
+		# params: symbol, alias, platforms, kind
+		# The reason to put this subroutine in a variable is that
+		# it will otherwise create it's own, unshared, version of
+		# %tag and %variant...
+		my $make_variant = sub
+		{
+			my ($s, $a, $p, $k) = @_;
+			my ($a1, $a2);
+
+			print STDERR "DEBUG: make_variant: Entered with ",$s,", ",$a,", ",(defined($p)?$p:""),", ",(defined($k)?$k:""),"\n" if $debug;
+			if (defined($p))
+			{
+				$a1 = join(",",$p,
+					   grep(!/^$/,
+						map { $tag{$_} == 1 ? $_ : "" }
+						@known_platforms));
+			}
+			else
+			{
+				$a1 = join(",",
+					   grep(!/^$/,
+						map { $tag{$_} == 1 ? $_ : "" }
+						@known_platforms));
+			}
+			$a2 = join(",",
+				   grep(!/^$/,
+					map { $tag{"OPENSSL_SYS_".$_} == 1 ? $_ : "" }
+					@known_ossl_platforms));
+			print STDERR "DEBUG: make_variant: a1 = $a1; a2 = $a2\n" if $debug;
+			if ($a1 eq "") { $a1 = $a2; }
+			elsif ($a1 ne "" && $a2 ne "") { $a1 .= ",".$a2; }
+			if ($a eq $s)
+			{
+				if (!defined($variant_cnt{$s}))
+				{
+					$variant_cnt{$s} = 0;
+				}
+				$variant_cnt{$s}++;
+				$a .= "{$variant_cnt{$s}}";
+			}
+			if (defined($variant{$s})) { $variant{$s} .= ";"; }
+			$variant{$s} = $a.":".$a1;
+			if (defined($k)) { $variant{$s} .= ":$k"; }
+			print STDERR "DEBUG: make_variant: Exit with variant of ",$s," = ",$variant{$s},"\n" if $debug;
+		};
+
+		print STDERR "DEBUG: parsing ----------\n" if $debug;
 		while(<IN>) {
 			last if (/BEGIN ERROR CODES/);
 			if ($line ne '') {
@@ -453,22 +514,10 @@ sub do_defs
 				print STDERR "DEBUG: $file: found 0\n" if $debug;
 			} elsif (/^\#\s*define\s+(\w+)\s+(\w+)/
 				 && $symhacking && $tag{'TRUE'} != -1) {
-				my $s = $1;
-				my $a = $2;
-				my $a1 = join(",",
-					      grep(!/^$/,
-						   map { $tag{$_} == 1 ?
-							     $_ : "" }
-						   @known_platforms));
-				my $a2 = join(",",
-					      grep(!/^$/,
-						   map { $tag{"OPENSSL_SYS_".$_} == 1 ?
-							     $_ : "" }
-						   @known_ossl_platforms));
-				if ($a1 eq "") { $a1 = $a2; }
-				elsif ($a1 ne "" && $a2 ne "") { $a1 .= ",".$a2; }
-				$rename{$s} = $a.":".$a1;
-				print STDERR "DEBUG: $file: defined $s = $a\n" if $debug;
+				# This is for aliasing.  When we find an alias,
+				# we have to invert
+				&$make_variant($1,$2);
+				print STDERR "DEBUG: $file: defined $1 = $2\n" if $debug;
 			}
 			if (/^\#/) {
 				@current_platforms =
@@ -497,41 +546,145 @@ sub do_defs
 				} elsif (/^\s*DECLARE_ASN1_ENCODE_FUNCTIONS\s*\(\s*(\w*)\s*,\s*(\w*)\s*,\s*(\w*)\s*\)/) {
 					$def .= "int d2i_$3(void);";
 					$def .= "int i2d_$3(void);";
+					# Variant for platforms that do not
+					# have to access globale variables
+					# in shared libraries through functions
+					$def .=
+					    "#INFO:"
+						.join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
+						    .join(',',@current_algorithms).";";
 					$def .= "OPENSSL_EXTERN int $2_it;";
+					$def .=
+					    "#INFO:"
+						.join(',',@current_platforms).":"
+						    .join(',',@current_algorithms).";";
+					# Variant for platforms that have to
+					# access globale variables in shared
+					# libraries through functions
+					&$make_variant("$2_it","$2_it",
+						      "EXPORT_VAR_AS_FUNCTION",
+						      "FUNCTION");
 					next;
 				} elsif (/^\s*DECLARE_ASN1_FUNCTIONS_fname\s*\(\s*(\w*)\s*,\s*(\w*)\s*,\s*(\w*)\s*\)/) {
 					$def .= "int d2i_$3(void);";
 					$def .= "int i2d_$3(void);";
 					$def .= "int $3_free(void);";
 					$def .= "int $3_new(void);";
+					# Variant for platforms that do not
+					# have to access globale variables
+					# in shared libraries through functions
+					$def .=
+					    "#INFO:"
+						.join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
+						    .join(',',@current_algorithms).";";
 					$def .= "OPENSSL_EXTERN int $2_it;";
+					$def .=
+					    "#INFO:"
+						.join(',',@current_platforms).":"
+						    .join(',',@current_algorithms).";";
+					# Variant for platforms that have to
+					# access globale variables in shared
+					# libraries through functions
+					&$make_variant("$2_it","$2_it",
+						      "EXPORT_VAR_AS_FUNCTION",
+						      "FUNCTION");
+					next;
 				} elsif (/^\s*DECLARE_ASN1_FUNCTIONS\s*\(\s*(\w*)\s*\)/ ||
 					 /^\s*DECLARE_ASN1_FUNCTIONS_const\s*\(\s*(\w*)\s*\)/) {
 					$def .= "int d2i_$1(void);";
 					$def .= "int i2d_$1(void);";
 					$def .= "int $1_free(void);";
 					$def .= "int $1_new(void);";
+					# Variant for platforms that do not
+					# have to access globale variables
+					# in shared libraries through functions
+					$def .=
+					    "#INFO:"
+						.join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
+						    .join(',',@current_algorithms).";";
 					$def .= "OPENSSL_EXTERN int $1_it;";
+					$def .=
+					    "#INFO:"
+						.join(',',@current_platforms).":"
+						    .join(',',@current_algorithms).";";
+					# Variant for platforms that have to
+					# access globale variables in shared
+					# libraries through functions
+					&$make_variant("$1_it","$1_it",
+						      "EXPORT_VAR_AS_FUNCTION",
+						      "FUNCTION");
 					next;
 				} elsif (/^\s*DECLARE_ASN1_ENCODE_FUNCTIONS_const\s*\(\s*(\w*)\s*,\s*(\w*)\s*\)/) {
 					$def .= "int d2i_$2(void);";
 					$def .= "int i2d_$2(void);";
+					# Variant for platforms that do not
+					# have to access globale variables
+					# in shared libraries through functions
+					$def .=
+					    "#INFO:"
+						.join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
+						    .join(',',@current_algorithms).";";
 					$def .= "OPENSSL_EXTERN int $2_it;";
+					$def .=
+					    "#INFO:"
+						.join(',',@current_platforms).":"
+						    .join(',',@current_algorithms).";";
+					# Variant for platforms that have to
+					# access globale variables in shared
+					# libraries through functions
+					&$make_variant("$2_it","$2_it",
+						      "EXPORT_VAR_AS_FUNCTION",
+						      "FUNCTION");
 					next;
 				} elsif (/^\s*DECLARE_ASN1_FUNCTIONS_name\s*\(\s*(\w*)\s*,\s*(\w*)\s*\)/) {
 					$def .= "int d2i_$2(void);";
 					$def .= "int i2d_$2(void);";
 					$def .= "int $2_free(void);";
 					$def .= "int $2_new(void);";
+					# Variant for platforms that do not
+					# have to access globale variables
+					# in shared libraries through functions
+					$def .=
+					    "#INFO:"
+						.join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
+						    .join(',',@current_algorithms).";";
 					$def .= "OPENSSL_EXTERN int $2_it;";
+					$def .=
+					    "#INFO:"
+						.join(',',@current_platforms).":"
+						    .join(',',@current_algorithms).";";
+					# Variant for platforms that have to
+					# access globale variables in shared
+					# libraries through functions
+					&$make_variant("$2_it","$2_it",
+						      "EXPORT_VAR_AS_FUNCTION",
+						      "FUNCTION");
 					next;
-				} elsif (/^\s*DECLARE_ASN1_ITEM\s*\(\s*(\w*)\s*,(\w*)\s*\)/) {
+				} elsif (/^\s*DECLARE_ASN1_ITEM\s*\(\s*(\w*)\s*\)/) {
+					# Variant for platforms that do not
+					# have to access globale variables
+					# in shared libraries through functions
+					$def .=
+					    "#INFO:"
+						.join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
+						    .join(',',@current_algorithms).";";
 					$def .= "OPENSSL_EXTERN int $1_it;";
-					next;
-				} elsif (/^\s*DECLARE_PKCS12_STACK_OF\s*\(\s*(\w*)\s*\)/) {
+					$def .=
+					    "#INFO:"
+						.join(',',@current_platforms).":"
+						    .join(',',@current_algorithms).";";
+					# Variant for platforms that have to
+					# access globale variables in shared
+					# libraries through functions
+					&$make_variant("$1_it","$1_it",
+						      "EXPORT_VAR_AS_FUNCTION",
+						      "FUNCTION");
+					print STDERR "DEBUG: after make_variant: variant of $1_it = ",$variant{"$1_it"},"\n" if $debug;
 					next;
 				} elsif (/^\s*DECLARE_ASN1_SET_OF\s*\(\s*(\w*)\s*\)/) {
 					next;
+				} elsif (/^\s*DECLARE_PKCS12_STACK_OF\s*\(\s*(\w*)\s*\)/) {
+					next;
 				} elsif (/^DECLARE_PEM_rw\s*\(\s*(\w*)\s*,/ ||
 					 /^DECLARE_PEM_rw_cb\s*\(\s*(\w*)\s*,/ ) {
 					# Things not in Win16
@@ -579,6 +732,26 @@ sub do_defs
 					# Things that are everywhere
 					$def .= "int PEM_read_bio_$1(void);";
 					next;
+				} elsif (/^OPENSSL_DECLARE_GLOBAL\s*\(\s*(\w*)\s*,\s*(\w*)\s*\)/) {
+					# Variant for platforms that do not
+					# have to access globale variables
+					# in shared libraries through functions
+					$def .=
+					    "#INFO:"
+						.join(',',"!EXPORT_VAR_AS_FUNCTION",@current_platforms).":"
+						    .join(',',@current_algorithms).";";
+					$def .= "OPENSSL_EXTERN int _shadow_$2;";
+					$def .=
+					    "#INFO:"
+						.join(',',@current_platforms).":"
+						    .join(',',@current_algorithms).";";
+					# Variant for platforms that have to
+					# access globale variables in shared
+					# libraries through functions
+					&$make_variant("_shadow_$2","_shadow_$2",
+						      "EXPORT_VAR_AS_FUNCTION",
+						      "FUNCTION");
+					print STDERR "DEBUG: after make_variant: variant of $1_it = ",$variant{"$1_it"},"\n" if $debug;
 				} elsif ($tag{'CONST_STRICT'} != 1) {
 					if (/\{|\/\*|\([^\)]*$/) {
 						$line = $_;
@@ -593,6 +766,7 @@ sub do_defs
 		my $algs;
 		my $plays;
 
+		print STDERR "DEBUG: postprocessing ----------\n" if $debug;
 		foreach (split /;/, $def) {
 			my $s; my $k = "FUNCTION"; my $p; my $a;
 			s/^[\n\s]*//g;
@@ -601,25 +775,26 @@ sub do_defs
 			next if(/typedef\W/);
 			next if(/\#define/);
 
+			print STDERR "DEBUG: \$_ = \"$_\"\n" if $debug;
 			if (/^\#INFO:([^:]*):(.*)$/) {
 				$plats = $1;
 				$algs = $2;
 				next;
-			} elsif (/^\s*OPENSSL_EXTERN\s.*?(\w+)(\[[0-9]*\])*\s*$/) {
+			} elsif (/^\s*OPENSSL_EXTERN\s.*?(\w+(\{[0-9]+\})?)(\[[0-9]*\])*\s*$/) {
 				$s = $1;
 				$k = "VARIABLE";
-			} elsif (/\(\*(\w*)\([^\)]+/) {
+			} elsif (/\(\*(\w*(\{[0-9]+\})?)\([^\)]+/) {
 				$s = $1;
 			} elsif (/\w+\W+(\w+)\W*\(\s*\)$/s) {
 				# K&R C
 				next;
-			} elsif (/\w+\W+\w+\W*\(.*\)$/s) {
+			} elsif (/\w+\W+\w+(\{[0-9]+\})?\W*\(.*\)$/s) {
 				while (not /\(\)$/s) {
 					s/[^\(\)]*\)$/\)/s;
 					s/\([^\(\)]*\)\)$/\)/s;
 				}
 				s/\(void\)//;
-				/(\w+)\W*\(\)/s;
+				/(\w+(\{[0-9]+\})?)\W*\(\)/s;
 				$s = $1;
 			} elsif (/\(/ and not (/=/)) {
 				print STDERR "File $file: cannot parse: $_;\n";
@@ -651,18 +826,22 @@ sub do_defs
 			$a .= ",RSA" if($s =~ /RSAPrivateKey/);
 			$a .= ",RSA" if($s =~ /SSLv23?_((client|server)_)?method/);
 
-			$platform{$s} .= ','.$p;
+			$platform{$s} =
+			    &reduce_platforms((defined($platform{$s})?$platform{$s}.',':"").$p);
 			$algorithm{$s} .= ','.$a;
 
-			if (defined($rename{$s})) {
-				(my $r, my $p) = split(/:/,$rename{$s});
-				my @ip = map { /^!(.*)$/ ? $1 : "!".$_ } split /,/, $p;
+			if (defined($variant{$s})) {
+				(my $r, my $p, my $k) = split(/:/,$variant{$s});
+				my $ip = join ',',map({ /^!(.*)$/ ? $1 : "!".$_ } split /,/, $p);
 				$syms{$r} = 1;
-				$kind{$r} = $kind{$s}."(".$s.")";
+				if (!defined($k)) { $k = $kind{$s}; }
+				$kind{$r} = $k."(".$s.")";
 				$algorithm{$r} = $algorithm{$s};
-				$platform{$r} = $platform{$s}.",".$p;
-				$platform{$s} .= ','.join(',', @ip).','.join(',', @ip);
+				$platform{$r} = &reduce_platforms($platform{$s}.",".$p.",".$p);
+				$platform{$s} = &reduce_platforms($platform{$s}.','.$ip.','.$ip);
+				print STDERR "DEBUG: \$variant{\"$s\"} = ",$variant{$s},"; \$r = $r; \$p = ",$platform{$r},"; \$a = ",$algorithm{$r},"; \$kind = ",$kind{$r},"\n" if $debug;
 			}
+			print STDERR "DEBUG: \$s = $s; \$p = ",$platform{$s},"; \$a = ",$algorithm{$s},"; \$kind = ",$kind{$s},"\n" if $debug;
 		}
 	}
 
@@ -690,16 +869,16 @@ sub do_defs
 	return(@ret);
 }
 
-sub info_string {
-	(my $symbol, my $exist, my $platforms, my $kind, my $algorithms) = @_;
-
-	my %a = defined($algorithms) ?
-	    map { $_ => 1 } split /,/, $algorithms : ();
+# Param: string of comma-separated platform-specs.
+sub reduce_platforms
+{
+	my ($platforms) = @_;
 	my $pl = defined($platforms) ? $platforms : "";
 	my %p = map { $_ => 0 } split /,/, $pl;
-	my $k = defined($kind) ? $kind : "FUNCTION";
 	my $ret;
 
+	print STDERR "DEBUG: Entered reduce_platforms with \"$platforms\"\n"
+	    if $debug;
 	# We do this, because if there's code like the following, it really
 	# means the function exists in all cases and should therefore be
 	# everywhere.  By increasing and decreasing, we may attain 0:
@@ -721,12 +900,28 @@ sub info_string {
 	}
 
 	delete $p{""};
+
+	$ret = join(',',map { $p{$_} < 0 ? "!".$_ : $_ } keys %p);
+	print STDERR "DEBUG: Exiting reduce_platforms with \"$ret\"\n"
+	    if $debug;
+	return $ret;
+}
+
+sub info_string {
+	(my $symbol, my $exist, my $platforms, my $kind, my $algorithms) = @_;
+
+	my %a = defined($algorithms) ?
+	    map { $_ => 1 } split /,/, $algorithms : ();
+	my $k = defined($kind) ? $kind : "FUNCTION";
+	my $ret;
+	my $p = &reduce_platforms($platforms);
+
 	delete $a{""};
 
 	$ret = $exist;
-	$ret .= ":".join(',',map { $p{$_} < 0 ? "!".$_ : $_ } keys %p);
+	$ret .= ":".$p;
 	$ret .= ":".$k;
-	$ret .= ":".join(',',keys %a);
+	$ret .= ":".join(',',sort keys %a);
 	return $ret;
 }
 
@@ -739,8 +934,8 @@ sub maybe_add_info {
 	print STDERR "Updating $name info\n";
 	foreach $sym (@symbols) {
 		(my $s, my $i) = split /\\/, $sym;
-		$i =~ s/^(.*?:.*?:\w+)(\(\w+\))?/$1/;
 		if (defined($nums{$s})) {
+			$i =~ s/^(.*?:.*?:\w+)(\(\w+\))?/$1/;
 			(my $n, my $dummy) = split /\\/, $nums{$s};
 			if (!defined($dummy) || $i ne $dummy) {
 				$nums{$s} = $n."\\".$i;
@@ -748,15 +943,15 @@ sub maybe_add_info {
 				print STDERR "DEBUG: maybe_add_info for $s: \"$dummy\" => \"$i\"\n" if $debug;
 			}
 		}
-		$syms{sym} = 1;
+		$syms{$s} = 1;
 	}
 
 	my @s=sort { &parse_number($nums{$a},"n") <=> &parse_number($nums{$b},"n") } keys %nums;
 	foreach $sym (@s) {
 		(my $n, my $i) = split /\\/, $nums{$sym};
-		if (!defined($syms{sym})) {
+		if (!defined($syms{$sym}) && $i !~ /^NOEXIST:/) {
 			$new_info++;
-			print STDERR "DEBUG: maybe_add_info for $sym: -> undefined\n if $debug";
+			print STDERR "DEBUG: maybe_add_info for $sym: -> undefined\n" if $debug;
 		}
 	}
 	if ($new_info) {
@@ -769,35 +964,112 @@ sub maybe_add_info {
 	}
 }
 
+# Param: string of comma-separated keywords, each possibly prefixed with a "!"
+sub is_valid
+{
+	my ($keywords_txt,$platforms) = @_;
+	my (@keywords) = split /,/,$keywords_txt;
+	my ($falsesum, $truesum) = (0, !grep(/^[^!]/,@keywords));
+
+	# Param: one keyword
+	sub recognise
+	{
+		my ($keyword,$platforms) = @_;
+
+		if ($platforms) {
+			# platforms
+			if ($keyword eq "VMS" && $VMS) { return 1; }
+			if ($keyword eq "WIN32" && $W32) { return 1; }
+			if ($keyword eq "WIN16" && $W16) { return 1; }
+			if ($keyword eq "WINNT" && $NT) { return 1; }
+			# Special platforms:
+			# 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) {
+				return 1;
+			}
+			return 0;
+		} else {
+			# algorithms
+			if ($keyword eq "RC2" && $no_rc2) { return 0; }
+			if ($keyword eq "RC4" && $no_rc4) { return 0; }
+			if ($keyword eq "RC5" && $no_rc5) { return 0; }
+			if ($keyword eq "IDEA" && $no_idea) { return 0; }
+			if ($keyword eq "DES" && $no_des) { return 0; }
+			if ($keyword eq "BF" && $no_bf) { return 0; }
+			if ($keyword eq "CAST" && $no_cast) { return 0; }
+			if ($keyword eq "MD2" && $no_md2) { return 0; }
+			if ($keyword eq "MD4" && $no_md4) { return 0; }
+			if ($keyword eq "MD5" && $no_md5) { return 0; }
+			if ($keyword eq "SHA" && $no_sha) { return 0; }
+			if ($keyword eq "RIPEMD" && $no_ripemd) { return 0; }
+			if ($keyword eq "MDC2" && $no_mdc2) { return 0; }
+			if ($keyword eq "RSA" && $no_rsa) { return 0; }
+			if ($keyword eq "DSA" && $no_dsa) { return 0; }
+			if ($keyword eq "DH" && $no_dh) { return 0; }
+			if ($keyword eq "HMAC" && $no_hmac) { return 0; }
+			if ($keyword eq "AES" && $no_aes) { return 0; }
+			if ($keyword eq "KRB5" && $no_krb5) { return 0; }
+			if ($keyword eq "FP_API" && $no_fp_api) { return 0; }
+
+			# Nothing recognise as true
+			return 1;
+		}
+	}
+
+	foreach $k (@keywords) {
+		if ($k =~ /^!(.*)$/) {
+			$falsesum += &recognise($1,$platforms);
+		} else {
+			$truesum += &recognise($k,$platforms);
+		}
+	}
+	print STDERR "DEBUG: [",$#keywords,",",$#keywords < 0,"] is_valid($keywords_txt) => (\!$falsesum) && $truesum = ",(!$falsesum) && $truesum,"\n" if $debug;
+	return (!$falsesum) && $truesum;
+}
+
 sub print_test_file
 {
-	(*OUT,my $name,*nums,my @symbols)=@_;
+	(*OUT,my $name,*nums,my $testall,my @symbols)=@_;
 	my $n = 1; my @e; my @r;
 	my $sym; my $prev = ""; my $prefSSLeay;
 
-	(@e)=grep(/^SSLeay\\.*?:.*?:FUNCTION/,@symbols);
-	(@r)=grep(/^\w+\\.*?:.*?:FUNCTION/ && !/^SSLeay\\.*?:.*?:FUNCTION/,@symbols);
+	(@e)=grep(/^SSLeay(\{[0-9]+\})?\\.*?:.*?:.*/,@symbols);
+	(@r)=grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:.*/ && !/^SSLeay(\{[0-9]+\})?\\.*?:.*?:.*/,@symbols);
 	@symbols=((sort @e),(sort @r));
 
 	foreach $sym (@symbols) {
 		(my $s, my $i) = $sym =~ /^(.*?)\\(.*)$/;
-		if ($s ne $prev) {
-			if (!defined($nums{$s})) {
-				print STDERR "Warning: $s does not have a number assigned\n"
-						if(!$do_update);
+		my $v = 0;
+		$v = 1 if $i=~ /^.*?:.*?:VARIABLE/;
+		my $p = ($i =~ /^[^:]*:([^:]*):/,$1);
+		my $a = ($i =~ /^[^:]*:[^:]*:[^:]*:([^:]*)/,$1);
+		if (!defined($nums{$s})) {
+			print STDERR "Warning: $s does not have a number assigned\n"
+			    if(!$do_update);
+		} elsif (is_valid($p,1) && is_valid($a,0)) {
+			my $s2 = ($s =~ /^(.*?)(\{[0-9]+\})?$/, $1);
+			if ($prev eq $s2) {
+				print OUT "\t/* The following has already appeared previously */\n";
+				print STDERR "Warning: Symbol '",$s2,"' redefined. old=",($nums{$prev} =~ /^(.*?)\\/,$1),", new=",($nums{$s2} =~ /^(.*?)\\/,$1),"\n";
+			}
+			$prev = $s2;	# To warn about duplicates...
+
+			($nn,$ni)=($nums{$s2} =~ /^(.*?)\\(.*)$/);
+			if ($v) {
+				print OUT "\textern int $s2; /* type unknown */ /* $nn $ni */\n";
 			} else {
-				$n=$nums{$s};
-				print OUT "\t$s();\n";
+				print OUT "\textern int $s2(); /* type unknown */ /* $nn $ni */\n";
 			}
 		}
-		$prev = $s;	# To avoid duplicates...
 	}
 }
 
 sub print_def_file
 {
 	(*OUT,my $name,*nums,my @symbols)=@_;
-	my $n = 1; my @e; my @r; my @v;
+	my $n = 1; my @e; my @r; my @v; my $prev="";
 
 	if ($W32)
 		{ $name.="32"; }
@@ -830,79 +1102,36 @@ EOF
 
 	print "EXPORTS\n";
 
-	(@e)=grep(/^SSLeay\\.*?:.*?:FUNCTION/,@symbols);
-	(@r)=grep(/^\w+\\.*?:.*?:FUNCTION/ && !/^SSLeay\\.*?:.*?:FUNCTION/,@symbols);
-	(@v)=grep(/^\w+\\.*?:.*?:VARIABLE/,@symbols);
+	(@e)=grep(/^SSLeay(\{[0-9]+\})?\\.*?:.*?:FUNCTION/,@symbols);
+	(@r)=grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:FUNCTION/ && !/^SSLeay(\{[0-9]+\})?\\.*?:.*?:FUNCTION/,@symbols);
+	(@v)=grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:VARIABLE/,@symbols);
 	@symbols=((sort @e),(sort @r), (sort @v));
 
 
 	foreach $sym (@symbols) {
 		(my $s, my $i) = $sym =~ /^(.*?)\\(.*)$/;
 		my $v = 0;
-		$v = 1 if $sym=~ /^\w+\\.*?:.*?:VARIABLE/;
+		$v = 1 if $i =~ /^.*?:.*?:VARIABLE/;
 		if (!defined($nums{$s})) {
 			printf STDERR "Warning: $s does not have a number assigned\n"
-					if(!$do_update);
+			    if(!$do_update);
 		} else {
-			(my $n, my $i) = split /\\/, $nums{$s};
+			(my $n, my $dummy) = split /\\/, $nums{$s};
 			my %pf = ();
-			my @p = split(/,/, ($i =~ /^[^:]*:([^:]*):/,$1));
-			my @a = split(/,/, ($i =~ /^[^:]*:[^:]*:[^:]*:([^:]*)/,$1));
-			# @p_purged must contain hardware platforms only
-			my @p_purged = ();
-			foreach $ptmp (@p) {
-				push @p_purged, $ptmp;
-			}
-			my $negatives = !!grep(/^!/,@p);
-			# It is very important to check NT before W32
-			if ((($NT && (!@p_purged
-				      || (!$negatives && grep(/^WINNT$/,@p))
-				      || ($negatives && !grep(/^!WINNT$/,@p))))
-			     || ($W32 && (!@p_purged
-					  || (!$negatives && grep(/^WIN32$/,@p))
-					  || ($negatives && !grep(/^!WIN32$/,@p))))
-			     || ($W16 && (!@p_purged
-					  || (!$negatives && grep(/^WIN16$/,@p))
-					  || ($negatives && !grep(/^!WIN16$/,@p)))))
-			    && (!@a || (!$no_rc2 || !grep(/^RC2$/,@a)))
-			    && (!@a || (!$no_rc4 || !grep(/^RC4$/,@a)))
-			    && (!@a || (!$no_rc5 || !grep(/^RC5$/,@a)))
-			    && (!@a || (!$no_idea || !grep(/^IDEA$/,@a)))
-			    && (!@a || (!$no_des || !grep(/^DES$/,@a)))
-			    && (!@a || (!$no_bf || !grep(/^BF$/,@a)))
-			    && (!@a || (!$no_cast || !grep(/^CAST$/,@a)))
-			    && (!@a || (!$no_md2 || !grep(/^MD2$/,@a)))
-			    && (!@a || (!$no_md4 || !grep(/^MD4$/,@a)))
-			    && (!@a || (!$no_md5 || !grep(/^MD5$/,@a)))
-			    && (!@a || (!$no_sha || !grep(/^SHA$/,@a)))
-			    && (!@a || (!$no_ripemd || !grep(/^RIPEMD$/,@a)))
-			    && (!@a || (!$no_mdc2 || !grep(/^MDC2$/,@a)))
-			    && (!@a || (!$no_rsa || !grep(/^RSA$/,@a)))
-			    && (!@a || (!$no_dsa || !grep(/^DSA$/,@a)))
-			    && (!@a || (!$no_dh || !grep(/^DH$/,@a)))
-			    && (!@a || (!$no_hmac || !grep(/^HMAC$/,@a)))
-			    && (!@a || (!$no_aes || !grep(/^AES$/,@a)))
-			    && (!@a || (!$no_krb5 || !grep(/^KRB5$/,@a)))
-			    && (!@a || (!$no_fp_api || !grep(/^FP_API$/,@a)))
-			    ) {
+			my $p = ($i =~ /^[^:]*:([^:]*):/,$1);
+			my $a = ($i =~ /^[^:]*:[^:]*:[^:]*:([^:]*)/,$1);
+			if (is_valid($p,1) && is_valid($a,0)) {
+				my $s2 = ($s =~ /^(.*?)(\{[0-9]+\})?$/, $1);
+				if ($prev eq $s2) {
+					print STDERR "Warning: Symbol '",$s2,"' redefined. old=",($nums{$prev} =~ /^(.*?)\\/,$1),", new=",($nums{$s2} =~ /^(.*?)\\/,$1),"\n";
+				}
+				$prev = $s2;	# To warn about duplicates...
 				if($v) {
-					printf OUT "    %s%-40s@%-8d DATA\n",($W32)?"":"_",$s,$n;
+					printf OUT "    %s%-40s@%-8d DATA\n",($W32)?"":"_",$s2,$n;
 				} else {
-					printf OUT "    %s%-40s@%d\n",($W32)?"":"_",$s,$n;
+					printf OUT "    %s%-40s@%d\n",($W32)?"":"_",$s2,$n;
 				}
 			}
-#			print STDERR "DEBUG: \"$sym\" (@p):",
-#			" negatives:", $negatives,
-#			" 16:", !!($W16 && (!@p_purged
-#					    || (!$negatives && grep(/^WIN16$/,@p))
-#					    || ($negatives && !grep(/^!WIN16$/,@p)))),
-#			" 32:", !!($W32 && (!@p_purged
-#					    || (!$negatives && grep(/^WIN32$/,@p))
-#					    || ($negatives && !grep(/^!WIN32$/,@p)))),
-#			" NT:", !!($NT && (!@p_purged
-#					   || (!$negatives && grep(/^WINNT$/,@p))
-#					   || ($negatives && !grep(/^!WINNT$/,@p)))),
-#			"\n";
 		}
 	}
 	printf OUT "\n";
@@ -916,6 +1145,7 @@ sub load_numbers
 	$max_num = 0;
 	$num_noinfo = 0;
 	$prev = "";
+	$prev_cnt = 0;
 
 	open(IN,"<$name") || die "unable to open $name:$!\n";
 	while (<IN>) {
@@ -924,14 +1154,22 @@ sub load_numbers
 		next if /^\s*$/;
 		@a=split;
 		if (defined $ret{$a[0]}) {
-			print STDERR "Warning: Symbol '",$a[0],"' redefined. old=",$ret{$a[0]},", new=",$a[1],"\n";
+			# This is actually perfectly OK
+			#print STDERR "Warning: Symbol '",$a[0],"' redefined. old=",$ret{$a[0]},", new=",$a[1],"\n";
 		}
 		if ($max_num > $a[1]) {
 			print STDERR "Warning: Number decreased from ",$max_num," to ",$a[1],"\n";
 		}
-		if ($max_num == $a[1]) {
+		elsif ($max_num == $a[1]) {
 			# This is actually perfectly OK
 			#print STDERR "Warning: Symbol ",$a[0]," has same number as previous ",$prev,": ",$a[1],"\n";
+			if ($a[0] eq $prev) {
+				$prev_cnt++;
+				$a[0] .= "{$prev_cnt}";
+			}
+		}
+		else {
+			$prev_cnt = 0;
 		}
 		if ($#a < 2) {
 			# Existence will be proven later, in do_defs
@@ -973,7 +1211,7 @@ sub rewrite_numbers
 
 	print STDERR "Rewriting $name\n";
 
-	my @r = grep(/^\w+\\.*?:.*?:\w+\(\w+\)/,@symbols);
+	my @r = grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:\w+\(\w+\)/,@symbols);
 	my $r; my %r; my %rsyms;
 	foreach $r (@r) {
 		(my $s, my $i) = split /\\/, $r;
@@ -992,15 +1230,19 @@ sub rewrite_numbers
 	my @s=sort { &parse_number($nums{$a},"n") <=> &parse_number($nums{$b},"n") } keys %nums;
 	foreach $sym (@s) {
 		(my $n, my $i) = split /\\/, $nums{$sym};
-		print STDERR "DEBUG: rewrite_numbers for sym = ",$sym,": i = ",$i,", n = ",$n,", rsym{sym} = ",$rsyms{$sym},"syms{sym} = ",$syms{$sym},"\n" if $debug;
 		next if defined($i) && $i =~ /^.*?:.*?:\w+\(\w+\)/;
 		next if defined($rsyms{$sym});
+		print STDERR "DEBUG: rewrite_numbers for sym = ",$sym,": i = ",$i,", n = ",$n,", rsym{sym} = ",$rsyms{$sym},"syms{sym} = ",$syms{$sym},"\n" if $debug;
 		$i="NOEXIST::FUNCTION:"
 			if !defined($i) || $i eq "" || !defined($syms{$sym});
-		printf OUT "%s%-40s%d\t%s\n","",$sym,$n,$i;
+		my $s2 = $sym;
+		$s2 =~ s/\{[0-9]+\}$//;
+		printf OUT "%s%-40s%d\t%s\n","",$s2,$n,$i;
 		if (exists $r{$sym}) {
 			(my $s, $i) = split /\\/,$r{$sym};
-			printf OUT "%s%-40s%d\t%s\n","",$s,$n,$i;
+			my $s2 = $s;
+			$s2 =~ s/\{[0-9]+\}$//;
+			printf OUT "%s%-40s%d\t%s\n","",$s2,$n,$i;
 		}
 	}
 }
@@ -1012,7 +1254,7 @@ sub update_numbers
 
 	print STDERR "Updating $name numbers\n";
 
-	my @r = grep(/^\w+\\.*?:.*?:\w+\(\w+\)/,@symbols);
+	my @r = grep(/^\w+(\{[0-9]+\})?\\.*?:.*?:\w+\(\w+\)/,@symbols);
 	my $r; my %r; my %rsyms;
 	foreach $r (@r) {
 		(my $s, my $i) = split /\\/, $r;
@@ -1030,9 +1272,12 @@ sub update_numbers
 		    if $i eq "";
 		if (!exists $nums{$s}) {
 			$new_syms++;
-			printf OUT "%s%-40s%d\t%s\n","",$s, ++$start_num,$i;
+			my $s2 = $s;
+			$s2 =~ s/\{[0-9]+\}$//;
+			printf OUT "%s%-40s%d\t%s\n","",$s2, ++$start_num,$i;
 			if (exists $r{$s}) {
 				($s, $i) = split /\\/,$r{$s};
+				$s =~ s/\{[0-9]+\}$//;
 				printf OUT "%s%-40s%d\t%s\n","",$s, $start_num,$i;
 			}
 		}
diff --git a/util/ssleay.num b/util/ssleay.num
index c335f90124..bc2c1fc9c2 100755
--- a/util/ssleay.num
+++ b/util/ssleay.num
@@ -21,7 +21,7 @@ SSL_CTX_use_PrivateKey_ASN1             23	EXIST::FUNCTION:
 SSL_CTX_use_PrivateKey_file             24	EXIST::FUNCTION:STDIO
 SSL_CTX_use_RSAPrivateKey               25	EXIST::FUNCTION:RSA
 SSL_CTX_use_RSAPrivateKey_ASN1          26	EXIST::FUNCTION:RSA
-SSL_CTX_use_RSAPrivateKey_file          27	EXIST::FUNCTION:STDIO,RSA
+SSL_CTX_use_RSAPrivateKey_file          27	EXIST::FUNCTION:RSA,STDIO
 SSL_CTX_use_certificate                 28	EXIST::FUNCTION:
 SSL_CTX_use_certificate_ASN1            29	EXIST::FUNCTION:
 SSL_CTX_use_certificate_file            30	EXIST::FUNCTION:STDIO
@@ -89,7 +89,7 @@ SSL_use_PrivateKey_ASN1                 100	EXIST::FUNCTION:
 SSL_use_PrivateKey_file                 101	EXIST::FUNCTION:STDIO
 SSL_use_RSAPrivateKey                   102	EXIST::FUNCTION:RSA
 SSL_use_RSAPrivateKey_ASN1              103	EXIST::FUNCTION:RSA
-SSL_use_RSAPrivateKey_file              104	EXIST::FUNCTION:STDIO,RSA
+SSL_use_RSAPrivateKey_file              104	EXIST::FUNCTION:RSA,STDIO
 SSL_use_certificate                     105	EXIST::FUNCTION:
 SSL_use_certificate_ASN1                106	EXIST::FUNCTION:
 SSL_use_certificate_file                107	EXIST::FUNCTION:STDIO
@@ -208,7 +208,7 @@ kssl_ctx_free                           257	EXIST::FUNCTION:KRB5
 kssl_krb5_free_data_contents            258	EXIST::FUNCTION:KRB5
 print_krb5_data                         259	EXIST::FUNCTION:KRB5
 kssl_ctx_setstring                      260	EXIST::FUNCTION:KRB5
-SSL_CTX_has_matching_session_id         261	EXIST::FUNCTION:
+SSL_CTX_has_matching_session_id         261	NOEXIST::FUNCTION:
 SSL_set_generate_session_id             262	EXIST::FUNCTION:
 SSL_CTX_set_generate_session_id         263	EXIST::FUNCTION:
 SSL_has_matching_session_id             264	EXIST::FUNCTION: