Looks ok except for:

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:

+void
+DynamicLoader::UpdateLoadedSectionsCommon(ModuleSP module, addr_t 
link_map_addr, addr_t base_addr)
+{
+    Target &target = m_process->GetTarget();
+    const SectionList *sections = GetSectionListFromModule(module);
+
+    assert(sections && "SectionList missing from loaded module.");
+
+    const size_t num_sections = sections->GetSize();
+
+    for (unsigned i = 0; i < num_sections; ++i)
+    {
+        SectionSP section_sp (sections->GetSectionAtIndex(i));
+        lldb::addr_t new_load_addr = section_sp->GetFileAddress() + base_addr;
+
+        // If the file address of the section is zero then this is not an
+        // allocatable/loadable section (property of ELF sh_addr).  Skip it.
+        if (new_load_addr == base_addr)
+            continue;
+
+        target.SetSectionLoadAddress(section_sp, new_load_addr);
+    }
+}


There is also a module function that does something similar to this, without 
the looking for the zero address:

bool 
Module::SetLoadAddress (Target &target, lldb::addr_t offset, bool &changed);

So I would propose the following:

Update DynamicLoader::UpdateLoadedSectionsCommon() to call into a new function 
that is a virtual function in ObjectFile:

virtual bool SetLoadAddress (addr_t base_addr)
{
    return false;
}

Then each object file (ObjectFileELF in your case) can choose to do the loading 
correctly given a single "base_addr":

bool
ObjectFileELF::SetLoadAddress (addr_t base_addr)
{
}

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.

Does that make sense?

Greg



On Jan 27, 2014, at 2:32 PM, Steve Pucci <[email protected]> wrote:

> Hi,
> 
> 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.
> 
> 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.
> 
> This patch is intended to have no functional difference whatsoever.  All 276 
> tests that are enabled for Ubuntu pass successfully.
> 
> Thanks,
>    Steve
> 
> 
> <patch-FactorDynamicLibrary.txt>_______________________________________________
> lldb-dev mailing list
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

_______________________________________________
lldb-dev mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to