Date: Sat, 19 Apr 2025 02:41:19 +0300 From: Konstantin Belousov <kostikbel@gmail.com> To: Andriy Gapon <avg@freebsd.org> Cc: FreeBSD Current <current@freebsd.org> Subject: Re: RTLD_DEEPBIND question Message-ID: <aALjHwFnFKChuAdR@kib.kiev.ua> In-Reply-To: <0b3dda4e-53e4-40e5-9484-8b5ffb84e658@FreeBSD.org>
index | next in thread | previous in thread | raw e-mail
On Sat, Apr 19, 2025 at 01:03:15AM +0300, Andriy Gapon wrote: > > I am trying to understand if RTLD_DEEPBIND should help in the following > scenario or if I misunderstand its purpose. > > There is a program that has a parser based on lex/yacc, so there is function > yyparse in the code and global text symbol yyparse in the binary. > > The program can load shared objects (plugins) using dlopen. > > One of the plugins is linked with a shared library... actually with libdtrace.so. > The library has its own parser (for DTrace language) and it also has yyparse > global text symbol. > > There is a problem that when the program dlopen-s the plugin and calls its > code the yyparse calls in libdtrace get resolved to the yyparse function in > the program itself, not in libdtrace. > This is, of course, not unexpected according to how dlopen works. > > However, I expected that if I add RTLD_DEEPBIND to the dlopen call that > loads the plugin then libdtrace's yyparse calls would get resolved to the > libdtrace yyparse because they all are in the same dependency subtree. > > But adding RTLD_DEEPBIND does not seem to help, libdtrace yyparse calls are > still resolved to the main binary's yyparse. Could it be that the module is linked to the main binary? RTLD_DEEPBIND works by first iterating over all (recursive) DT_NEEEDED object for the object where the symbol is resolved, then by looking at the global list of loaded objects. Non-deepbind resolution is performed by looking at the global list. You can see it in the rtld.c:symlook_default(). Also it might be useful to set LD_DEBUG=1 and read the debugging output from rtld. > > I should also note that the main binary does not have any dependency on > libdtrace. It comes into picture only through the plugin. > > P.S. > I think that the issue could be resolved by building libdtrace differently, > so that its yyparse is resolved at link time and is not treated as a global > symbol. > And I think that we should probably do it. > However, I am still curious if RTLD_DEEPBIND should have helped here. > > Thank you. > -- > Andriy Gapon >home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?aALjHwFnFKChuAdR>
