[Linux-Xtensa] [PATCH v2] xtensa: add xtensa support

Max Filippov jcmvbkbc at gmail.com
Sat Jan 3 15:15:03 UTC 2015


On Sat, Jan 3, 2015 at 5:53 PM, Petr Machata <pmachata at redhat.com> wrote:
> Max Filippov <jcmvbkbc at gmail.com> writes:
>> On Fri, Jan 2, 2015 at 4:32 AM, Petr Machata <pmachata at redhat.com> wrote:
>>>> +int
>>>> +arch_elf_init(struct ltelf *lte, struct library *lib)
>>>> +{
>>>> +     Elf_Scn *scn;
>>>> +     GElf_Shdr shdr;
>>>> +     GElf_Addr relplt_addr;
>>>> +     GElf_Xword relplt_size;
>>>> +     GElf_Phdr phdr;
>>>> +     size_t i;
>>>> +
>>>> +     for (i = 0; gelf_getphdr(lte->elf, i, &phdr) != NULL; ++i) {
>>>> +             if (phdr.p_type == PT_LOAD) {
>>>> +                     lib->arch.loadable_sz =
>>>> +                             phdr.p_vaddr + phdr.p_memsz - lte->bias;

[...]

>>> Also, correct me if I'm wrong, but loadable_sz actually points to the
>>> end of the region, and hence is not a size.  Would loadable_end be a
>>> better name?
>>
>> The intention was to calculate the size of loadable part of a library, to be
>> able to tell later, given library base address and a pointer, if it
>> points inside
>> the library or outside of it.
>
> Bias doesn't influence size, only the, um, "coordinate": where it's
> mapped.
>
> But anyway: your formula is p_vaddr + p_memsz ± bias.  The first is a
> coordinate, the second is size, adding the two together gives you
> another coordinate (of the end of the buffer pointed to by p_vaddr).
> Bias is again size, so the result is an address, not a size.  Hence why
> I think it's a misnomer.

Looks like I should have taken the minimal of phdr.p_vaddr and subtract
it from the maximal phdr.p_vaddr + phdr.p_memsz. It works with bias
instead of phdr.p_vaddr just because all my libs are not prelinked,
and bias is in fact a library load address.

-- 
Thanks.
-- Max


More information about the linux-xtensa mailing list