[U-Boot] GCC 5.2 issue on imx28

Måns Rullgård mans at mansr.com
Thu Aug 6 12:45:51 CEST 2015


Jörg Krause <joerg.krause at embedded.rocks> writes:

> On Mi, 2015-08-05 at 20:23 +0100, Måns Rullgård wrote:
>> Jörg Krause <joerg.krause at embedded.rocks> writes:
>> 
>> > Dear Måns Rullgård, Otavio Salvador,
>> > 
>> > On Di, 2015-07-28 at 14:39 +0100, Måns Rullgård wrote:
>> > > Otavio Salvador <otavio.salvador at ossystems.com.br> writes:
>> > 
>> > [snip]
>> > 
>> > > There are two errors reports:
>> > > 
>> > > 1. An undefined reference to the symbol "lowlevel_init"
>> > > 2. A complaint about the ".rel.plt" section not being handled by 
>> > > the
>> > >    linker script.
>> > > 
>> > > The second error is probably caused by the first.  A quick grep 
>> > > turns 
>> > > up
>> > > this snippet in arch/arm/cpu/arm926ejs/mxs/mxs.c:
>> > > 
>> > > /* Lowlevel init isn't used on i.MX28, so just have a dummy here 
>> > > */
>> > > inline void lowlevel_init(void) {}
>> > > 
>> > > The semantics for non-static functions declared inline have 
>> > > changed 
>> > > in
>> > > gcc5, causing the above (empty) function not to be emitted as an
>> > > external symbol.
>> > > 
>> > > Since that function is only referenced from start.S, it should 
>> > > not be
>> > > declared inline at all.  This patch should thus fix your problem:
>> > > 
>> > > diff --git a/arch/arm/cpu/arm926ejs/mxs/mxs.c 
>> > > b/arch/arm/cpu/arm926ejs/mxs/mxs.c
>> > > index ef130ae..b1d8721 100644
>> > > --- a/arch/arm/cpu/arm926ejs/mxs/mxs.c
>> > > +++ b/arch/arm/cpu/arm926ejs/mxs/mxs.c
>> > > @@ -24,7 +24,7 @@
>> > >  DECLARE_GLOBAL_DATA_PTR;
>> > >  
>> > >  /* Lowlevel init isn't used on i.MX28, so just have a dummy here 
>> > > */
>> > > -inline void lowlevel_init(void) {}
>> > > +void lowlevel_init(void) {}
>> > >  
>> > >  void reset_cpu(ulong ignored) __attribute__((noreturn));
>> > >  
>> > 
>> > I stumbled over the same problem. Unfortunatly, I did not find this
>> > patch before (only the error report from Otavia) and submitted a
>> > similar patch [1] which keeps the inline keyword.
>> > 
>> > Best regards
>> > Jörg Krause
>> > 
>> > [1] "arm: mxs: make inline function compatible for GCC 5"
>> > https://patchwork.ozlabs.org/patch/504043/
>> 
>> Since the function is only referenced from outside the C file, any 
>> use
>> of inline makes little sense to me.  While your patch achieves the
>> result of creating a linkable instance of the function, it is more
>> complicated than it needs to be.
>> 
>
> In my opinion it quite make sense to use inline for functions
> referenced only from other files. The keyword is just an hint to the
> compiler and why should it not make sense for other C files?

If using link-time optimisation, it could make sense, yes.  If not,
there is no way a function can be inlined across translation units.

> However, in this case it makes really no difference if lowlevel_init
> is marked as inline, gcc will generate an "BL lowlevel_init"
> instruction in both cases.

Correct.  Here the only caller is in an assembly file, which is not
subject to link-time optimisations.

-- 
Måns Rullgård
mans at mansr.com


More information about the U-Boot mailing list