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"} ]}.
