Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[linux-2.6-microblaze.git] / scripts / link-vmlinux.sh
index d7f26f0..eecc186 100755 (executable)
@@ -45,134 +45,6 @@ info()
        printf "  %-7s %s\n" "${1}" "${2}"
 }
 
-# Generate a linker script to ensure correct ordering of initcalls.
-gen_initcalls()
-{
-       info GEN .tmp_initcalls.lds
-
-       ${PYTHON3} ${srctree}/scripts/jobserver-exec            \
-       ${PERL} ${srctree}/scripts/generate_initcall_order.pl   \
-               ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS}   \
-               > .tmp_initcalls.lds
-}
-
-# If CONFIG_LTO_CLANG is selected, collect generated symbol versions into
-# .tmp_symversions.lds
-gen_symversions()
-{
-       info GEN .tmp_symversions.lds
-       rm -f .tmp_symversions.lds
-
-       for o in ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS}; do
-               if [ -f ${o}.symversions ]; then
-                       cat ${o}.symversions >> .tmp_symversions.lds
-               fi
-       done
-}
-
-# Link of vmlinux.o used for section mismatch analysis
-# ${1} output file
-modpost_link()
-{
-       local objects
-       local lds=""
-
-       objects="--whole-archive                                \
-               ${KBUILD_VMLINUX_OBJS}                          \
-               --no-whole-archive                              \
-               --start-group                                   \
-               ${KBUILD_VMLINUX_LIBS}                          \
-               --end-group"
-
-       if is_enabled CONFIG_LTO_CLANG; then
-               gen_initcalls
-               lds="-T .tmp_initcalls.lds"
-
-               if is_enabled CONFIG_MODVERSIONS; then
-                       gen_symversions
-                       lds="${lds} -T .tmp_symversions.lds"
-               fi
-
-               # This might take a while, so indicate that we're doing
-               # an LTO link
-               info LTO ${1}
-       else
-               info LD ${1}
-       fi
-
-       ${LD} ${KBUILD_LDFLAGS} -r -o ${1} ${lds} ${objects}
-}
-
-objtool_link()
-{
-       local objtoolcmd;
-       local objtoolopt;
-
-       if ! is_enabled CONFIG_OBJTOOL; then
-               return;
-       fi
-
-       if is_enabled CONFIG_LTO_CLANG || is_enabled CONFIG_X86_KERNEL_IBT; then
-
-               # For LTO and IBT, objtool doesn't run on individual
-               # translation units.  Run everything on vmlinux instead.
-
-               if is_enabled CONFIG_HAVE_JUMP_LABEL_HACK; then
-                       objtoolopt="${objtoolopt} --hacks=jump_label"
-               fi
-
-               if is_enabled CONFIG_HAVE_NOINSTR_HACK; then
-                       objtoolopt="${objtoolopt} --hacks=noinstr"
-               fi
-
-               if is_enabled CONFIG_X86_KERNEL_IBT; then
-                       objtoolopt="${objtoolopt} --ibt"
-               fi
-
-               if is_enabled CONFIG_FTRACE_MCOUNT_USE_OBJTOOL; then
-                       objtoolopt="${objtoolopt} --mcount"
-               fi
-
-               if is_enabled CONFIG_UNWINDER_ORC; then
-                       objtoolopt="${objtoolopt} --orc"
-               fi
-
-               if is_enabled CONFIG_RETPOLINE; then
-                       objtoolopt="${objtoolopt} --retpoline"
-               fi
-
-               if is_enabled CONFIG_SLS; then
-                       objtoolopt="${objtoolopt} --sls"
-               fi
-
-               if is_enabled CONFIG_STACK_VALIDATION; then
-                       objtoolopt="${objtoolopt} --stackval"
-               fi
-
-               if is_enabled CONFIG_HAVE_STATIC_CALL_INLINE; then
-                       objtoolopt="${objtoolopt} --static-call"
-               fi
-
-               objtoolopt="${objtoolopt} --uaccess"
-       fi
-
-       if is_enabled CONFIG_NOINSTR_VALIDATION; then
-               objtoolopt="${objtoolopt} --noinstr"
-       fi
-
-       if [ -n "${objtoolopt}" ]; then
-
-               if is_enabled CONFIG_GCOV_KERNEL; then
-                       objtoolopt="${objtoolopt} --no-unreachable"
-               fi
-
-               objtoolopt="${objtoolopt} --link"
-
-               info OBJTOOL ${1}
-               tools/objtool/objtool ${objtoolopt} ${1}
-       fi
-}
-
 # Link of vmlinux
 # ${1} - output file
 # ${2}, ${3}, ... - optional extra .o files
@@ -199,6 +71,10 @@ vmlinux_link()
                libs="${KBUILD_VMLINUX_LIBS}"
        fi
 
+       if is_enabled CONFIG_MODULES; then
+               objs="${objs} .vmlinux.export.o"
+       fi
+
        if [ "${SRCARCH}" = "um" ]; then
                wl=-Wl,
                ld="${CC}"
@@ -318,15 +194,11 @@ sorttable()
 cleanup()
 {
        rm -f .btf.*
-       rm -f .tmp_System.map
-       rm -f .tmp_initcalls.lds
-       rm -f .tmp_symversions.lds
-       rm -f .tmp_vmlinux*
        rm -f System.map
        rm -f vmlinux
        rm -f vmlinux.map
-       rm -f vmlinux.o
-       rm -f .vmlinux.d
+       rm -f .vmlinux.objs
+       rm -f .vmlinux.export.c
 }
 
 # Use "make V=1" to debug this script
@@ -355,8 +227,24 @@ fi;
 ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init need-builtin=1
 
 #link vmlinux.o
-modpost_link vmlinux.o
-objtool_link vmlinux.o
+${MAKE} -f "${srctree}/scripts/Makefile.vmlinux_o"
+
+# Generate the list of in-tree objects in vmlinux
+#
+# This is used to retrieve symbol versions generated by genksyms.
+for f in ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS}; do
+       case ${f} in
+       *libgcc.a)
+               # Some architectures do '$(CC) --print-libgcc-file-name' to
+               # borrow libgcc.a from the toolchain.
+               # There is no EXPORT_SYMBOL in external objects. Ignore this.
+               ;;
+       *.a)
+               ${AR} t ${f} ;;
+       *)
+               echo ${f} ;;
+       esac
+done > .vmlinux.objs
 
 # modpost vmlinux.o to check for section mismatches
 ${MAKE} -f "${srctree}/scripts/Makefile.modpost" MODPOST_VMLINUX=1
@@ -368,6 +256,10 @@ info GEN modules.builtin
 tr '\0' '\n' < modules.builtin.modinfo | sed -n 's/^[[:alnum:]:_]*\.file=//p' |
        tr ' ' '\n' | uniq | sed -e 's:^:kernel/:' -e 's/$/.ko/' > modules.builtin
 
+if is_enabled CONFIG_MODULES; then
+       ${MAKE} -f "${srctree}/scripts/Makefile.vmlinux" .vmlinux.export.o
+fi
+
 btf_vmlinux_bin_o=""
 if is_enabled CONFIG_DEBUG_INFO_BTF; then
        btf_vmlinux_bin_o=.btf.vmlinux.bin.o