On 23/04/2025 21:56, Andriy Gapon wrote:
BTW, I've been wondering how illumos avoids the problem even though they do not
use any special dlopen flags.
It turns out that they link almost all system shared libraries with -Bdirect
option (which is Solaris/illumos specific).
It's somewhat similar to, but different from, -Bsymbolic.
https://docs.oracle.com/cd/E23824_01/html/819-0690/aehzq.html#scrolltoc
https://docs.oracle.com/cd/E36784_01/html/E36857/gejfe.html
Oh, and it looks like there is an even better explanation for illumos.
There is a version map file for libdtrace which explicitly lists API functions
and makes everything else local.
https://github.com/illumos/illumos-gate/blob/master/usr/src/lib/libdtrace/common/mapfile-vers
I wonder why we didn't do the same when porting.
Maybe we should do that now?
I think that on FreeBSD we should use symbol visibility attributes or a symbol
map to hide (make local) symbols that are not expected to be interposed or have
a high chance to be interposed by accident.
IMO, yyparse should definitely get that treatment.
I think that approach would be better than magic rtld tricks.
Especially because the tricks do not work with the current rtld.
I'd rather make a change to libdtrace.so than to rtld.
This, while not as nice as the illumos solution, fixes my specific issue:
diff --git a/cddl/lib/libdtrace/Makefile b/cddl/lib/libdtrace/Makefile
index d086fffb07bc..58054d129b49 100644
--- a/cddl/lib/libdtrace/Makefile
+++ b/cddl/lib/libdtrace/Makefile
@@ -146,7 +146,8 @@ CFLAGS+= -fsanitize=address -fsanitize=undefined
LDFLAGS+= -fsanitize=address -fsanitize=undefined
.endif
-LIBADD= ctf elf proc pthread rtld_db xo
+VERSION_MAP= ${.CURDIR}/Symbol.map
+LIBADD= ctf elf proc pthread rtld_db xo
CLEANFILES= dt_errtags.c dt_names.c
diff --git a/cddl/lib/libdtrace/Symbol.map b/cddl/lib/libdtrace/Symbol.map
new file mode 100644
index 000000000000..89ee9de65209
--- /dev/null
+++ b/cddl/lib/libdtrace/Symbol.map
@@ -0,0 +1,4 @@
+{
+ local:
+ yy*;
+};
--
Andriy Gapon