From mboxrd@z Thu Jan 1 00:00:00 1970 From: Peter Tyser Date: Fri, 18 Sep 2009 11:24:48 -0500 Subject: [U-Boot] [TESTING PATCH] ppc: Relocation test patch In-Reply-To: References: <1252709159-22326-1-git-send-email-ptyser@xes-inc.com> <20090914212644.D9991832E864@gemini.denx.de> <1253143205.617.167.camel@localhost.localdomain> <1253208559.617.443.camel@localhost.localdomain> <1253284115.617.455.camel@localhost.localdomain> <1253287317.617.459.camel@localhost.localdomain> Message-ID: <1253291088.617.469.camel@localhost.localdomain> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de > > > 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