]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
build: use thin archives instead of incremental linking
authorMarek Behún <marek.behun@nic.cz>
Thu, 20 May 2021 11:24:02 +0000 (13:24 +0200)
committerTom Rini <trini@konsulko.com>
Mon, 24 May 2021 18:21:30 +0000 (14:21 -0400)
Currently we use incremental linking (ld -r) to link several object
files from one directory into one built-in.o object file containing the
linked code from that directory (and its subdirectories).

Linux has, some time ago, moved to thin archives instead.

Thin archives are archives (.a) that do not really contain the object
files, only references to them.

Using thin archives instead of incremental linking
- saves disk space
- apparently works better with dead code elimination
- makes things easier for LTO

The third point is the important one for us. With incremental linking
there are several options how to do LTO, and that would unnecessarily
complicate things.

We have to use the --whole-archive/--no-whole-archive linking option
instead of --start-group/--end-group, otherwise linking may fail because
of unresolved symbols, or the resulting binary will be unusable.

We also need to use the P flag for ar, otherwise final linking may fail.

Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Simon Glass <sjg@chromium.org>
Makefile
arch/sandbox/config.mk
scripts/Makefile.build
scripts/Makefile.spl

index 92d2a1ff6a45ff5e31b770d6d4f0eed7ce91227f..03f74abe438ec993dcf08c09dee5c365ebce8466 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1713,9 +1713,9 @@ ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(ARCH)/Makefile.postlink)
 quiet_cmd_u-boot__ ?= LD      $@
       cmd_u-boot__ ?= $(LD) $(KBUILD_LDFLAGS) $(LDFLAGS_u-boot) -o $@          \
                -T u-boot.lds $(u-boot-init)                                    \
-               --start-group                                                   \
+               --whole-archive                                                 \
                        $(u-boot-main)                                          \
-               --end-group                                                     \
+               --no-whole-archive                                              \
                $(PLATFORM_LIBS) -Map u-boot.map;                               \
                $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
 
index 189e9c2b0c6d3fc20ffaec6ad13ef7f2b27942c8..2149771324cb41c3c429a922d025fff56b13ea50 100644 (file)
@@ -17,13 +17,17 @@ PLATFORM_CPPFLAGS += $(shell $(SDL_CONFIG) --cflags)
 endif
 
 cmd_u-boot__ = $(CC) -o $@ -Wl,-T u-boot.lds $(u-boot-init) \
-       -Wl,--start-group $(u-boot-main) -Wl,--end-group \
+       -Wl,--whole-archive \
+               $(u-boot-main) \
+       -Wl,--no-whole-archive \
        $(PLATFORM_LIBS) -Wl,-Map -Wl,u-boot.map
 
 cmd_u-boot-spl = (cd $(obj) && $(CC) -o $(SPL_BIN) -Wl,-T u-boot-spl.lds \
        $(patsubst $(obj)/%,%,$(u-boot-spl-init)) \
-       -Wl,--start-group $(patsubst $(obj)/%,%,$(u-boot-spl-main)) \
-       $(patsubst $(obj)/%,%,$(u-boot-spl-platdata)) -Wl,--end-group \
+       -Wl,--whole-archive \
+               $(patsubst $(obj)/%,%,$(u-boot-spl-main)) \
+               $(patsubst $(obj)/%,%,$(u-boot-spl-platdata)) \
+       -Wl,--no-whole-archive \
        $(PLATFORM_LIBS) -Wl,-Map -Wl,u-boot-spl.map -Wl,--gc-sections)
 
 CONFIG_ARCH_DEVICE_TREE := sandbox
index 705a886cb9889cc1c8cf264de37cd731ac1b1ad4..7e59ca54cd00d6841a8bb939f97b07684a47f458 100644 (file)
@@ -331,12 +331,11 @@ $(sort $(subdir-obj-y)): $(subdir-ym) ;
 # Rule to compile a set of .o files into one .o file
 #
 ifdef builtin-target
-quiet_cmd_link_o_target = LD      $@
+quiet_cmd_link_o_target = AR      $@
 # If the list of objects to link is empty, just create an empty built-in.o
 cmd_link_o_target = $(if $(strip $(obj-y)),\
-                     $(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^) \
-                     $(cmd_secanalysis),\
-                     rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@)
+                     rm -f $@; $(AR) cDPrsT $@ $(filter $(obj-y), $^), \
+                     rm -f $@; $(AR) cDPrsT$(KBUILD_ARFLAGS) $@)
 
 $(builtin-target): $(obj-y) FORCE
        $(call if_changed,link_o_target)
@@ -362,7 +361,7 @@ $(modorder-target): $(subdir-ym) FORCE
 #
 ifdef lib-target
 quiet_cmd_link_l_target = AR      $@
-cmd_link_l_target = rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@ $(lib-y)
+cmd_link_l_target = rm -f $@; $(AR) cDPrsT$(KBUILD_ARFLAGS) $@ $(lib-y)
 
 $(lib-target): $(lib-y) FORCE
        $(call if_changed,link_l_target)
@@ -382,10 +381,11 @@ $(filter $(addprefix $(obj)/,         \
 $($(subst $(obj)/,,$(@:.o=-objs)))    \
 $($(subst $(obj)/,,$(@:.o=-y)))), $^)
 
-quiet_cmd_link_multi-y = LD      $@
-cmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis)
 
-quiet_cmd_link_multi-m = LD [M]  $@
+quiet_cmd_link_multi-y = AR      $@
+cmd_link_multi-y = rm -f $@; $(AR) cDPrsT$(KBUILD_ARFLAGS) $@ $(link_multi_deps)
+
+quiet_cmd_link_multi-m = AR [M]  $@
 cmd_link_multi-m = $(cmd_link_multi-y)
 
 $(multi-used-y): FORCE
index 92775fef5497c9f8129742a7c5b4c8ea93dcec24..ac2d2033bae58050251ff182339ebc8b5eac7f9c 100644 (file)
@@ -456,10 +456,10 @@ quiet_cmd_u-boot-spl ?= LD      $@
                cd $(obj) &&                                            \
                $(LD) $(KBUILD_LDFLAGS) $(LDFLAGS_$(@F))                \
                $(patsubst $(obj)/%,%,$(u-boot-spl-init))               \
-               --start-group                                           \
+               --whole-archive                                         \
                        $(patsubst $(obj)/%,%,$(u-boot-spl-main))       \
                        $(patsubst $(obj)/%,%,$(u-boot-spl-platdata))   \
-               --end-group                                             \
+               --no-whole-archive                                      \
                $(PLATFORM_LIBS) -Map $(SPL_BIN).map -o $(SPL_BIN)      \
        )