mgorny added a comment.

In D92187#2425378 <https://reviews.llvm.org/D92187#2425378>, @labath wrote:

> In D92187#2425301 <https://reviews.llvm.org/D92187#2425301>, @mgorny wrote:
>
>> I've added some more debug as requested, and it confirmed that Linux and 
>> FreeBSD dyld are behaving differently here.
>>
>> Linux triggers the breakpoint twice: first time in `add` state, including 
>> only `/lib64/ld-linux-x86-64.so.2` and `linux-vdso.so.1` in module list, and 
>> the second time in `consistent` state, adding soentries for all shared 
>> libraries.
>>
>> FreeBSD triggers it only once, in `consistent` state and the remote list 
>> includes all libraries immediately
>
> Thanks for investigating this. And I'm sorry for being so picky -- this is 
> all very messy, and I am trying to understand things to avoid making an even 
> bigger mess.
>
> When you say "FreeBSD triggers it only once", which breakpoint are you 
> referring to? The "rendezvous" breakpoint? Judging by the log's, I would say 
> yes.

Yes.

> But if that's true, then how does the "entry" breakpoint fit into this 
> picture (IIUC, your change basically forces setting of the entry breakpoint 
> on freebsd)? The question I'm looking to answer is whether we really need to 
> set the entry breakpoint, or we just need some side-effect of what happens 
> when we process that breakpoint hit (and we could achieve that differently).

It's not really about setting the breakpoint (it actually doesn't get set again 
because it's set already) but about registering the loaded libraries. I've 
presumed there's no harm in reusing the existing function as-is, i.e. issuing 
the unnecessary breakpoint call.

However, as I've noted on iRC, assuming the libraries reported on first 
rendezvous breakpoint to be 'added' would be a better solution. Most 
importantly, it fixes handling breakpoints in global constructors. I mean 
something like this:

  diff --git a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp 
b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp
  index 866acbddbdc..ad696995f9a 100644
  --- a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp
  +++ b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp
  @@ -296,8 +296,10 @@ bool DYLDRendezvous::SaveSOEntriesFromRemote(
         return false;
   
       // Only add shared libraries and not the executable.
  -    if (!SOEntryIsMainExecutable(entry))
  +    if (!SOEntryIsMainExecutable(entry)) {
  +      m_added_soentries.push_back(entry);
         m_soentries.push_back(entry);
  +    }
     }
   
     m_loaded_modules = module_list;

I would appreciate any advice how to turn that hack into a proper-ish solution.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D92187/new/

https://reviews.llvm.org/D92187

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to