<div dir="ltr">Thanks, Greg.  These were all issues when the code was in its prior location but I'm glad you're thinking more globally than I was. :-)<div><br></div><div>Clarification requests below:</div><div class="gmail_extra">
<br><div class="gmail_quote">On Wed, Jan 29, 2014 at 4:16 PM, Greg Clayton <span dir="ltr"><<a href="mailto:gclayton@apple.com" target="_blank">gclayton@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
So a few questions:<br>
<br>
1 - Does anyone use the "link_map_addr" parameter that is being sent to many of the functions that were moved into DynamicLoader? I didn't see any. Please remove this argument if possible.<br></blockquote><div>
<br></div><div>I'm thinking this is the way (on some platforms) to get at the info for loading thread-local sections of the module, but as you know I'm very new to how this works so I could be mistaken.  Anyway that's what I was thinking when I moved the method.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">2 - ReadInt() isn't correct for all systems:<br>
<br>
static int ReadInt(Process *process, addr_t addr)<br>
{<br>
    Error error;<br>
    int value = (int)process->ReadUnsignedIntegerFromMemory(addr, sizeof(uint32_t), 0, error);<br>
<br>
See the "sizeof(uint32_t)"? We will want to get the size of an "int" for the process that is being run if this function really does need to get a "int" from the debugger. So this sizeof() needs to be changed to get the actual size of a type "int" via:<br>

<br>
ClangASTContext *ast = m_process->GetTarget().GetScratchClangASTContext();<br>
ClangASTType int_type = ast->GetBasicType (eBasicTypeInt);<br>
uint64_t int_size = int_type.GetByteSize();<br>
<br>
Or this function might be more useful if we pass in the size of the integer we need?<br></blockquote><div><br></div><div>This function is used in only one place currently in DynamicLoaderPOSIXDYLD and it does appear to be incorrect that it is restricted to uint32, though it may not manifest on LSB systems.  It's reading the "module id" of the module, which is apparently the index into the dtv thread vector (one index per module), which appears to be defined to be size_t at least on some architectures.  I'm guessing we are not seeing issues because when we read 32 bits of a 64-bit uint on LSB systems, we get the right bits, and until we have 2^31 modules in a running executable we won't run into a problem.  If this is true, obviously it won't work on 64-bit MSB systems.</div>
<div><br></div><div>I'm a bit reluctant to make the change without someone with a bit more knowledge of Linux dtv layout confirming my diagnosis, though.  I haven't yet found a definitive statement of the size of module_id.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">3 - The DynamicLoader class has a m_process member variable so the "Process *process" argument doesn't need to be passed into the following functions:<br>

        int DynamicLoader::ReadInt(Process *process, addr_t addr);<br>
        addr_t DynamicLoader::ReadPointer(Process *process, addr_t addr);<br></blockquote><div><br></div><div>Got it.  This method is static (because it came from a file-static in DynamicLoaderPOSIXDYLD.cpp) but it doesn't have to be, as it is only called from non-static methods of DynamicLoader.  I'll change it to non-static and remove the parameter.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><div class="h5">On Jan 29, 2014, at 1:45 PM, Steve Pucci <<a href="mailto:spucci@google.com">spucci@google.com</a>> wrote:<br>
<br>
> OK, that seemed to work, at least on my simple shared-library testcase on Ubuntu, which invokes the new code in ObjectFileELF::SetLoadAddress().<br>
><br>
> Updated full patch attached.<br>
><br>
><br>
><br>
><br>
> On Tue, Jan 28, 2014 at 7:19 AM, Steve Pucci <<a href="mailto:spucci@google.com">spucci@google.com</a>> wrote:<br>
> OK, great, thanks Greg, I'll give it a go.<br>
><br>
>  - Steve<br>
><br>
><br>
> On Mon, Jan 27, 2014 at 4:31 PM, Greg Clayton <<a href="mailto:gclayton@apple.com">gclayton@apple.com</a>> wrote:<br>
> The first thing to do is just look at the section that has address of zero and see if it has any bits that the other don't or vice versa.<br>
><br>
> I think the bit you are looking for is SHF_ALLOC.<br>
><br>
> The "sh_flags" from the ELF section are indeed placed in the lldb_private::Section flags, so you should be able to do:<br>
><br>
> for (section : sections)<br>
> {<br>
>     if (section->Test(SHF_ALLOC))<br>
>     {<br>
>         // Load this section<br>
>     }<br>
> }<br>
><br>
><br>
><br>
><br>
><br>
> On Jan 27, 2014, at 4:23 PM, Steve Pucci <<a href="mailto:spucci@google.com">spucci@google.com</a>> wrote:<br>
><br>
> > OK, I understand, though I may need some help from someone with interpreting Section headers for Elf.  I'll let this group know if I have questions.<br>
> ><br>
> > Thanks again,<br>
> >    Steve<br>
> ><br>
> ><br>
> > On Mon, Jan 27, 2014 at 4:17 PM, Greg Clayton <<a href="mailto:gclayton@apple.com">gclayton@apple.com</a>> wrote:<br>
> ><br>
> > On Jan 27, 2014, at 4:02 PM, Steve Pucci <<a href="mailto:spucci@google.com">spucci@google.com</a>> wrote:<br>
> ><br>
> > > Thanks, Greg.<br>
> > ><br>
> > > I think it all makes sense, except for one bit:<br>
> > ><br>
> > > In ObjectFileELF::SetLoadAddress(), are you proposing I simply call Module::SetLoadAddress as it exists today?  That method walks through all sections and checks only section_sp->IsThreadSpecific() to decide whether to load the section, and there's no place to insert an ELF-specific check of the section to see if it's loadable.  Is that what you meant, or are you suggesting something else?<br>

> ><br>
> > Something else. When the ObjectFileELF parser parses the section headers, it places the flags (or it should if it isn't) into the flags field of the lldb_private::Section. So it should be able to use the flags from its sections to correctly in each lldb_private::Section, and correctly interpret them to know which sections need to be loaded and which don't. So let the ELF plugin that created the sections correctly interpret the flags it put into the sections.<br>

> ><br>
> > We then will need to change the Module::SetLoadAddress() to call this new ObjectFile function.<br>
> ><br>
> > ><br>
> > > Instead of that I could have ObjectFileELF::SetLoadAddress iterate through the sections as UpdateLoadedSectionsCommon does below, OR I could somehow provide a callback to be called from Module::SetLoadAddress (perhaps by passing in the ObjectFile*).<br>

> ><br>
> > It should all be done in the ObjectFileELF::SetLoadAddress function.<br>
> ><br>
> > ><br>
> > > Thanks,<br>
> > >   Steve<br>
> > ><br>
> > ><br>
> > ><br>
> > > On Mon, Jan 27, 2014 at 3:14 PM, Greg Clayton <<a href="mailto:gclayton@apple.com">gclayton@apple.com</a>> wrote:<br>
> > ><br>
> > > On Jan 27, 2014, at 3:05 PM, Greg Clayton <<a href="mailto:gclayton@apple.com">gclayton@apple.com</a>> wrote:<br>
> > ><br>
> > > > Looks ok except for:<br>
> > > ><br>
> > > > This is ELF specific with the file address of zero, and it probably should more be done via flags and asking the section if it is loadable:<br>
> > > ><br>
> > > > +void<br>
> > > > +DynamicLoader::UpdateLoadedSectionsCommon(ModuleSP module, addr_t link_map_addr, addr_t base_addr)<br>
> > > > +{<br>
> > > > +    Target &target = m_process->GetTarget();<br>
> > > > +    const SectionList *sections = GetSectionListFromModule(module);<br>
> > > > +<br>
> > > > +    assert(sections && "SectionList missing from loaded module.");<br>
> > > > +<br>
> > > > +    const size_t num_sections = sections->GetSize();<br>
> > > > +<br>
> > > > +    for (unsigned i = 0; i < num_sections; ++i)<br>
> > > > +    {<br>
> > > > +        SectionSP section_sp (sections->GetSectionAtIndex(i));<br>
> > > > +        lldb::addr_t new_load_addr = section_sp->GetFileAddress() + base_addr;<br>
> > > > +<br>
> > > > +        // If the file address of the section is zero then this is not an<br>
> > > > +        // allocatable/loadable section (property of ELF sh_addr).  Skip it.<br>
> > > > +        if (new_load_addr == base_addr)<br>
> > > > +            continue;<br>
> > > > +<br>
> > > > +        target.SetSectionLoadAddress(section_sp, new_load_addr);<br>
> > > > +    }<br>
> > > > +}<br>
> > > ><br>
> > > ><br>
> > > > There is also a module function that does something similar to this, without the looking for the zero address:<br>
> > > ><br>
> > > > bool<br>
> > > > Module::SetLoadAddress (Target &target, lldb::addr_t offset, bool &changed);<br>
> > > ><br>
> > > > So I would propose the following:<br>
> > > ><br>
> > > > Update DynamicLoader::UpdateLoadedSectionsCommon() to call into a new function that is a virtual function in ObjectFile:<br>
> > > ><br>
> > > > virtual bool SetLoadAddress (addr_t base_addr)<br>
> > > > {<br>
> > > >    return false;<br>
> > > > }<br>
> > > ><br>
> > > > Then each object file (ObjectFileELF in your case) can choose to do the loading correctly given a single "base_addr":<br>
> > > ><br>
> > > > bool<br>
> > > > ObjectFileELF::SetLoadAddress (addr_t base_addr)<br>
> > > > {<br>
> > > > }<br>
> > > ><br>
> > > > Then in ObjectFileELF::SetLoadAddress() you can use the section flags that were saved in the lldb_private::Section to properly determine which sections are loadable and which aren't. This function is for a rigid slide of all loadable sections.<br>

> > > ><br>
> > > > Does that make sense?<br>
> > ><br>
> > > I forgot the SetLoadAddress needs a target, and each object file already knows its module, so that doesn't need to be passed, it can be retrieved via the getter function:<br>
> > ><br>
> > > virtual bool SetLoadAddress (Target &target, addr_t base_addr)<br>
> > > {<br>
> > >    return false;<br>
> > > }<br>
> > ><br>
> > > Then each object file (ObjectFileELF in your case) can choose to do the loading correctly given a single "base_addr":<br>
> > ><br>
> > > bool<br>
> > > ObjectFileELF::SetLoadAddress (Target &target, addr_t base_addr)<br>
> > > {<br>
> > >      ModuleSP module_sp = GetModule();<br>
> > >      if (module_sp)<br>
> > >      {<br>
> > >          ....<br>
> > >      }<br>
> > > }<br>
> > ><br>
> > ><br>
> > ><br>
> > > > Greg<br>
> > > ><br>
> > > ><br>
> > > ><br>
> > > > On Jan 27, 2014, at 2:32 PM, Steve Pucci <<a href="mailto:spucci@google.com">spucci@google.com</a>> wrote:<br>
> > > ><br>
> > > >> Hi,<br>
> > > >><br>
> > > >> I'd like to have access to a number of methods in DynamicLoaderPOSIXDYLD from the new class I'm working on, DynamicLoaderGDBServer.  These methods have no dependency on DynamicLoaderPOSIXDYLD, with two exceptions noted below, so I'm proposing to move them into the base class DynamicLoader.<br>

> > > >><br>
> > > >> The two exceptions are the methods UpdateLoadedSections and UnloadSections; in each case there is one line of code that is special to the derived class, and the rest of the code in the method is generic to the base class.  In each case I created a XXXCommon() method on the base class with the common code, and created a virtual method XXX() on the base class, which in DynamicLoaderPOSIXDYLD will call the common code and then execute its one line of specialized code.<br>

> > > >><br>
> > > >> This patch is intended to have no functional difference whatsoever.  All 276 tests that are enabled for Ubuntu pass successfully.<br>
> > > >><br>
> > > >> Thanks,<br>
> > > >>   Steve<br>
> > > >><br>
> > > >><br>
> > > >> <patch-FactorDynamicLibrary.txt>_______________________________________________<br>
> > > >> lldb-dev mailing list<br>
> > > >> <a href="mailto:lldb-dev@cs.uiuc.edu">lldb-dev@cs.uiuc.edu</a><br>
> > > >> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev</a><br>
> > > ><br>
> > > > _______________________________________________<br>
> > > > lldb-dev mailing list<br>
> > > > <a href="mailto:lldb-dev@cs.uiuc.edu">lldb-dev@cs.uiuc.edu</a><br>
> > > > <a href="http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev</a><br>
> > ><br>
> > ><br>
> ><br>
> ><br>
><br>
><br>
><br>
</div></div>> <patch-FactorDynamicLibrary-2.txt><br>
<br>
</blockquote></div><br></div></div>