[U-Boot-Users] How to specify the starting function of a U-boot standalone application.

Hi Guys,
I am writing a u-boot standalone application and are having difficulty understanding how it decides the function to execute when I used to "go <start addr>+4" command.
In my application I have something like this...
the filename is my_test.c
/* Function prototypes */ int main (int argc, char *argv[]); void do_func_a (int argc, char *argv[]); void do_func_info (void);
int main (int argc, char *argv[]) { app_startup (argv);
.... do_func_info();
do_func_a(argc, argv);
return(0); }
void do_func_a(int argc, char *argv[]) { .... }
void do_func_info(void) {
}
When I go go <start addr>, the execution jumps straight to do_func_info() and the application finishes. (which is just a bunch of printf).
How do I ensure that when compiled, the my_test.bin places the main function at the "go" point?
I have tried re-ordering the function bodies around, moving main as the last function and thus removing all the function prototypes. I tried name matching the "main" function to the file name, none seems to help.
Thank you so much for all your help.
Richard Retanubun.

Hi all,
richardretanubun schrieb:
When I go go <start addr>, the execution jumps straight to do_func_info() and the application finishes. (which is just a bunch of printf).
How do I ensure that when compiled, the my_test.bin places the main function at the "go" point?
I have tried re-ordering the function bodies around, moving main as the last function and thus removing all the function prototypes. I tried name matching the "main" function to the file name, none seems to help.
I have the same problem. When I modify the source code the compiler may or may not rearrange the functions. It is not guaranteed, that the main function always starts at the same address.
How can this be solved? Is it possible/meaningful to put the main function into a separate linker segment? Any suggestions?
My temporary solution: Because I had to patch the U-Boot code, especially the API, anyway for my purposes, I decided to implement my test function as U-Boot command instead as standalone application.
Best Regards, Jens

On Wed, 2008-06-25 at 07:44 +0200, Jens Gehrlein wrote:
I have the same problem. When I modify the source code the compiler may or may not rearrange the functions. It is not guaranteed, that the main function always starts at the same address.
How can this be solved? Is it possible/meaningful to put the main function into a separate linker segment? Any suggestions?
The simplest way I've found is to make the following C file:
--- _start.c --- void _start(void) { extern int main(int argc, char **argv); char *args[] = { "myprogramname", "-foo", "bar", /* etc. etc. */ }; main(sizeof(args)/sizeof(args[0]), args); /* Wait forever after the program ends */ for (;;); } -----------------
Then, link '_start.o' before *any* other objects in your link step.
Voila! The text entry should be _start!
Feel free to add BSS initialization, etc. in _start as needed.
Jason McMullan MTS SW System Firmware
NetApp 724.741.5011 Fax 724.741.5166 Direct 412.656.3519 Mobile jason.mcmullan@netapp.com www.netapp.com

Hi Jason,
McMullan, Jason schrieb:
On Wed, 2008-06-25 at 07:44 +0200, Jens Gehrlein wrote:
I have the same problem. When I modify the source code the compiler may or may not rearrange the functions. It is not guaranteed, that the main function always starts at the same address.
How can this be solved? Is it possible/meaningful to put the main function into a separate linker segment? Any suggestions?
The simplest way I've found is to make the following C file:
--- _start.c --- void _start(void) { extern int main(int argc, char **argv); char *args[] = { "myprogramname", "-foo", "bar", /* etc. etc. */ }; main(sizeof(args)/sizeof(args[0]), args); /* Wait forever after the program ends */ for (;;); }
Then, link '_start.o' before *any* other objects in your link step.
Voila! The text entry should be _start!
Feel free to add BSS initialization, etc. in _start as needed.
Very nice. Thank you for this tip!
Best Regards, Jens

Hi Guys,
I found this in the u-boot FAQ (is there anything that thing can't answer? :D)
http://www.denx.de/wiki/view/DULG/MyStandaloneProgramDoesNotWork
Of course, Jason's solution is also nice. Thanks for that!
Regards,
- Richard Retanubun
Jens Gehrlein wrote:
Hi Jason,
McMullan, Jason schrieb:
On Wed, 2008-06-25 at 07:44 +0200, Jens Gehrlein wrote:
I have the same problem. When I modify the source code the compiler may or may not rearrange the functions. It is not guaranteed, that the main function always starts at the same address.
How can this be solved? Is it possible/meaningful to put the main function into a separate linker segment? Any suggestions?
The simplest way I've found is to make the following C file:
--- _start.c --- void _start(void) { extern int main(int argc, char **argv); char *args[] = { "myprogramname", "-foo", "bar", /* etc. etc. */ }; main(sizeof(args)/sizeof(args[0]), args); /* Wait forever after the program ends */ for (;;); }
Then, link '_start.o' before *any* other objects in your link step.
Voila! The text entry should be _start!
Feel free to add BSS initialization, etc. in _start as needed.
Very nice. Thank you for this tip!
Best Regards, Jens
participants (3)
-
Jens Gehrlein
-
McMullan, Jason
-
richardretanubun