
On Tue, Oct 18, 2022 at 07:48:27PM +0200, Max Krummenacher wrote:
From: Max Krummenacher max.krummenacher@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@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.