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 <[EMAIL PROTECTED]> wrote:
>> In message <[EMAIL PROTECTED]> 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
-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
U-Boot-Users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/u-boot-users