From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from metis.ext.pengutronix.de ([2001:6f8:1178:4:290:27ff:fe1d:cc33]) by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1Tsreu-0000F7-0U for barebox@lists.infradead.org; Wed, 09 Jan 2013 09:09:16 +0000 Date: Wed, 9 Jan 2013 10:09:13 +0100 From: Sascha Hauer Message-ID: <20130109090913.GR1906@pengutronix.de> References: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: barebox-bounces@lists.infradead.org Errors-To: barebox-bounces+u.kleine-koenig=pengutronix.de@lists.infradead.org Subject: Re: GCC question To: Franck Jullien Cc: barebox On Wed, Jan 09, 2013 at 10:02:32AM +0100, Franck Jullien wrote: > Hi, > > I have a question not directly related to Barebox but I think I can > find some answer here: ) > > I would like to use initcalls in a Linux user's land program on a x86 target. > > I'm doing something like this: > > #ifndef _INIT_H > #define _INIT_H > > typedef int (*initcall_t)(void); > > extern initcall_t __start_target, __stop_target; > > #define target_initcall(fn) static initcall_t _##fn \ > __attribute__((used)) \ > __attribute__ ((section("target"))) = fn > > #endif > > then: > > initcall_t *initcall; > > for (initcall = &__start_target; > initcall < &__stop_target; initcall++) { > printf("initcall-> %p\n", *initcall); > ret = (*initcall)(); > if (ret) > printf("initcall %p failed: %d\n", *initcall, ret); > } > > Everything looks fine except the linker removes the function > "initcalled" because it is not > referenced anywhere and this is normal. > > I have not modified the linker script (I'm using the default one). I'm > using auto generated > __start_target and __stop_target symbols generated by the linker. > > My question is: why does it work in barebox ? For example, in > nios2/generic.c we have only > static function and initcalls. So why the linker does optimize out > those functions ? Is it > because we have initcall corresponding sections in the linker script ? Yes. In nios2 this is: __barebox_initcalls_start = .; .barebox_initcalls : { INITCALLS } __barebox_initcalls_end = .; With INITCALLS being defined as: #define INITCALLS \ KEEP(*(.initcall.0)) \ KEEP(*(.initcall.1)) \ KEEP(*(.initcall.2)) \ KEEP(*(.initcall.3)) \ KEEP(*(.initcall.4)) \ KEEP(*(.initcall.5)) \ KEEP(*(.initcall.6)) \ KEEP(*(.initcall.7)) \ KEEP(*(.initcall.8)) \ KEEP(*(.initcall.9)) \ KEEP(*(.initcall.10)) \ KEEP(*(.initcall.11)) The 'KEEP' keyword keeps the linker from throwing away these. Sascha -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox