[U-Boot-Users] Changing u-boot relocation scheme

Jerry Van Baren gerald.vanbaren at ge.com
Thu Jul 24 14:23:08 CEST 2008


vb wrote:
> Wolfgang, thank you for your reply, let me try to explain myself a bit clearer:
> 
> On Wed, Jul 23, 2008 at 8:18 PM, Wolfgang Denk <wd at denx.de> wrote:
>> In message <f608b67d0807231039i434e96dbvda86590776db2cb0 at mail.gmail.com> you wrote:
>>
>>> some companies). If these added modules were not written in position
>>> independent manner (namely, using structures with multiple stage
>>> indirect pointers interleaved with data), the effort to make these
>>> modules work in u-boot is very exhausting.
>> I don't understand what you mean. Either you link statically with the
>> U-Boot image, or you use standalone programs. In both situations no
>> such problem as described by you exists.
> 
> we talk here about modules statically linked into the u-boot image.
> Allow me to illustrate the problem I am trying to solve. Consider
> adding this code to a u-boot source file on a ppc460gt platform:
> 
> vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
> 87a88,105
>> int do_ptrt (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
>>
>> int  (*pf)(struct cmd_tbl_s *, int, int, char *[]) = do_ptrt;
>>
>> int do_ptrt (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
>> {
>>       printf ("pointer is %p\n", pf);
>>       printf ("function is %p\n", do_ptrt);
>>       return 0;
>> }
>>
>> U_BOOT_CMD(
>>       ptrt, CFG_MAXARGS, 1,   do_ptrt,
>>       "ptrt\n",
>>       ""
>> );
>>
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> 
> And this is what happens when this command is invoked:
> 
> vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
> => ptrt
> pointer is fffb2754
> function is 0ffb7754
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> 
> So, the value of 'pf' is equal to the address of do_ptrt() *before*
> relocation. The fact that there is a GOT and a sophisticated linker
> script did not prevent this from happening.

OK, now I'm curious: what happens if you make the pf() pointer constant? 
  This will (should) change it from an initialized variable in the .data 
section to a constant in the .rodata section.  I'm wondering if the 
.rodata section gets relocation information where the .data section doesn't.

int do_ptrt (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);

const int (*pf)(struct cmd_tbl_s *, int, int, char *[]) = do_ptrt;

int do_ptrt (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
       printf ("pointer is %p\n", pf);
       printf ("function is %p\n", do_ptrt);
       return 0;
}

Thanks,
gvb




More information about the U-Boot mailing list