TEST: Break out the local dynamic loading code from shlibloadtest.c

The result is "simpledynamic.c", or "sd" for short.

Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org>
(Merged from https://github.com/openssl/openssl/pull/13507)
diff --git a/test/shlibloadtest.c b/test/shlibloadtest.c
index bbac996..c879e9a 100644
--- a/test/shlibloadtest.c
+++ b/test/shlibloadtest.c
@@ -13,7 +13,7 @@
 #include <openssl/opensslv.h>
 #include <openssl/ssl.h>
 #include <openssl/types.h>
-#include "crypto/dso_conf.h"
+#include "simpledynamic.h"
 
 typedef void DSO;
 
@@ -42,67 +42,7 @@
 static const char *path_ssl;
 static const char *path_atexit;
 
-#ifdef DSO_DLFCN
-
-# include <dlfcn.h>
-
-# define SHLIB_INIT NULL
-
-typedef void *SHLIB;
-typedef void *SHLIB_SYM;
-
-static int shlib_load(const char *filename, SHLIB *lib)
-{
-    int dl_flags = (RTLD_GLOBAL|RTLD_LAZY);
-#ifdef _AIX
-    if (filename[strlen(filename) - 1] == ')')
-        dl_flags |= RTLD_MEMBER;
-#endif
-    *lib = dlopen(filename, dl_flags);
-    return *lib == NULL ? 0 : 1;
-}
-
-static int shlib_sym(SHLIB lib, const char *symname, SHLIB_SYM *sym)
-{
-    *sym = dlsym(lib, symname);
-    return *sym != NULL;
-}
-
-static int shlib_close(SHLIB lib)
-{
-    return dlclose(lib) != 0 ? 0 : 1;
-}
-#endif
-
-#ifdef DSO_WIN32
-
-# include <windows.h>
-
-# define SHLIB_INIT 0
-
-typedef HINSTANCE SHLIB;
-typedef void *SHLIB_SYM;
-
-static int shlib_load(const char *filename, SHLIB *lib)
-{
-    *lib = LoadLibraryA(filename);
-    return *lib == NULL ? 0 : 1;
-}
-
-static int shlib_sym(SHLIB lib, const char *symname, SHLIB_SYM *sym)
-{
-    *sym = (SHLIB_SYM)GetProcAddress(lib, symname);
-    return *sym != NULL;
-}
-
-static int shlib_close(SHLIB lib)
-{
-    return FreeLibrary(lib) == 0 ? 0 : 1;
-}
-#endif
-
-
-#if defined(DSO_DLFCN) || defined(DSO_WIN32)
+#ifdef SD_INIT
 
 static int atexit_handler_done = 0;
 
@@ -120,12 +60,12 @@
 
 static int test_lib(void)
 {
-    SHLIB ssllib = SHLIB_INIT;
-    SHLIB cryptolib = SHLIB_INIT;
+    SD ssllib = SD_INIT;
+    SD cryptolib = SD_INIT;
     SSL_CTX *ctx;
     union {
         void (*func)(void);
-        SHLIB_SYM sym;
+        SD_SYM sym;
     } symbols[5];
     TLS_method_t myTLS_method;
     SSL_CTX_new_t mySSL_CTX_new;
@@ -142,7 +82,7 @@
     case DSO_REFTEST:
     case NO_ATEXIT:
     case CRYPTO_FIRST:
-        if (!shlib_load(path_crypto, &cryptolib)) {
+        if (!sd_load(path_crypto, &cryptolib, SD_SHLIB)) {
             fprintf(stderr, "Failed to load libcrypto\n");
             goto end;
         }
@@ -151,13 +91,13 @@
         /* Fall through */
 
     case SSL_FIRST:
-        if (!shlib_load(path_ssl, &ssllib)) {
+        if (!sd_load(path_ssl, &ssllib, SD_SHLIB)) {
             fprintf(stderr, "Failed to load libssl\n");
             goto end;
         }
         if (test_type != SSL_FIRST)
             break;
-        if (!shlib_load(path_crypto, &cryptolib)) {
+        if (!sd_load(path_crypto, &cryptolib, SD_SHLIB)) {
             fprintf(stderr, "Failed to load libcrypto\n");
             goto end;
         }
@@ -167,7 +107,7 @@
     if (test_type == NO_ATEXIT) {
         OPENSSL_init_crypto_t myOPENSSL_init_crypto;
 
-        if (!shlib_sym(cryptolib, "OPENSSL_init_crypto", &symbols[0].sym)) {
+        if (!sd_sym(cryptolib, "OPENSSL_init_crypto", &symbols[0].sym)) {
             fprintf(stderr, "Failed to load OPENSSL_init_crypto symbol\n");
             goto end;
         }
@@ -181,9 +121,9 @@
     if (test_type != JUST_CRYPTO
             && test_type != DSO_REFTEST
             && test_type != NO_ATEXIT) {
-        if (!shlib_sym(ssllib, "TLS_method", &symbols[0].sym)
-                || !shlib_sym(ssllib, "SSL_CTX_new", &symbols[1].sym)
-                || !shlib_sym(ssllib, "SSL_CTX_free", &symbols[2].sym)) {
+        if (!sd_sym(ssllib, "TLS_method", &symbols[0].sym)
+                || !sd_sym(ssllib, "SSL_CTX_new", &symbols[1].sym)
+                || !sd_sym(ssllib, "SSL_CTX_free", &symbols[2].sym)) {
             fprintf(stderr, "Failed to load libssl symbols\n");
             goto end;
         }
@@ -198,11 +138,11 @@
         mySSL_CTX_free(ctx);
     }
 
-    if (!shlib_sym(cryptolib, "ERR_get_error", &symbols[0].sym)
-           || !shlib_sym(cryptolib, "OPENSSL_version_major", &symbols[1].sym)
-           || !shlib_sym(cryptolib, "OPENSSL_version_minor", &symbols[2].sym)
-           || !shlib_sym(cryptolib, "OPENSSL_version_patch", &symbols[3].sym)
-           || !shlib_sym(cryptolib, "OPENSSL_atexit", &symbols[4].sym)) {
+    if (!sd_sym(cryptolib, "ERR_get_error", &symbols[0].sym)
+           || !sd_sym(cryptolib, "OPENSSL_version_major", &symbols[1].sym)
+           || !sd_sym(cryptolib, "OPENSSL_version_minor", &symbols[2].sym)
+           || !sd_sym(cryptolib, "OPENSSL_version_patch", &symbols[3].sym)
+           || !sd_sym(cryptolib, "OPENSSL_atexit", &symbols[4].sym)) {
         fprintf(stderr, "Failed to load libcrypto symbols\n");
         goto end;
     }
@@ -242,8 +182,8 @@
          * will always return an error, because DSO_pathbyaddr() is not
          * implemented there.
          */
-        if (!shlib_sym(cryptolib, "DSO_dsobyaddr", &symbols[0].sym)
-                || !shlib_sym(cryptolib, "DSO_free", &symbols[1].sym)) {
+        if (!sd_sym(cryptolib, "DSO_dsobyaddr", &symbols[0].sym)
+                || !sd_sym(cryptolib, "DSO_free", &symbols[1].sym)) {
             fprintf(stderr, "Unable to load DSO symbols\n");
             goto end;
         }
@@ -264,13 +204,13 @@
 # endif /* DSO_DLFCN */
     }
 
-    if (!shlib_close(cryptolib)) {
+    if (!sd_close(cryptolib)) {
         fprintf(stderr, "Failed to close libcrypto\n");
         goto end;
     }
 
     if (test_type == CRYPTO_FIRST || test_type == SSL_FIRST) {
-        if (!shlib_close(ssllib)) {
+        if (!sd_close(ssllib)) {
             fprintf(stderr, "Failed to close libssl\n");
             goto end;
         }
@@ -338,7 +278,7 @@
         return 1;
     }
 
-#if defined(DSO_DLFCN) || defined(DSO_WIN32)
+#ifdef SD_INIT
     if (!test_lib())
         return 1;
 #endif