This is an automated email from the ASF dual-hosted git repository.

vatamane pushed a commit to branch use-fvisibility-hidden-for-c-bits
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit a249e4bc3238918644569d974eb3e6fa9dcdc104
Author: Nick Vatamaniuc <[email protected]>
AuthorDate: Wed Mar 4 22:12:04 2026 -0500

    Use fvisibility=hidden for some C bits
    
    Use `-fvisibility=hidden` to prevent potential suprises on MacOS. This is 
the
    same fix applied to `jiffy` in [1].
    
    The reason this is a MacOS-only issue is that `dlopen()` MacOS defaults to
    `RTLD_GLOBAL`, and on Linux it defaults to `RTLD_LOCAL`. Since Erlang/OTP 
NIF
    `dlopen()` doesn't explicitly pass in this flag, the defaults take effect.
    
    `RTLD_GLOBAL` flag makes the symbols from the newly `dlopen()`-ed module
    available for the global symbol resolution. So, if some library in MacOS 
starts
    using xxhash, our exxhash NIF symbols may may start to collide with thier
    version and possibly break things. This PR should hopefully prevent such
    surprises.
    
    [1] https://github.com/davisp/jiffy/pull/245.
---
 src/b64url/rebar.config               | 2 +-
 src/couch/rebar.config.script         | 4 ++--
 src/couch_quickjs/rebar.config.script | 2 +-
 src/exxhash/rebar.config              | 2 +-
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/b64url/rebar.config b/src/b64url/rebar.config
index d9512aed3..f21ec9590 100644
--- a/src/b64url/rebar.config
+++ b/src/b64url/rebar.config
@@ -22,7 +22,7 @@
     % {".*", "CFLAGS", "$CFLAGS -g -Wall -Werror -fPIC"}
 
     % Production compilation
-    {"(linux|solaris|darwin|freebsd)", "CFLAGS", "$CFLAGS -Wall -Werror 
-DNDEBUG -O3"},
+    {"(linux|solaris|darwin|freebsd)", "CFLAGS", "$CFLAGS -Wall -Werror 
-DNDEBUG -O3 -fvisibility=hidden"},
     {"win32", "CFLAGS", "$CFLAGS /O2 /DNDEBUG /Wall"}
 ]}.
 
diff --git a/src/couch/rebar.config.script b/src/couch/rebar.config.script
index f64f2268b..558825f88 100644
--- a/src/couch/rebar.config.script
+++ b/src/couch/rebar.config.script
@@ -275,7 +275,7 @@ IcuLibPath = case WithBrew of
     true -> "-L" ++ string:trim(os:cmd(BrewIcuPrefixCmd)) ++ "/lib"
 end.
 
-IcuEnv = [{"DRV_CFLAGS",  "$DRV_CFLAGS -DPIC -O2 -fno-common"},
+IcuEnv = [{"DRV_CFLAGS",  "$DRV_CFLAGS -DPIC -O2 -fno-common 
-fvisibility=hidden"},
           {"DRV_LDFLAGS", "$DRV_LDFLAGS -lm -licuuc -licudata -licui18n 
-lpthread"},
           {"LDFLAGS", "$LDFLAGS"},
           {"CFLAGS", "$CFLAGS"}].
@@ -289,7 +289,7 @@ IcuWinEnv = [{"CFLAGS", "$DRV_CFLAGS /DXP_WIN"},
 ComparePath = "priv/couch_ejson_compare.so".
 CompareSrc = ["priv/couch_ejson_compare/*.c"].
 
-CouchCFileEnv = [{"CFLAGS", "$CFLAGS -Wall -Werror -DNDEBUG -O3"}].
+CouchCFileEnv = [{"CFLAGS", "$CFLAGS -Wall -Werror -DNDEBUG -O3 
-fvisibility=hidden"}].
 CouchCFilePath = "priv/couch_cfile.so".
 CouchCFileSrc = ["priv/couch_cfile/*.c"].
 
diff --git a/src/couch_quickjs/rebar.config.script 
b/src/couch_quickjs/rebar.config.script
index f6546e999..08e12a0cc 100644
--- a/src/couch_quickjs/rebar.config.script
+++ b/src/couch_quickjs/rebar.config.script
@@ -44,7 +44,7 @@ ResetFlags = [
 ].
 
 UnixEnv = [
-    {"CFLAGS", "$CFLAGS -g -Wall -O2 -Iquickjs"},
+    {"CFLAGS", "$CFLAGS -g -Wall -O2 -Iquickjs -fvisibility=hidden"},
     {"LDFLAGS", "$LDFLAGS quickjs/libquickjs.a -lpthread -lm"}
 ] ++ ResetFlags.
 
diff --git a/src/exxhash/rebar.config b/src/exxhash/rebar.config
index d33bd0b5f..17d73c7a4 100644
--- a/src/exxhash/rebar.config
+++ b/src/exxhash/rebar.config
@@ -22,7 +22,7 @@
     % {".*", "CFLAGS", "$CFLAGS -g -Wall -Werror -fPIC"}
 
     % Production compilation
-    {"(linux|solaris|darwin|freebsd)", "CFLAGS", "$CFLAGS -Wall -Werror 
-DNDEBUG -O3"},
+    {"(linux|solaris|darwin|freebsd)", "CFLAGS", "$CFLAGS -Wall -Werror 
-DNDEBUG -O3 -fvisibility=hidden"},
     {"win32", "CFLAGS", "$CFLAGS /O2 /DNDEBUG /Wall"}
 ]}.
 

Reply via email to