It the section isn't in the target's SectionLoadList, then GetLoadAddress 
should return LLDB_INVALID_ADDRESS.  I.e. this bit from 
Section::GetLoadBaseAddress:

    load_base_addr = target->GetSectionLoadList().GetSectionLoadAddress(
        const_cast<Section *>(this)->shared_from_this());

should return LLDB_INVALID_ADDRESS because the section isn't in the load list.

Are we putting sections in the target's section load list before we've actually 
seen them loaded.  I'm pretty sure we shouldn't do that.

Jim


> On Dec 11, 2018, at 9:58 AM, Pavel Labath via Phabricator via lldb-commits 
> <lldb-commits@lists.llvm.org> wrote:
> 
> labath added a comment.
> 
> In D55356#1327224 <https://reviews.llvm.org/D55356#1327224>, @clayborg wrote:
> 
>> In D55356#1327099 <https://reviews.llvm.org/D55356#1327099>, @labath wrote:
>> 
>>> Actually, this now causes an lldb-mi test to fail, but it's not clear to me 
>>> if the problem is in the test, or this patch. This issue happens when 
>>> lldb-mi is printing the "library loaded" message after a module gets added 
>>> to a not-yet-running target. It tries to print the load address by first 
>>> getting the base address and then converting that to a load address.
>>> 
>>> Before this patch, that would always fail, because well.. ELF and PECOFF 
>>> had this function unimplemented, and for MachO the base address was 
>>> section-relative, and so it wasn't resolved to a load address without the 
>>> section being loaded. However, with this patch, in the ELF (and presumably 
>>> PECOFF) case, the load address is not section-relative and so the 
>>> `GetLoadAddress` function happily returns the address.
>>> 
>>> Is this the expected behavior here? (i.e., 
>>> object_file->GetLoadAddress().GetLoadAddress(target) returning a valid 
>>> value even though the target is not running)
>> 
>> 
>> Not unless someone has manually set the section load address in the test?
> 
> 
> The test is not setting the load address manually. This simply falls out of 
> how `Address::GetLoadAddress`  is implemented:
> 
>  addr_t Address::GetLoadAddress(Target *target) const {
>    SectionSP section_sp(GetSection());
>    if (section_sp) {
>      ...
>    } else {
>      // We don't have a section so the offset is the load address
>      return m_offset;
>    }
>  }
> 
> So, where's the bug here? It's not clear to me how to change 
> `Address::GetLoadAddress` to do something different than what it is doing now.
> 
> 
> CHANGES SINCE LAST ACTION
>  https://reviews.llvm.org/D55356/new/
> 
> https://reviews.llvm.org/D55356
> 
> 
> 
> _______________________________________________
> lldb-commits mailing list
> lldb-commits@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

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

Reply via email to