From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail-ea0-f171.google.com ([209.85.215.171]) by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux)) id 1TsrjN-00011T-R8 for barebox@lists.infradead.org; Wed, 09 Jan 2013 09:13:54 +0000 Received: by mail-ea0-f171.google.com with SMTP id n10so569094eaa.16 for ; Wed, 09 Jan 2013 01:13:52 -0800 (PST) MIME-Version: 1.0 In-Reply-To: <20130109090913.GR1906@pengutronix.de> References: <20130109090913.GR1906@pengutronix.de> Date: Wed, 9 Jan 2013 10:13:51 +0100 Message-ID: From: Franck Jullien 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: Sascha Hauer Cc: barebox 2013/1/9 Sascha Hauer : > 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 | Thanks Sascha, I missed this one..... So is there no way I can do what I want without modification to the default linker script. I searched for a gcc attibute equivalent to KEEP but it doesn't seems to exist. Franck. _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox