[U-Boot] [TESTING PATCH] ppc: Relocation test patch

Peter Tyser ptyser at xes-inc.com
Fri Sep 18 18:24:48 CEST 2009


> > > 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



More information about the U-Boot mailing list