File 0173-erts-Use-fvisibility-hidden-on-entire-beam-executabl.patch of Package erlang

From ef687ab0ae3901da507bdedbaced1a65af6c286c Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Tue, 13 May 2025 17:08:40 +0200
Subject: [PATCH 3/5] erts: Use -fvisibility=hidden on entire beam executable

To not pollute the exported name space of the beam
and avoid name clashes with linked in NIFs and drivers.

mtx_SUITE had to be fixed. It now accesses the internal ethread API
via a new peephole in erl_internal_test.h (even on Windows).
---
 erts/configure                                | 18 ++---
 erts/configure.ac                             | 11 +--
 erts/emulator/Makefile.in                     |  9 ++-
 erts/emulator/beam/erl_alloc.h                |  2 +
 erts/emulator/beam/erl_driver.h               | 27 ++++----
 erts/emulator/beam/erl_drv_nif.h              | 10 +++
 erts/emulator/beam/erl_internal_test.c        | 47 +++++++++++++
 erts/emulator/beam/erl_internal_test.h        | 62 +++++++++++++++++
 erts/emulator/beam/erl_nif.h                  | 17 ++---
 erts/emulator/pcre/pcre.mk                    |  2 +-
 erts/emulator/sys/win32/erl_win32_sys_ddll.c  |  2 +
 erts/emulator/test/mtx_SUITE.erl              |  8 +--
 erts/emulator/test/mtx_SUITE_data/mtx_SUITE.c | 68 ++++++-------------
 erts/emulator/zstd/zstd.mk                    |  5 +-
 14 files changed, 193 insertions(+), 95 deletions(-)
 create mode 100644 erts/emulator/beam/erl_internal_test.c
 create mode 100644 erts/emulator/beam/erl_internal_test.h

diff --git a/erts/configure b/erts/configure
index 74b24de63a..ed711cac44 100755
--- a/erts/configure
+++ b/erts/configure
@@ -704,7 +704,6 @@ XCRUN
 LLVM_PROFDATA
 WFLAGS
 DEBUG_FLAGS
-VISIBILITY_HIDDEN
 ERTS_CONFIG_H_IDIR
 MIXED_MINGW
 MIXED_VC
@@ -8554,13 +8553,13 @@ esac
 fi
 
 
-  # Make -fvisibility=hidden usable if supported. Currently only used by
-  # our PCRE2 to avoid symbol clashes with real PCRE2 if dynamically loaded.
+  # Use -fvisibility=hidden to only export selected symbols
+  # such as NIF and driver APIs.
 
-    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -fvisibility=hidden to VISIBILITY_HIDDEN (via CFLAGS)" >&5
-printf %s "checking if we can add -fvisibility=hidden to VISIBILITY_HIDDEN (via CFLAGS)... " >&6; }
+    { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -fvisibility=hidden to CFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -fvisibility=hidden to CFLAGS (via CFLAGS)... " >&6; }
     saved_CFLAGS=$CFLAGS;
-    CFLAGS="-Werror -fvisibility=hidden $VISIBILITY_HIDDEN";
+    CFLAGS="-Werror -fvisibility=hidden $CFLAGS";
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -8584,7 +8583,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
     if test "X$can_enable_flag" = "Xtrue"
 then :
 
-        VISIBILITY_HIDDEN="-fvisibility=hidden $VISIBILITY_HIDDEN"
+        CFLAGS="-fvisibility=hidden $CFLAGS"
         { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 printf "%s\n" "yes" >&6; }
 
@@ -8596,17 +8595,18 @@ printf "%s\n" "no" >&6; }
 esac
 fi
 
+  if test "$can_enable_flag" = false; then
+    as_fn_error $? "Compiler option -fvisibility=hidden not supported" "$LINENO" 5
+  fi
 
 else case e in #(
   e)
   WFLAGS=""
   WERRORFLAGS=${WERRORFLAGS:-""}
-  VISIBILITY_HIDDEN=""
   ;;
 esac
 fi
 
-
 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking C99 support" >&5
 printf %s "checking C99 support... " >&6; }
 
diff --git a/erts/configure.ac b/erts/configure.ac
index 9ed8c5e398..fa987f1842 100644
--- a/erts/configure.ac
+++ b/erts/configure.ac
@@ -607,16 +607,17 @@ AS_IF([test "x$GCC" = xyes],
   # such dubious duplicates.
   LM_TRY_ENABLE_CFLAG([-fno-common], [CFLAGS])
 
-  # Make -fvisibility=hidden usable if supported. Currently only used by
-  # our PCRE2 to avoid symbol clashes with real PCRE2 if dynamically loaded.
-  LM_TRY_ENABLE_CFLAG([-fvisibility=hidden], [VISIBILITY_HIDDEN])
+  # Use -fvisibility=hidden to only export selected symbols
+  # such as NIF and driver APIs.
+  LM_TRY_ENABLE_CFLAG([-fvisibility=hidden], [CFLAGS])
+  if test "$can_enable_flag" = false; then
+    AC_MSG_ERROR([Compiler option -fvisibility=hidden not supported])
+  fi
  ],
  [
   WFLAGS=""
   WERRORFLAGS=${WERRORFLAGS:-""}
-  VISIBILITY_HIDDEN=""
  ])
-AC_SUBST(VISIBILITY_HIDDEN)
 
 AC_MSG_CHECKING([C99 support])
 
diff --git a/erts/emulator/Makefile.in b/erts/emulator/Makefile.in
index 5d6c12c8a5..f79481cb48 100644
--- a/erts/emulator/Makefile.in
+++ b/erts/emulator/Makefile.in
@@ -36,7 +36,6 @@ Z_LIB=@Z_LIB@
 CROSS_COMPILING = @CROSS_COMPILING@
 NO_INLINE_FUNCTIONS=false
 USING_VC=@MIXED_VC@
-VISIBILITY_HIDDEN=@VISIBILITY_HIDDEN@
 
 OPCODE_TABLES = \
     $(ERL_TOP)/lib/compiler/src/genop.tab \
@@ -550,6 +549,9 @@ include $(ERL_TOP)/make/otp_release_targets.mk
 RELSYSDIR = $(RELEASE_PATH)/erts-$(VSN)
 
 RELEASE_INCLUDES = beam/erl_driver.h sys/$(ERLANG_OSTYPE)/driver_int.h beam/erl_nif.h beam/erl_nif_api_funcs.h beam/erl_drv_nif.h
+
+INTERNAL_RELEASE_INCLUDES = beam/erl_internal_test.h
+
 ifeq ($(TARGET),win32)
 RELEASE_INCLUDES += sys/$(ERLANG_OSTYPE)/erl_win_dyn_driver.h
 endif
@@ -563,12 +565,14 @@ release_spec: all
 	$(INSTALL_DIR) "$(RELSYSDIR)"
 	$(INSTALL_DIR) "$(RELSYSDIR)/src"
 	$(INSTALL_DIR) "$(RELSYSDIR)/include"
+	$(INSTALL_DIR) "$(RELSYSDIR)/include/internal"
 	$(INSTALL_DIR) "$(RELSYSDIR)/man"
 	$(INSTALL_DIR) "$(RELSYSDIR)/doc"
 	$(INSTALL_DIR) "$(RELSYSDIR)/bin"
 	$(INSTALL_DIR) "$(RELEASE_PATH)/usr/include"
 	$(INSTALL_DATA) $(RELEASE_INCLUDES) "$(RELEASE_PATH)/usr/include"
 	$(INSTALL_DATA) $(RELEASE_INCLUDES) "$(RELSYSDIR)/include"
+	$(INSTALL_DATA) $(INTERNAL_RELEASE_INCLUDES) "$(RELSYSDIR)/include/internal"
 	$(INSTALL_PROGRAM) $(BINDIR)/$(EMULATOR_EXECUTABLE) "$(RELSYSDIR)/bin"
 ifeq ($(TARGET),win32)
 	$(INSTALL_DATA) $(BINDIR)/$(EMULATOR_EXECUTABLE:.dll=.pdb) "$(RELSYSDIR)/bin"
@@ -1160,7 +1164,8 @@ RUN_OBJS += \
 	$(OBJDIR)/erl_term_hashing.o \
 	$(OBJDIR)/erl_bif_coverage.o \
 	$(OBJDIR)/erl_iolist.o \
-	$(OBJDIR)/erl_etp.o
+	$(OBJDIR)/erl_etp.o \
+	$(OBJDIR)/erl_internal_test.o
 
 LTTNG_OBJS = $(OBJDIR)/erlang_lttng.o
 
diff --git a/erts/emulator/beam/erl_alloc.h b/erts/emulator/beam/erl_alloc.h
index 3838527ab7..0153de85c1 100644
--- a/erts/emulator/beam/erl_alloc.h
+++ b/erts/emulator/beam/erl_alloc.h
@@ -118,6 +118,8 @@ void erts_alloc_late_init(void);
 
 #if defined(GET_ERTS_ALC_TEST) || defined(ERTS_ALC_INTERNAL__)
 /* Only for testing */
+#include "erl_drv_nif.h"
+ERL_NAPI_EXPORT
 UWord erts_alc_test(UWord,
 		    UWord,
 		    UWord,
diff --git a/erts/emulator/beam/erl_driver.h b/erts/emulator/beam/erl_driver.h
index 2c65137d9a..8d739f8d6b 100644
--- a/erts/emulator/beam/erl_driver.h
+++ b/erts/emulator/beam/erl_driver.h
@@ -44,19 +44,18 @@
 #include <stdlib.h>
 
 #if defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_)
-#ifndef STATIC_ERLANG_DRIVER
-   /* Windows dynamic drivers, everything is different... */
-#define ERL_DRIVER_TYPES_ONLY
-#define WIN32_DYNAMIC_ERL_DRIVER
-#endif
+#  ifndef STATIC_ERLANG_DRIVER
+     /* Windows dynamic drivers, everything is different... */
+#    define ERL_DRIVER_TYPES_ONLY
+#    define WIN32_DYNAMIC_ERL_DRIVER
+#  endif
+#  define EXTERN extern
+#else
+#  define EXTERN ERL_NAPI_EXPORT extern
 #endif
 
-#ifndef EXTERN
-#  ifdef __cplusplus
-#    define EXTERN extern "C"
-#  else
-#    define EXTERN extern
-#  endif
+#ifdef __cplusplus
+extern "C" {
 #endif
 
 #define ERL_DRV_READ  ((int)ERL_NIF_SELECT_READ)
@@ -550,7 +549,7 @@ EXTERN ErlDrvTermData driver_mk_atom(char*);
 EXTERN ErlDrvTermData driver_mk_port(ErlDrvPort);
 EXTERN ErlDrvTermData driver_connected(ErlDrvPort);
 EXTERN ErlDrvTermData driver_caller(ErlDrvPort);
-extern const ErlDrvTermData driver_term_nil;
+EXTERN const ErlDrvTermData driver_term_nil;
 EXTERN ErlDrvTermData driver_mk_term_nil(void);
 EXTERN ErlDrvPort driver_create_port(ErlDrvPort creator_port, 
 				     ErlDrvTermData connected, /* pid */
@@ -636,7 +635,11 @@ EXTERN void erl_drv_set_os_pid(ErlDrvPort ix, ErlDrvSInt pid);
 #  include "erl_win_dyn_driver.h"
 #endif
 
+#ifdef __cplusplus
+} //extern "C"
 #endif
 
+#endif //__ERL_DRIVER_H__
+
 /* also in global.h, but driver's can't include global.h */
 void dtrace_drvport_str(ErlDrvPort port, char *port_buf);
diff --git a/erts/emulator/beam/erl_drv_nif.h b/erts/emulator/beam/erl_drv_nif.h
index e98b3c1ad9..7d2ce03f9c 100644
--- a/erts/emulator/beam/erl_drv_nif.h
+++ b/erts/emulator/beam/erl_drv_nif.h
@@ -224,4 +224,14 @@ typedef struct {
 #  endif
 #endif
 
+#if (defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_))
+#  define ERL_NAPI_EXPORT __declspec(dllexport)
+#elif defined(__GNUC__) && __GNUC__ >= 4
+#  define ERL_NAPI_EXPORT __attribute__ ((visibility("default")))
+#elif defined (__SUNPRO_C) && (__SUNPRO_C >= 0x550)
+#  define ERL_NAPI_EXPORT __global
+#else
+#  define ERL_NAPI_EXPORT
+#endif
+
 #endif  /* __ERL_DRV_NIF_H__ */
diff --git a/erts/emulator/beam/erl_internal_test.c b/erts/emulator/beam/erl_internal_test.c
new file mode 100644
index 0000000000..5e6e84a198
--- /dev/null
+++ b/erts/emulator/beam/erl_internal_test.c
@@ -0,0 +1,47 @@
+/*
+ * %CopyrightBegin%
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Copyright Ericsson AB 2025. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * %CopyrightEnd%
+ */
+
+/*
+ *  A peephole to access selected internal symbols (functions) for testing
+ *  without having to pollute the name space of exported symbols.
+ */
+#include "erl_internal_test.h"
+#include "erl_misc_utils.h"
+
+const ErtsInternalTest erts_internal_test_instance = {
+    .erts_milli_sleep = &erts_milli_sleep,
+    .ethr_atomic_dec = &ethr_atomic_dec,
+    .ethr_atomic_inc = &ethr_atomic_inc,
+    .ethr_atomic_init = &ethr_atomic_init,
+    .ethr_atomic_read = &ethr_atomic_read,
+    .ethr_atomic_set = &ethr_atomic_set,
+    .ethr_rwmutex_destroy = &ethr_rwmutex_destroy,
+    .ethr_rwmutex_init_opt = &ethr_rwmutex_init_opt,
+    .ethr_rwmutex_rlock = &ethr_rwmutex_rlock,
+    .ethr_rwmutex_runlock = &ethr_rwmutex_runlock,
+    .ethr_rwmutex_rwlock = &ethr_rwmutex_rwlock,
+    .ethr_rwmutex_rwunlock = &ethr_rwmutex_rwunlock,
+    .ethr_rwmutex_tryrlock = &ethr_rwmutex_tryrlock,
+    .ethr_rwmutex_tryrwlock = &ethr_rwmutex_tryrwlock,
+    .ethr_thr_create = &ethr_thr_create,
+    .ethr_thr_join = &ethr_thr_join
+};
diff --git a/erts/emulator/beam/erl_internal_test.h b/erts/emulator/beam/erl_internal_test.h
new file mode 100644
index 0000000000..282096675c
--- /dev/null
+++ b/erts/emulator/beam/erl_internal_test.h
@@ -0,0 +1,62 @@
+/*
+ * %CopyrightBegin%
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Copyright Ericsson AB 2025. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * %CopyrightEnd%
+ */
+
+/*
+ *  A peephole to access selected internal symbols (functions) for testing
+ *  without having to pollute the name space of exported symbols.
+ */
+#ifndef ERL_INTERNAL_TEST_H
+#define ERL_INTERNAL_TEST_H
+
+#include "erl_drv_nif.h"
+#include "ethread.h"
+
+typedef struct {
+    int (*erts_milli_sleep)(long);
+    void (*ethr_atomic_dec)(ethr_atomic_t *var);
+    void (*ethr_atomic_inc)(ethr_atomic_t *var);
+    void (*ethr_atomic_init)(ethr_atomic_t *var, ethr_sint_t val);
+    ethr_sint_t (*ethr_atomic_read)(ethr_atomic_t *var);
+    void (*ethr_atomic_set)(ethr_atomic_t *var, ethr_sint_t val);
+    int (*ethr_rwmutex_destroy)(ethr_rwmutex *);
+    int (*ethr_rwmutex_init_opt)(ethr_rwmutex *, ethr_rwmutex_opt *);
+    void (*ethr_rwmutex_rlock)(ethr_rwmutex *);
+    void (*ethr_rwmutex_runlock)(ethr_rwmutex *);
+    void (*ethr_rwmutex_rwlock)(ethr_rwmutex *);
+    void (*ethr_rwmutex_rwunlock)(ethr_rwmutex *);
+    int (*ethr_rwmutex_tryrlock)(ethr_rwmutex *);
+    int (*ethr_rwmutex_tryrwlock)(ethr_rwmutex *);
+    int (*ethr_thr_create)(ethr_tid *, void * (*)(void *), void *, ethr_thr_opts *);
+    int (*ethr_thr_join)(ethr_tid, void **);
+}ErtsInternalTest;
+
+#if (defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_))
+extern const ErtsInternalTest erts_internal_test_instance;
+#  define erts_internal_test (*(const ErtsInternalTest*)(WinDynNifCallbacks.erts_internal_test_ptr))
+#else
+ERL_NAPI_EXPORT
+extern const ErtsInternalTest erts_internal_test_instance;
+#  define erts_internal_test erts_internal_test_instance
+#endif
+
+
+#endif // ERL_INTERNAL_TEST_H
diff --git a/erts/emulator/beam/erl_nif.h b/erts/emulator/beam/erl_nif.h
index 72f97a3979..d2ff316f03 100644
--- a/erts/emulator/beam/erl_nif.h
+++ b/erts/emulator/beam/erl_nif.h
@@ -345,6 +345,7 @@ typedef enum {
 typedef struct {
 #  include "erl_nif_api_funcs.h"
    void* erts_alc_test;
+   const void* erts_internal_test_ptr;
 } TWinDynNifCallbacks;
 extern TWinDynNifCallbacks WinDynNifCallbacks;
 #  undef ERL_NIF_API_FUNC_DECL
@@ -371,7 +372,11 @@ extern void enif_rwlock_destroy(ErlNifRWLock *rwlck);
 extern void enif_thread_opts_destroy(ErlNifThreadOpts *opts);
 extern void enif_ioq_destroy(ErlNifIOQueue *q);
 
-#  define ERL_NIF_API_FUNC_DECL(RET_TYPE, NAME, ARGS) extern RET_TYPE NAME ARGS
+#  if (defined(__WIN32__) || defined(_WIN32) || defined(_WIN32_))
+#    define ERL_NIF_API_FUNC_DECL(RET_TYPE, NAME, ARGS) extern RET_TYPE NAME ARGS
+#  else
+#    define ERL_NIF_API_FUNC_DECL(RET_TYPE, NAME, ARGS) ERL_NAPI_EXPORT extern RET_TYPE NAME ARGS
+#  endif
 #  include "erl_nif_api_funcs.h"
 #  undef ERL_NIF_API_FUNC_DECL
 #endif
@@ -380,18 +385,10 @@ extern void enif_ioq_destroy(ErlNifIOQueue *q);
 #  define ERL_NIF_INIT_GLOB TWinDynNifCallbacks WinDynNifCallbacks;
 #  define ERL_NIF_INIT_ARGS TWinDynNifCallbacks* callbacks
 #  define ERL_NIF_INIT_BODY memcpy(&WinDynNifCallbacks,callbacks,sizeof(TWinDynNifCallbacks))
-#  define ERL_NIF_INIT_EXPORT __declspec(dllexport)
 #else 
 #  define ERL_NIF_INIT_GLOB
 #  define ERL_NIF_INIT_ARGS void
 #  define ERL_NIF_INIT_BODY
-#  if defined(__GNUC__) && __GNUC__ >= 4
-#    define ERL_NIF_INIT_EXPORT __attribute__ ((visibility("default")))
-#  elif defined (__SUNPRO_C) && (__SUNPRO_C >= 0x550)
-#    define ERL_NIF_INIT_EXPORT __global
-#  else
-#    define ERL_NIF_INIT_EXPORT
-#  endif
 #endif
 
 
@@ -407,7 +404,7 @@ extern void enif_ioq_destroy(ErlNifIOQueue *q);
           ErlNifEntry* ERL_NIF_INIT_NAME(MODNAME)(ERL_NIF_INIT_ARGS)
 #else
 #  define ERL_NIF_INIT_DECL(MODNAME) \
-          ERL_NIF_INIT_EXPORT ErlNifEntry* nif_init(ERL_NIF_INIT_ARGS)
+          ERL_NAPI_EXPORT ErlNifEntry* nif_init(ERL_NIF_INIT_ARGS)
 #endif
 
 
diff --git a/erts/emulator/pcre/pcre.mk b/erts/emulator/pcre/pcre.mk
index 1c83084995..e38d7fbc63 100644
--- a/erts/emulator/pcre/pcre.mk
+++ b/erts/emulator/pcre/pcre.mk
@@ -54,7 +54,7 @@ PCRE_OBJDIR = $(ERL_TOP)/erts/emulator/pcre/obj/$(TARGET)/$(TYPE)
 
 PCRE_DIR =  $(ERL_TOP)/erts/emulator/pcre
 
-PCRE_CFLAGS = $(filter-out -Wimplicit-fallthrough,$(CFLAGS)) $(VISIBILITY_HIDDEN) -DERLANG_INTEGRATION
+PCRE_CFLAGS = $(filter-out -Wimplicit-fallthrough,$(CFLAGS)) -DERLANG_INTEGRATION
 
 ifeq ($(TARGET), win32)
 $(EPCRE_LIB): $(PCRE_OBJS)
diff --git a/erts/emulator/sys/win32/erl_win32_sys_ddll.c b/erts/emulator/sys/win32/erl_win32_sys_ddll.c
index c3fc10b621..792788874b 100644
--- a/erts/emulator/sys/win32/erl_win32_sys_ddll.c
+++ b/erts/emulator/sys/win32/erl_win32_sys_ddll.c
@@ -39,6 +39,7 @@
 #include "erl_win_dyn_driver.h"
 
 #include "erl_nif.h"
+#include "erl_internal_test.h"
 
 #define EXT_LEN          4
 #define FILE_EXT_WCHAR   L".dll"
@@ -63,6 +64,7 @@ void erl_sys_ddll_init(void) {
 #include "erl_nif_api_funcs.h"
 #undef ERL_NIF_API_FUNC_DECL
     nif_callbacks.erts_alc_test = erts_alc_test;
+    nif_callbacks.erts_internal_test_ptr = &erts_internal_test_instance;
  
     return;
 }
diff --git a/erts/emulator/test/mtx_SUITE.erl b/erts/emulator/test/mtx_SUITE.erl
index 95458a4162..8d6d335341 100644
--- a/erts/emulator/test/mtx_SUITE.erl
+++ b/erts/emulator/test/mtx_SUITE.erl
@@ -82,12 +82,8 @@ all() ->
 init_per_suite(Config) when is_list(Config) ->
     DataDir = proplists:get_value(data_dir, Config),
     Lib = filename:join([DataDir, atom_to_list(?MODULE)]),
-    case {erlang:load_nif(Lib, none),erlang:system_info(threads)} of
-	{{error,_},false} ->
-	    {skip, "No thread support"};
-	_ ->
-	    Config
-    end.
+    ok = erlang:load_nif(Lib, none),
+    Config.
 
 end_per_suite(Config) when is_list(Config) ->
     catch erts_debug:set_internal_state(available_internal_state, false),
diff --git a/erts/emulator/test/mtx_SUITE_data/mtx_SUITE.c b/erts/emulator/test/mtx_SUITE_data/mtx_SUITE.c
index 0b39857398..54ba1ce71e 100644
--- a/erts/emulator/test/mtx_SUITE_data/mtx_SUITE.c
+++ b/erts/emulator/test/mtx_SUITE_data/mtx_SUITE.c
@@ -27,6 +27,7 @@
  */
 
 #include <erl_nif.h>
+#include <erl_internal_test.h>
 
 #ifdef __WIN32__
 #  ifndef WIN32_LEAN_AND_MEAN
@@ -34,8 +35,6 @@
 #  endif
 #  include <windows.h>
 #else
-#  include "ethread.h"
-#  include "erl_misc_utils.h"
 #  include <unistd.h>
 #endif
 
@@ -49,33 +48,6 @@ fail(const char *file, int line, const char *function, const char *assertion);
 #undef ASSERT
 #define ASSERT(X) ((void) ((X) ? 1 : fail(__FILE__, __LINE__, __func__, #X)))
 
-#ifdef __WIN32__
-/*
- * We cannot access the ethread symbols directly; test
- * what we got in the nif api instead...
- */
-#define HAVE_FREQREAD_SUPPORT 0
-#define RWMUTEX_T ErlNifRWLock
-#define RWMUTEX_CREATE(FR) enif_rwlock_create("dummy")
-#define RWMUTEX_DESTROY enif_rwlock_destroy
-#define RWMUTEX_WLOCK enif_rwlock_rwlock
-#define RWMUTEX_TRYWLOCK enif_rwlock_tryrwlock
-#define RWMUTEX_WUNLOCK enif_rwlock_rwunlock
-#define RWMUTEX_TRYRLOCK enif_rwlock_tryrlock
-#define RWMUTEX_RLOCK enif_rwlock_rlock
-#define RWMUTEX_RUNLOCK enif_rwlock_runlock
-#define THR_ID ErlNifTid
-#define THR_CREATE(A, B, C, D) enif_thread_create("dummy", (A), (B), (C), (D))
-#define THR_JOIN enif_thread_join
-#define ATOMIC_T volatile LONG
-#define ATOMIC_INIT(VarP, Val) (*(VarP) = (Val))
-#define ATOMIC_SET(VarP, Val) (*(VarP) = (Val))
-#define ATOMIC_READ(VarP) (*(VarP))
-#define ATOMIC_INC InterlockedIncrement
-#define ATOMIC_DEC InterlockedDecrement
-
-#else
-
 #ifdef ETHR_USE_OWN_RWMTX_IMPL__
 #  define HAVE_FREQREAD_SUPPORT 1
 #else
@@ -91,32 +63,30 @@ RWMUTEX_CREATE(int freqread)
     if (freqread)
 	rwmtx_opt.type = ETHR_RWMUTEX_TYPE_FREQUENT_READ;
     ASSERT(rwmtx);
-    ASSERT(ethr_rwmutex_init_opt(rwmtx, &rwmtx_opt) == 0);
+    ASSERT(erts_internal_test.ethr_rwmutex_init_opt(rwmtx, &rwmtx_opt) == 0);
     return rwmtx;
 }
 static void
 RWMUTEX_DESTROY(ethr_rwmutex *rwmtx)
 {
-    ASSERT(ethr_rwmutex_destroy(rwmtx) == 0);
+    ASSERT(erts_internal_test.ethr_rwmutex_destroy(rwmtx) == 0);
     enif_free(rwmtx);
 }
-#define RWMUTEX_TRYWLOCK ethr_rwmutex_tryrwlock
-#define RWMUTEX_WLOCK ethr_rwmutex_rwlock
-#define RWMUTEX_WUNLOCK ethr_rwmutex_rwunlock
-#define RWMUTEX_TRYRLOCK ethr_rwmutex_tryrlock
-#define RWMUTEX_RLOCK ethr_rwmutex_rlock
-#define RWMUTEX_RUNLOCK ethr_rwmutex_runlock
-#define THR_ID ethr_tid
-#define THR_CREATE ethr_thr_create
-#define THR_JOIN ethr_thr_join
-#define ATOMIC_T ethr_atomic_t
-#define ATOMIC_INIT ethr_atomic_init
-#define ATOMIC_SET ethr_atomic_set
-#define ATOMIC_READ ethr_atomic_read
-#define ATOMIC_INC ethr_atomic_inc
-#define ATOMIC_DEC ethr_atomic_dec
-
-#endif
+#define RWMUTEX_TRYWLOCK erts_internal_test.ethr_rwmutex_tryrwlock
+#define RWMUTEX_WLOCK    erts_internal_test.ethr_rwmutex_rwlock
+#define RWMUTEX_WUNLOCK  erts_internal_test.ethr_rwmutex_rwunlock
+#define RWMUTEX_TRYRLOCK erts_internal_test.ethr_rwmutex_tryrlock
+#define RWMUTEX_RLOCK    erts_internal_test.ethr_rwmutex_rlock
+#define RWMUTEX_RUNLOCK  erts_internal_test.ethr_rwmutex_runlock
+#define THR_ID           ethr_tid
+#define THR_CREATE       erts_internal_test.ethr_thr_create
+#define THR_JOIN         erts_internal_test.ethr_thr_join
+#define ATOMIC_T         ethr_atomic_t
+#define ATOMIC_INIT      erts_internal_test.ethr_atomic_init
+#define ATOMIC_SET       erts_internal_test.ethr_atomic_set
+#define ATOMIC_READ      erts_internal_test.ethr_atomic_read
+#define ATOMIC_INC       erts_internal_test.ethr_atomic_inc
+#define ATOMIC_DEC       erts_internal_test.ethr_atomic_dec
 
 
 #if !defined(__func__)
@@ -687,7 +657,7 @@ milli_sleep(int ms)
 #ifdef __WIN32__
     Sleep(ms);
 #else
-    while (erts_milli_sleep(ms) != 0);
+    while (erts_internal_test.erts_milli_sleep(ms) != 0);
 #endif
 }
 
diff --git a/erts/emulator/zstd/zstd.mk b/erts/emulator/zstd/zstd.mk
index 5e8162164c..d3725debb0 100644
--- a/erts/emulator/zstd/zstd.mk
+++ b/erts/emulator/zstd/zstd.mk
@@ -62,7 +62,10 @@ endif # asan
 endif # debug
 endif # gcov
 
-ZSTD_CFLAGS+=-MMD -MP
+ZSTD_CFLAGS += -MMD -MP
+
+# Set VISIBLE's to empty to NOT export any symbols for dynamic linking
+ZSTD_CFLAGS += -DZSTDLIB_VISIBLE= -DZSTDERRORLIB_VISIBLE=
 
 ifeq ($(TARGET), win32)
 $(ZSTD_LIBRARY): $(ZSTD_OBJS)
-- 
2.51.0

openSUSE Build Service is sponsored by