
Jean-Christophe PLAGNIOL-VILLARD wrote:
On 15:07 Wed 22 Oct , Ilko Iliev wrote:
Jean-Christophe PLAGNIOL-VILLARD wrote:
On 13:12 Wed 22 Oct , Ilko Iliev wrote:
Dear Mr. Denk,
Dear Ilko Iliev,
In message 48FDFCA0.4090608@ronetix.at you wrote:
> Maybe instead of adding mor #ifdef'ery here, we can turn > lowlevel_init() into a "weak" function that can be redefined by board > specific code? > > The lowlevel_init() is an assembler function called from another assembler function and the attribute .weak doesn't work.
What do you mean by "attribute .weak doesn't work" ?
There are no assembler file in the U-BOOT tree which use weak functions. Do you know how can I make an assembler function weak?
Well, if you don't know, then don't ask me, ask your compiler - he knows how to do this.
For example, common/cmd_boot.c has this code snippet right at the beginning:
30 31 /* Allow ports to override the default behavior */ 32 __attribute__((weak)) 33 unsigned long do_go_exec (ulong (*entry)(int, char *[]), int argc, char *argv[]) 34 { 35 return entry (argc, argv); 36 }
Compile this with -S option, and you get this:
12 .Ltext0: 13 .align 2 14 .weak do_go_exec 15 .type do_go_exec, @function 16 do_go_exec: 17 .LFB87: 18 .file 1 "cmd_boot.c" 19 .loc 1 34 0 20 .LVL0: 21 mflr 0 22 .LCFI0: 23 stwu 1,-16(1) ...
So to me it seems as if the attribute .weak is supposed to work just fine.
What exactly is not working for you?
With ".weak lowlevel_init" the function is marked as weak (I can see this in the ELF file) but it is not overwritten from the another lowlevel_init().
try
I tried and the result is: lowlevel_init.S:32: Error: junk at end of line, first unrecognized character is `='
sorry try this
.global __default_lowlevel_init ..... .weak lowlevel_init .set lowlevel_init,__default_lowlevel_init
after in the other asm .global lowlevel_init .......
Best Regards, J.
Still doesn't work - the lowlevel_init is weak, but not overwritten.
It works only if the second (strong) function is in the same archive. Maybe this is a bug of the linker.