On Thu, Apr 24, 2025 at 08:56:44AM +0300, Andriy Gapon wrote: > 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 don't have any objection, but I believe adding a version map after the fact doesn't accomplish much, assuming that we care deeply about ABI stability in libdtrace.so (I'm not sure we do though). > > 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*; > +}; This just gives the lexer/parser symbols in libdtrace.so local visibility? I think that's fine.