
Sorry, I don't have an example. Just a guess, weak function references:
void weak_fun(void) __attribute__ ((weak)); if (weak_fun) weak_fun();
Using default weak functions as well as overridden weak functions both definitely work. So the pointers must be being updated correctly. I guess I'm not sure where specifically a problem could arise. Let me know if you have any additional details. I'm hoping to send the patches out later today, maybe some review/testing will make things clearer.
This does not work:
void weak_fun(void) __attribute__ ((weak)); printf("weak_fun:%p\n", weak_fun);
prints "weak 17f9c000" after relocation for me, should be NULL when weak_fun is undefined.
Ahh, I see. I see the same thing. In general U-Boot declares weak functions by either using the 'alias' attribute:
static int __def_eth_init(bd_t *bis) { return -1; } int cpu_eth_init(bd_t *bis) __attribute__((weak, alias("__def_eth_init")));
or by declaring a function as weak:
void __attribute__((weak)) _machine_restart(void) { }
Both these scenarios work with the current relocation fixup scheme. What is a real world scenario (such as your example) when someone would declare a weak function, but not actually implement a default. Doesn't that defeat the purpose of having a weak function in the first place? Eg why would someone use your example of:
void weak_fun(void) __attribute__ ((weak)); ... if (weak_fun) weak_fun(); ...
over:
void weak_fun(void) __attribute__ ((weak)) { }; ... weak_fun(); ... (or the alias implementation)
I'm trying to grasp the limitations of the current relocation mechanism as I'm afraid I don't have time to dig through all PPC architectures' start.S files to fix their relocation code right now:)
Thanks, Peter