[PATCH] Makefile: fix u-boot-initial-env target if lto is enabled

Pali Rohár pali at kernel.org
Wed Oct 19 18:56:12 CEST 2022


On Wednesday 19 October 2022 14:59:49 Max Krummenacher wrote:
> Hi Tom
> 
> On Tue, Oct 18, 2022 at 7:57 PM Tom Rini <trini at konsulko.com> wrote:
> >
> > On Tue, Oct 18, 2022 at 07:48:27PM +0200, Max Krummenacher wrote:
> > > From: Max Krummenacher <max.krummenacher at toradex.com>
> > >
> > > With LTO enabled the U-Boot initial environment is no longer stored
> > > in an easy accessible section in env/common.o. I.e. the section name
> > > changes from build to build, its content maybe compressed and it is
> > > annotated with additional data.
> > >
> > > For GCC adding the option '-ffat-lto-objects' when compiling common.o
> > > adds additionally the traditional sections in the object file and
> > > 'make u-boot-initial-env' would work also for the LTO enabled case.
> > > However clang doesn't have that option.
> > >
> > > Fix this by recompiling common.o into a object file only used for
> > > the creation of u-boot-initial-env if LTO is enabled.
> > >
> > > See also:
> > > https://lore.kernel.org/all/927b122e-1f62-e790-f5ca-30bae4332c77@foss.st.com/
> > >
> > > Signed-off-by: Max Krummenacher <max.krummenacher at toradex.com>
> > >
> > > ---
> > >
> > >  Makefile | 8 ++++++++
> > >  1 file changed, 8 insertions(+)
> > >
> > > diff --git a/Makefile b/Makefile
> > > index 3866cc62f9a..cd45c720d23 100644
> > > --- a/Makefile
> > > +++ b/Makefile
> > > @@ -2451,9 +2451,17 @@ endif
> > >       $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
> > >
> > >  quiet_cmd_genenv = GENENV  $@
> > > +ifeq ($(LTO_ENABLE),y)
> > > +cmd_genenv = $(CC) $(filter-out $(LTO_CFLAGS),$(c_flags)) -c -o env/initial_env.o env/common.c; \
> > > +     $(OBJCOPY) --dump-section .rodata.default_environment=$@ env/initial_env.o; \
> > > +     sed --in-place -e 's/\x00/\x0A/g' $@; sed --in-place -e '/^\s*$$/d' $@; \
> > > +     sort --field-separator== -k1,1 --stable $@ -o $@; \
> > > +     rm -f env/initial_env.o env/initial_env.su
> > > +else
> > >  cmd_genenv = $(OBJCOPY) --dump-section .rodata.default_environment=$@ env/common.o; \
> > >       sed --in-place -e 's/\x00/\x0A/g' $@; sed --in-place -e '/^\s*$$/d' $@; \
> > >       sort --field-separator== -k1,1 --stable $@ -o $@
> > > +endif
> > >
> > >  u-boot-initial-env: u-boot.bin
> > >       $(call if_changed,genenv)
> >
> > Can we pipe the output instead of making a new object file? Maybe not,
> > in a portable way it seems. But, I'm not sure the above respects using
> > O= as well so that does need to be checked and fixed if so.
> 
> While I didn't test it seems that objcopy doesn't allow to pipe data in and out
> of it.

I think it should be easier to compile a new application which includes
header file with env data and prints it to stdout. There are already
host tools like mkimage which are run during u-boot build process, so
adding a new simple host tool should not be a problem -- instead of
trying to hack objcopy, or try to find a way how to play with its
input/output redirection and symbol names to achieve same thing.

> Max
> >
> > --
> > Tom


More information about the U-Boot mailing list