OSDN Git Service

kbuild: remove incremental linking option
authorNicholas Piggin <npiggin@gmail.com>
Sat, 10 Feb 2018 14:25:03 +0000 (00:25 +1000)
committer0ranko0P <ranko0p@outlook.com>
Sat, 7 Dec 2019 08:32:46 +0000 (16:32 +0800)
This removes the old `ld -r` incremental link option, which has not
been selected by any architecture since June 2017.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Documentation/kbuild/makefiles.txt
arch/Kconfig
scripts/Makefile.build
scripts/link-vmlinux.sh

index 13f888a..bc3e380 100644 (file)
@@ -152,8 +152,14 @@ more details, with real examples.
        configuration.
 
        Kbuild compiles all the $(obj-y) files.  It then calls
-       "$(LD) -r" to merge these files into one built-in.o file.
-       built-in.o is later linked into vmlinux by the parent Makefile.
+       "$(AR) rcSTP" to merge these files into one built-in.o file.
+       This is a thin archive without a symbol table, which makes it
+       unsuitable as a linker input.
+
+       The scripts/link-vmlinux.sh script later makes an aggregate
+       built-in.o with "${AR} rcsTP", which creates the thin archive
+       with a symbol table and an index, making it a valid input for
+       the final vmlinux link passes.
 
        The order of files in $(obj-y) is significant.  Duplicates in
        the lists are allowed: the first instance will be linked into
index e6cfad6..a29c609 100644 (file)
@@ -423,12 +423,6 @@ config CC_STACKPROTECTOR_STRONG
 
 endchoice
 
-config THIN_ARCHIVES
-       def_bool y
-       help
-         Select this if the architecture wants to use thin archives
-         instead of ld -r to create the built-in.o files.
-
 config HAVE_ARCH_WITHIN_STACK_FRAMES
        bool
        help
index c0c9146..a896265 100644 (file)
@@ -413,15 +413,13 @@ $(sort $(subdir-obj-y)): $(subdir-ym) ;
 #
 ifdef builtin-target
 
-ifdef CONFIG_THIN_ARCHIVES
-  cmd_make_builtin = rm -f $@; $(AR) rcSTP$(KBUILD_ARFLAGS)
-  cmd_make_empty_builtin = rm -f $@; $(AR) rcSTP$(KBUILD_ARFLAGS)
-  quiet_cmd_link_o_target = AR      $@
-else
-  cmd_make_builtin = $(LD) $(ld_flags) -r -o
-  cmd_make_empty_builtin = rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS)
-  quiet_cmd_link_o_target = LD      $@
-endif
+# built-in.o archives are made with no symbol table or index which
+# makes them small and fast, but unable to be used by the linker.
+# scripts/link-vmlinux.sh builds an aggregate built-in.o with a symbol
+# table and index.
+cmd_make_builtin = rm -f $@; $(AR) rcSTP$(KBUILD_ARFLAGS)
+cmd_make_empty_builtin = rm -f $@; $(AR) rcSTP$(KBUILD_ARFLAGS)
+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)),\
@@ -454,11 +452,8 @@ $(modorder-target): $(subdir-ym) FORCE
 ifdef lib-target
 quiet_cmd_link_l_target = AR      $@
 
-ifdef CONFIG_THIN_ARCHIVES
-  cmd_link_l_target = rm -f $@; $(AR) rcsTP$(KBUILD_ARFLAGS) $@ $(lib-y)
-else
-  cmd_link_l_target = rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@ $(lib-y)
-endif
+# lib target archives do get a symbol table and index
+cmd_link_l_target = rm -f $@; $(AR) rcsTP$(KBUILD_ARFLAGS) $@ $(lib-y)
 
 $(lib-target): $(lib-y) FORCE
        $(call if_changed,link_l_target)
@@ -480,13 +475,8 @@ $($(subst $(obj)/,,$(@:.o=-y)))), $^)
 
 cmd_link_multi-link = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps) $(cmd_secanalysis)
 
-ifdef CONFIG_THIN_ARCHIVES
-  quiet_cmd_link_multi-y = AR      $@
-  cmd_link_multi-y = rm -f $@; $(AR) rcSTP$(KBUILD_ARFLAGS) $@ $(link_multi_deps)
-else
-  quiet_cmd_link_multi-y = LD      $@
-  cmd_link_multi-y = $(cmd_link_multi-link)
-endif
+quiet_cmd_link_multi-y = AR      $@
+cmd_link_multi-y = rm -f $@; $(AR) rcSTP$(KBUILD_ARFLAGS) $@ $(link_multi_deps)
 
 quiet_cmd_link_multi-m = LD [M]  $@
 cmd_link_multi-m = $(cmd_link_multi-link)
index 0a08006..eeaf06a 100755 (executable)
@@ -54,13 +54,11 @@ info()
 #
 archive_builtin()
 {
-       if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
-               info AR built-in.o
-               rm -f built-in.o;
-               ${AR} rcsTP${KBUILD_ARFLAGS} built-in.o                 \
-                                       ${KBUILD_VMLINUX_INIT}          \
-                                       ${KBUILD_VMLINUX_MAIN}
-       fi
+       info AR built-in.o
+       rm -f built-in.o;
+       ${AR} rcsTP${KBUILD_ARFLAGS} built-in.o                 \
+                               ${KBUILD_VMLINUX_INIT}          \
+                               ${KBUILD_VMLINUX_MAIN}
 }
 
 # Link of vmlinux.o used for section mismatch analysis
@@ -69,20 +67,13 @@ modpost_link()
 {
        local objects
 
-       if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
-               objects="--whole-archive                                \
-                       built-in.o                                      \
-                       --no-whole-archive                              \
-                       --start-group                                   \
-                       ${KBUILD_VMLINUX_LIBS}                          \
-                       --end-group"
-       else
-               objects="${KBUILD_VMLINUX_INIT}                         \
-                       --start-group                                   \
-                       ${KBUILD_VMLINUX_MAIN}                          \
-                       ${KBUILD_VMLINUX_LIBS}                          \
-                       --end-group"
-       fi
+       objects="--whole-archive                                \
+               built-in.o                                      \
+               --no-whole-archive                              \
+               --start-group                                   \
+               ${KBUILD_VMLINUX_LIBS}                          \
+               --end-group"
+
        ${LD} ${LDFLAGS} -r -o ${1} ${objects}
 }
 
@@ -95,46 +86,28 @@ vmlinux_link()
        local objects
 
        if [ "${SRCARCH}" != "um" ]; then
-               if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
-                       objects="--whole-archive                        \
-                               built-in.o                              \
-                               --no-whole-archive                      \
-                               --start-group                           \
-                               ${KBUILD_VMLINUX_LIBS}                  \
-                               --end-group                             \
-                               ${1}"
-               else
-                       objects="${KBUILD_VMLINUX_INIT}                 \
-                               --start-group                           \
-                               ${KBUILD_VMLINUX_MAIN}                  \
-                               ${KBUILD_VMLINUX_LIBS}                  \
-                               --end-group                             \
-                               ${1}"
-               fi
-
-               ${LD} ${LDFLAGS} ${LDFLAGS_vmlinux} -o ${2}             \
+               objects="--whole-archive                        \
+                       built-in.o                              \
+                       --no-whole-archive                      \
+                       --start-group                           \
+                       ${KBUILD_VMLINUX_LIBS}                  \
+                       --end-group                             \
+                       ${1}"
+
+               ${LD} ${LDFLAGS} ${LDFLAGS_vmlinux} -o ${2}     \
                        -T ${lds} ${objects}
        else
-               if [ -n "${CONFIG_THIN_ARCHIVES}" ]; then
-                       objects="-Wl,--whole-archive                    \
-                               built-in.o                              \
-                               -Wl,--no-whole-archive                  \
-                               -Wl,--start-group                       \
-                               ${KBUILD_VMLINUX_LIBS}                  \
-                               -Wl,--end-group                         \
-                               ${1}"
-               else
-                       objects="${KBUILD_VMLINUX_INIT}                 \
-                               -Wl,--start-group                       \
-                               ${KBUILD_VMLINUX_MAIN}                  \
-                               ${KBUILD_VMLINUX_LIBS}                  \
-                               -Wl,--end-group                         \
-                               ${1}"
-               fi
-
-               ${CC} ${CFLAGS_vmlinux} -o ${2}                         \
-                       -Wl,-T,${lds}                                   \
-                       ${objects}                                      \
+               objects="-Wl,--whole-archive                    \
+                       built-in.o                              \
+                       -Wl,--no-whole-archive                  \
+                       -Wl,--start-group                       \
+                       ${KBUILD_VMLINUX_LIBS}                  \
+                       -Wl,--end-group                         \
+                       ${1}"
+
+               ${CC} ${CFLAGS_vmlinux} -o ${2}                 \
+                       -Wl,-T,${lds}                           \
+                       ${objects}                              \
                        -lutil -lrt -lpthread
                rm -f linux
        fi