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 U-Boot-Users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/u-boot-users