Just checked out docs for dlsym() and they do match what you found:

dlsym() returns the address of the code or data location specified by the 
null-terminated character string 
symbol.  Which libraries and bundles are searched depends on the handle 
parameter.

If  dlsym() is called with a handle, returned by dlopen() then only that image 
and any libraries it depends on are searched for symbol.

So go ahead and use the llvm version.

Greg


> On Aug 27, 2014, at 12:41 PM, Todd Fiala <tfi...@google.com> wrote:
> 
> Deal.
> 
> 
> On Wed, Aug 27, 2014 at 12:40 PM, Zachary Turner <ztur...@google.com> wrote:
> I'm fine with that, although I would prefer to address it by fixing 
> DynamicLibrary in LLVM to support this behavior in LLVM if we find that it 
> breaks something.  Sharing as much code as possible should be an explicit 
> goal IMO, and especially duplicating entire classes should be shunned quite 
> strongly.  Nevertheless, if any fallout should arise, I will make sure to 
> deal with it until it's not broken.
> 
> 
> On Wed, Aug 27, 2014 at 12:35 PM, Todd Fiala <tfi...@google.com> wrote:
> I'm personally okay with this on the Linux side, with the caveat as always 
> that if we find an issue with this, we back out the change.
> 
> -Todd
> 
> 
> On Wed, Aug 27, 2014 at 11:51 AM, Zachary Turner <ztur...@google.com> wrote:
> Combined with the fact that plugins are essentially a dead codepath (going by 
> Enrico's earlier comment), I think it's probably ok to just remove this and 
> use LLVM's default DynamicLibrary loader.  Any objections?
> 
> 
> On Wed, Aug 27, 2014 at 11:49 AM, Zachary Turner <ztur...@google.com> wrote:
> The documentation of dlsym() says this:
> 
> ------ 
> The dlsym() function shall search for the named symbol in all objects loaded 
> automatically as a result of loading the object referenced by handle (see 
> dlopen()). Load ordering is used in dlsym() operations upon the global symbol 
> object. The symbol resolution algorithm used shall be dependency order as 
> described in dlopen().
> ------
> 
> So, it appears that this is perhaps a non-issue.  In other words, if you 
> dlopen plugin A and get back handle A, and then you dlopen plugin B and get 
> back handle B, there is no chance that dlsym against B would find a symbol in 
> plugin A.  It will search only B and B's direct and indirect dependencies.
> 
> There is a remote possibility that a plugin A could link against another 
> plugin B.  However, as long as A provides a LLDBPluginInitialize method, it 
> will always be found first as described by the section on "dependency 
> ordering" in the documentation of dlopen().
> 
> ----- 
> Dependency ordering uses a breadth-first order starting with a given object, 
> then all of its dependencies, then any dependents of those, iterating until 
> all dependencies are satisfied.
> 
> 
> On Wed, Aug 27, 2014 at 11:32 AM, Greg Clayton <gclay...@apple.com> wrote:
> 
> > On Aug 26, 2014, at 5:09 PM, Zachary Turner <ztur...@google.com> wrote:
> >
> > I think my understanding of what it does is correct, but maybe Greg or 
> > someone can confirm.  Basically, it tries to dlopen() the module at the 
> > path specified, and then search for the symbols LLDBPluginInitialize and 
> > LLDBPluginTerminate.  If it finds them, it calls them.  If it doesn't, the 
> > plugin load fails.  According to the documentation of dladdr(), it appears 
> > that the process for locating this symbol involves first searching the 
> > module specified in the argument to dlopen(), and then searching any 
> > dependent modules.  If it is found in any of these, it succeeds.  This 
> > optimization (using RTLD_FIRST and the filename comparison), causes this 
> > search to fail if the symbol is found in a dependent module, but not the 
> > original module.
> 
> Bingo. We don't want to call any other version of LLDBPluginInitialize or 
> LLDBPluginTerminate from any other plug-in. It isn't clear that the dynamic 
> linker sticks to dependent modules, I would need to check on that. It might 
> search all loaded shared libraries in the current process. Not sure if that 
> differs between Mac and Linux. Probably not.
> 
> >
> > I will try to verify that this is correct with someone who knows more than 
> > me about Linux, Mac, and dynamic linking on these platforms, but if correct 
> > then it doesn't seem like there is any risk to removing this.  That said, 
> > I'm interested in who is actually use these plugins.  The best way to find 
> > out if it's going to break something is to talk to the people who depend on 
> > this code.
> 
> Again, we _only_ want to call LLDBPluginInitialize or LLDBPluginTerminate 
> from the exact shared library we are trying to ask for the symbols from, not 
> from anywhere else.
> 
> Greg
> >
> >
> > On Tue, Aug 26, 2014 at 5:01 PM, Todd Fiala <tfi...@google.com> wrote:
> > Ah ok.
> >
> > It's worth figuring out what it does (really) before we consider removing 
> > it.
> >
> >
> >
> > On Tue, Aug 26, 2014 at 4:53 PM, Zachary Turner <ztur...@google.com> wrote:
> > That part is a good question, which I don't totally understand.  There's a 
> > function Debugger::LoadPlugin() though, which accepts a path to a plugin to 
> > load.  It's called there.  This also appears to be exposed through the 
> > "plugin load" command.
> >
> >
> > On Tue, Aug 26, 2014 at 4:32 PM, Todd Fiala <tfi...@google.com> wrote:
> > I guess the thing to do is make sure we're certain we understand the 
> > behavior, which is perhaps best captured in a test.  (i.e. test it with the 
> > RTLD_FIRST behavior where it does something, then verify it does something 
> > different without the flag.  Then, once we agree it is not useful behavior 
> > for us, look at removing it).
> >
> > By valid plugin, you're referring to shared libraries, right?  (What 
> > plugins are we referring to here, at what load point?)
> >
> >
> > On Tue, Aug 26, 2014 at 4:29 PM, Zachary Turner <ztur...@google.com> wrote:
> > Just as a counterpoint, unless I'm misunderstanding this code, I don't see 
> > it actually having a noticeable impact on stability.  The search limiting 
> > will only be a factor in a case where you attempt to load something that 
> > *isn't a valid plugin*.  It's already an error path.  In fact, this code 
> > worked fine before the change was made, and was only made to imitate what 
> > appears to have been an optimization that was Mac-specific.  The change for 
> > Mac doesn't seem to have been strictly necessary either, but just an 
> > optimization.  It's actually not an optimization for Linux, because the 
> > dynamic loader will still search every module on linux, it will just fail 
> > anyway.
> >
> >
> > On Tue, Aug 26, 2014 at 4:21 PM, Todd Fiala <tfi...@google.com> wrote:
> > Probably the way I'd look at this right now is that support in Linux is a 
> > bit dicey and we're doing our best to stabilize (starting with single path 
> > for remote/local debugging, and making that stable and fast).  In an effort 
> > to stabilize, I'd prefer to limit how much code change we do on the Linux 
> > end until we have a more stable product.
> >
> > So while we could potentially take that out, I'd rather avoid making 
> > changes just because it might be simpler, as it might also add yet another 
> > error scenario on the Linux side.  Right now I value similarity to MacOSX 
> > execution over code reduction.  Once we're a lot more stable on the Linux 
> > side, I'd be much more interested in revisiting with some actual use cases 
> > to see diffs in performance and scope of usage.
> >
> > Just my 2 cents...
> >
> >
> > On Tue, Aug 26, 2014 at 3:47 PM, Zachary Turner <ztur...@google.com> wrote:
> > The review is up on the LLVM side.  One point which was raised, and which I 
> > agree with, is that the presence of the string makes the class much 
> > heavier.  This string is only needed to mimic MacOSX's RTLD_FIRST behavior 
> > on other posix platforms.  However, going back through the history of when 
> > this was added, I never actually saw a use case from anyone saying "we 
> > *need* this on Linux".  See the full original thread at [1].  But the TL;DR 
> > is that the flag is nice to have on MacOSX, and the filename comparison was 
> > added to Linux to maintain parity.
> >
> > If nobody actually knows of a specific example of why this is necessary on 
> > Linux, can we just remove this behavior on Linux?  My understanding is that 
> > the only thing which will change by removing this for Linux is the 
> > following: Imagine a plugin X is loaded, and X has a library dependency on 
> > Y and Z.  X doesn't contain the plugin Initialize or Terminate symbol, but 
> > Y or Z does.  With the filename comparison code, LoadPlugin would fail, and 
> > without it, it would succeed and use the symbol found in Y or Z.  I can 
> > understand that with the comparison the algorithm is a bit better, but it 
> > seems such an extremely unusual edge case that I don't think it's a big 
> > deal to remove it from the Linux side.
> >
> > Thoughts?
> >
> > [1] - http://thread.gmane.org/gmane.comp.debugging.lldb.devel/300/focus=302
> >
> >
> > On Thu, Aug 21, 2014 at 5:27 PM, Greg Clayton <gclay...@apple.com> wrote:
> > Sounds good to me. Hopefully if they don't want that they might accept an 
> > extra boolean argument that can specify to only look in the current shared 
> > library and then we can switch over to using LLVM's DynamicLibrary.
> >
> > > On Aug 21, 2014, at 4:22 PM, Zachary Turner <ztur...@google.com> wrote:
> > >
> > > This seems like the only case we ever want, so I'm going to post a patch 
> > > to LLVM's DynamicLibrary class to use RTLD_FIRST on Apple, and a similar 
> > > method of checking the module filespec on other platforms, and see if 
> > > they accept it.  If so, I will convert our Plugin code to use LLVM's 
> > > DynamicLibrary and then delete our DynamicLibrary
> > >
> > >
> > > On Thu, Aug 21, 2014 at 4:08 PM, Greg Clayton <gclay...@apple.com> wrote:
> > >
> > > > On Aug 21, 2014, at 3:31 PM, Zachary Turner <ztur...@google.com> wrote:
> > > >
> > > > Can someone explain this flag to me?
> > >
> > > It says "only look in this binary, don't look in any others. We are 
> > > looking for a plug-in initialization function and we don't want to get 
> > > one back from another dylib.
> > >
> > > As Enrico said, the email from a while back details this:
> > >
> > > http://comments.gmane.org/gmane.comp.debugging.lldb.devel/305
> > >
> > > >  I've read the documentation, but it's still not clear to me.  If you 
> > > > ask dlsym() to search some module X, why would it ever search modules 
> > > > other than X?
> > >
> > > I don't know but it does.
> > >
> > > >
> > > > The reason I ask about this is that llvm support library already has a 
> > > > DynamicLibrary class whose purpose almost exactly matches what we're 
> > > > using the Host::DynamicLibrary related functions for.  However, it 
> > > > doesn't use the RTLD_FIRST flag, and so I'm not sure what the 
> > > > implications are of us using it and deleting our own DynamicLibrary 
> > > > code.
> > >
> > > It would be nice if we could specify this flag so we either find the 
> > > symbol from libx.dylib or we don't. We don't want to find the symbol in 
> > > liby.dylib and call it in our case.
> > >
> >
> >
> >
> > _______________________________________________
> > lldb-dev mailing list
> > lldb-dev@cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
> >
> >
> >
> >
> > --
> > Todd Fiala |   Software Engineer |     tfi...@google.com |     650-943-3180
> >
> >
> >
> >
> >
> > --
> > Todd Fiala |   Software Engineer |     tfi...@google.com |     650-943-3180
> >
> >
> >
> >
> >
> > --
> > Todd Fiala |   Software Engineer |     tfi...@google.com |     650-943-3180
> >
> >
> 
> 
> 
> 
> 
> 
> -- 
> Todd Fiala |   Software Engineer |     tfi...@google.com |     650-943-3180
> 
> 
> 
> 
> 
> -- 
> Todd Fiala |   Software Engineer |     tfi...@google.com |     650-943-3180
> 

_______________________________________________
lldb-dev mailing list
lldb-dev@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to