From 62dc5aad063f50fa75fdae66c4247c925d4b3c5d Mon Sep 17 00:00:00 2001
From: Richard Levitte <levitte@openssl.org>
Date: Fri, 2 Mar 2001 10:38:19 +0000
Subject: [PATCH] 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).
---
 CHANGES                 |  34 +++
 Configure               |   7 +
 crypto/asn1/asn1.h      |   2 +-
 crypto/asn1/asn1t.h     |   6 +-
 crypto/des/des.h        |   6 +-
 crypto/des/enc_read.c   |   2 +-
 crypto/des/set_key.c    |   2 +-
 crypto/opensslconf.h.in |   2 +
 e_os2.h                 |  22 ++
 makevms.com             |   5 +
 util/libeay.num         | 357 ++++++++++++++++++----------
 util/mkdef.pl           | 509 +++++++++++++++++++++++++++++-----------
 util/ssleay.num         |   6 +-
 13 files changed, 695 insertions(+), 265 deletions(-)

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: