Merge tag 'kbuild-v5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 22 Oct 2020 20:13:57 +0000 (13:13 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 22 Oct 2020 20:13:57 +0000 (13:13 -0700)
Pull Kbuild updates from Masahiro Yamada:

 - Support 'make compile_commands.json' to generate the compilation
   database more easily, avoiding stale entries

 - Support 'make clang-analyzer' and 'make clang-tidy' for static checks
   using clang-tidy

 - Preprocess scripts/modules.lds.S to allow CONFIG options in the
   module linker script

 - Drop cc-option tests from compiler flags supported by our minimal
   GCC/Clang versions

 - Use always 12-digits commit hash for CONFIG_LOCALVERSION_AUTO=y

 - Use sha1 build id for both BFD linker and LLD

 - Improve deb-pkg for reproducible builds and rootless builds

 - Remove stale, useless scripts/namespace.pl

 - Turn -Wreturn-type warning into error

 - Fix build error of deb-pkg when CONFIG_MODULES=n

 - Replace 'hostname' command with more portable 'uname -n'

 - Various Makefile cleanups

* tag 'kbuild-v5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild: (34 commits)
  kbuild: Use uname for LINUX_COMPILE_HOST detection
  kbuild: Only add -fno-var-tracking-assignments for old GCC versions
  kbuild: remove leftover comment for filechk utility
  treewide: remove DISABLE_LTO
  kbuild: deb-pkg: clean up package name variables
  kbuild: deb-pkg: do not build linux-headers package if CONFIG_MODULES=n
  kbuild: enforce -Werror=return-type
  scripts: remove namespace.pl
  builddeb: Add support for all required debian/rules targets
  builddeb: Enable rootless builds
  builddeb: Pass -n to gzip for reproducible packages
  kbuild: split the build log of kallsyms
  kbuild: explicitly specify the build id style
  scripts/setlocalversion: make git describe output more reliable
  kbuild: remove cc-option test of -Werror=date-time
  kbuild: remove cc-option test of -fno-stack-check
  kbuild: remove cc-option test of -fno-strict-overflow
  kbuild: move CFLAGS_{KASAN,UBSAN,KCSAN} exports to relevant Makefiles
  kbuild: remove redundant CONFIG_KASAN check from scripts/Makefile.kasan
  kbuild: do not create built-in objects for external module builds
  ...

58 files changed:
Documentation/process/submit-checklist.rst
MAINTAINERS
Makefile
arch/arm/Makefile
arch/arm/include/asm/module.lds.h [new file with mode: 0644]
arch/arm/kernel/module.lds [deleted file]
arch/arm/vdso/Makefile
arch/arm64/Makefile
arch/arm64/include/asm/module.lds.h [new file with mode: 0644]
arch/arm64/kernel/module.lds [deleted file]
arch/arm64/kernel/vdso/Makefile
arch/arm64/kernel/vdso32/Makefile
arch/ia64/Makefile
arch/ia64/include/asm/module.lds.h [new file with mode: 0644]
arch/ia64/module.lds [deleted file]
arch/m68k/Makefile
arch/m68k/include/asm/module.lds.h [new file with mode: 0644]
arch/m68k/kernel/module.lds [deleted file]
arch/mips/vdso/Makefile
arch/nds32/kernel/vdso/Makefile
arch/powerpc/Makefile
arch/powerpc/include/asm/module.lds.h [new file with mode: 0644]
arch/powerpc/kernel/module.lds [deleted file]
arch/powerpc/kernel/vdso32/Makefile
arch/powerpc/kernel/vdso64/Makefile
arch/riscv/Makefile
arch/riscv/include/asm/module.lds.h [new file with mode: 0644]
arch/riscv/kernel/module.lds [deleted file]
arch/riscv/kernel/vdso/Makefile
arch/s390/kernel/vdso64/Makefile
arch/sparc/vdso/Makefile
arch/um/include/asm/Kbuild
arch/x86/entry/vdso/Makefile
include/asm-generic/Kbuild
include/asm-generic/module.lds.h [new file with mode: 0644]
kernel/Makefile
lib/Kconfig.debug
scripts/.gitignore
scripts/Kbuild.include
scripts/Makefile
scripts/Makefile.build
scripts/Makefile.kasan
scripts/Makefile.kcsan
scripts/Makefile.modfinal
scripts/Makefile.ubsan
scripts/clang-tools/gen_compile_commands.py [new file with mode: 0755]
scripts/clang-tools/run-clang-tools.py [new file with mode: 0755]
scripts/gen_compile_commands.py [deleted file]
scripts/kconfig/Makefile
scripts/link-vmlinux.sh
scripts/mkcompile_h
scripts/module-common.lds [deleted file]
scripts/module.lds.S [new file with mode: 0644]
scripts/namespace.pl [deleted file]
scripts/package/builddeb
scripts/package/mkdebian
scripts/setlocalversion
tools/testing/selftests/bpf/Makefile

index b681e86..1879f88 100644 (file)
@@ -53,8 +53,7 @@ and elsewhere regarding submitting Linux kernel patches.
 
 9) Check cleanly with sparse.
 
-10) Use ``make checkstack`` and ``make namespacecheck`` and fix any problems
-    that they find.
+10) Use ``make checkstack`` and fix any problems that it finds.
 
     .. note::
 
index f5570ae..fcb3b83 100644 (file)
@@ -4273,6 +4273,7 @@ W:        https://clangbuiltlinux.github.io/
 B:     https://github.com/ClangBuiltLinux/linux/issues
 C:     irc://chat.freenode.net/clangbuiltlinux
 F:     Documentation/kbuild/llvm.rst
+F:     scripts/clang-tools/
 K:     \b(?i:clang|llvm)\b
 
 CLEANCACHE API
index ebbd348..e719798 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -497,7 +497,7 @@ KBUILD_AFLAGS   := -D__ASSEMBLY__ -fno-PIE
 KBUILD_CFLAGS   := -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs \
                   -fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE \
                   -Werror=implicit-function-declaration -Werror=implicit-int \
-                  -Wno-format-security \
+                  -Werror=return-type -Wno-format-security \
                   -std=gnu89
 KBUILD_CPPFLAGS := -D__KERNEL__
 KBUILD_AFLAGS_KERNEL :=
@@ -505,7 +505,6 @@ KBUILD_CFLAGS_KERNEL :=
 KBUILD_AFLAGS_MODULE  := -DMODULE
 KBUILD_CFLAGS_MODULE  := -DMODULE
 KBUILD_LDFLAGS_MODULE :=
-export KBUILD_LDS_MODULE := $(srctree)/scripts/module-common.lds
 KBUILD_LDFLAGS :=
 CLANG_FLAGS :=
 
@@ -517,7 +516,6 @@ export KBUILD_HOSTCXXFLAGS KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS LDFLAGS_MODULE
 
 export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS KBUILD_LDFLAGS
 export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE
-export CFLAGS_KASAN CFLAGS_KASAN_NOSANITIZE CFLAGS_UBSAN CFLAGS_KCSAN
 export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE
 export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE
 export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
@@ -634,7 +632,7 @@ endif
 # in addition to whatever we do anyway.
 # Just "make" or "make all" shall build modules as well
 
-ifneq ($(filter all modules nsdeps,$(MAKECMDGOALS)),)
+ifneq ($(filter all modules nsdeps %compile_commands.json clang-%,$(MAKECMDGOALS)),)
   KBUILD_MODULES := 1
 endif
 
@@ -707,8 +705,11 @@ $(KCONFIG_CONFIG):
 # This exploits the 'multi-target pattern rule' trick.
 # The syncconfig should be executed only once to make all the targets.
 # (Note: use the grouped target '&:' when we bump to GNU Make 4.3)
+quiet_cmd_syncconfig = SYNC    $@
+      cmd_syncconfig = $(MAKE) -f $(srctree)/Makefile syncconfig
+
 %/config/auto.conf %/config/auto.conf.cmd %/generated/autoconf.h: $(KCONFIG_CONFIG)
-       $(Q)$(MAKE) -f $(srctree)/Makefile syncconfig
+       +$(call cmd,syncconfig)
 else # !may-sync-config
 # External modules and some install targets need include/generated/autoconf.h
 # and include/config/auto.conf but do not care if they are up-to-date.
@@ -813,16 +814,22 @@ KBUILD_CFLAGS     += -ftrivial-auto-var-init=zero
 KBUILD_CFLAGS  += -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang
 endif
 
-DEBUG_CFLAGS   := $(call cc-option, -fno-var-tracking-assignments)
+# Workaround for GCC versions < 5.0
+# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61801
+ifdef CONFIG_CC_IS_GCC
+DEBUG_CFLAGS   := $(call cc-ifversion, -lt, 0500, $(call cc-option, -fno-var-tracking-assignments))
+endif
 
 ifdef CONFIG_DEBUG_INFO
+
 ifdef CONFIG_DEBUG_INFO_SPLIT
 DEBUG_CFLAGS   += -gsplit-dwarf
 else
 DEBUG_CFLAGS   += -g
 endif
+
 KBUILD_AFLAGS  += -Wa,-gdwarf-2
-endif
+
 ifdef CONFIG_DEBUG_INFO_DWARF4
 DEBUG_CFLAGS   += -gdwarf-4
 endif
@@ -838,6 +845,8 @@ KBUILD_AFLAGS       += -gz=zlib
 KBUILD_LDFLAGS += --compress-debug-sections=zlib
 endif
 
+endif # CONFIG_DEBUG_INFO
+
 KBUILD_CFLAGS += $(DEBUG_CFLAGS)
 export DEBUG_CFLAGS
 
@@ -919,16 +928,16 @@ KBUILD_CFLAGS += $(call cc-disable-warning, restrict)
 KBUILD_CFLAGS += $(call cc-disable-warning, maybe-uninitialized)
 
 # disable invalid "can't wrap" optimizations for signed / pointers
-KBUILD_CFLAGS  += $(call cc-option,-fno-strict-overflow)
+KBUILD_CFLAGS  += -fno-strict-overflow
 
 # Make sure -fstack-check isn't enabled (like gentoo apparently did)
-KBUILD_CFLAGS  += $(call cc-option,-fno-stack-check,)
+KBUILD_CFLAGS  += -fno-stack-check
 
 # conserve stack if available
 KBUILD_CFLAGS   += $(call cc-option,-fconserve-stack)
 
 # Prohibit date/time macros, which would make the build non-deterministic
-KBUILD_CFLAGS   += $(call cc-option,-Werror=date-time)
+KBUILD_CFLAGS   += -Werror=date-time
 
 # enforce correct pointer usage
 KBUILD_CFLAGS   += $(call cc-option,-Werror=incompatible-pointer-types)
@@ -964,8 +973,8 @@ KBUILD_CPPFLAGS += $(KCPPFLAGS)
 KBUILD_AFLAGS   += $(KAFLAGS)
 KBUILD_CFLAGS   += $(KCFLAGS)
 
-KBUILD_LDFLAGS_MODULE += --build-id
-LDFLAGS_vmlinux += --build-id
+KBUILD_LDFLAGS_MODULE += --build-id=sha1
+LDFLAGS_vmlinux += --build-id=sha1
 
 ifeq ($(CONFIG_STRIP_ASM_SYMS),y)
 LDFLAGS_vmlinux        += $(call ld-option, -X,)
@@ -1377,7 +1386,7 @@ endif
 # using awk while concatenating to the final file.
 
 PHONY += modules
-modules: $(if $(KBUILD_BUILTIN),vmlinux) modules_check
+modules: $(if $(KBUILD_BUILTIN),vmlinux) modules_check modules_prepare
        $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
 
 PHONY += modules_check
@@ -1394,6 +1403,7 @@ targets += modules.order
 # Target to prepare building external modules
 PHONY += modules_prepare
 modules_prepare: prepare
+       $(Q)$(MAKE) $(build)=scripts scripts/module.lds
 
 # Target to install modules
 PHONY += modules_install
@@ -1452,7 +1462,8 @@ endif # CONFIG_MODULES
 
 # Directories & files removed with 'make clean'
 CLEAN_FILES += include/ksym vmlinux.symvers \
-              modules.builtin modules.builtin.modinfo modules.nsdeps
+              modules.builtin modules.builtin.modinfo modules.nsdeps \
+              compile_commands.json
 
 # Directories & files removed with 'make mrproper'
 MRPROPER_FILES += include/config include/generated          \
@@ -1558,12 +1569,13 @@ help:
         echo  ''
        @echo  'Static analysers:'
        @echo  '  checkstack      - Generate a list of stack hogs'
-       @echo  '  namespacecheck  - Name space analysis on compiled kernel'
        @echo  '  versioncheck    - Sanity check on version.h usage'
        @echo  '  includecheck    - Check for duplicate included header files'
        @echo  '  export_report   - List the usages of all exported symbols'
        @echo  '  headerdep       - Detect inclusion cycles in headers'
        @echo  '  coccicheck      - Check with Coccinelle'
+       @echo  '  clang-analyzer  - Check with clang static analyzer'
+       @echo  '  clang-tidy      - Check with clang-tidy'
        @echo  ''
        @echo  'Tools:'
        @echo  '  nsdeps          - Generate missing symbol namespace dependencies'
@@ -1681,14 +1693,18 @@ else # KBUILD_EXTMOD
 #                      Install the modules built in the module directory
 #                      Assumes install directory is already created
 
-# We are always building modules
+# We are always building only modules.
+KBUILD_BUILTIN :=
 KBUILD_MODULES := 1
 
 build-dirs := $(KBUILD_EXTMOD)
 PHONY += modules
-modules: descend
+modules: $(MODORDER)
        $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
 
+$(MODORDER): descend
+       @:
+
 PHONY += modules_install
 modules_install: _emodinst_ _emodinst_post
 
@@ -1702,8 +1718,12 @@ PHONY += _emodinst_post
 _emodinst_post: _emodinst_
        $(call cmd,depmod)
 
+compile_commands.json: $(extmod-prefix)compile_commands.json
+PHONY += compile_commands.json
+
 clean-dirs := $(KBUILD_EXTMOD)
-clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers $(KBUILD_EXTMOD)/modules.nsdeps
+clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers $(KBUILD_EXTMOD)/modules.nsdeps \
+       $(KBUILD_EXTMOD)/compile_commands.json
 
 PHONY += help
 help:
@@ -1715,7 +1735,9 @@ help:
        @echo  '  clean           - remove generated files in module directory only'
        @echo  ''
 
-PHONY += prepare
+# no-op for external module builds
+PHONY += prepare modules_prepare
+
 endif # KBUILD_EXTMOD
 
 # Single targets
@@ -1748,7 +1770,7 @@ MODORDER := .modules.tmp
 endif
 
 PHONY += single_modpost
-single_modpost: $(single-no-ko)
+single_modpost: $(single-no-ko) modules_prepare
        $(Q){ $(foreach m, $(single-ko), echo $(extmod-prefix)$m;) } > $(MODORDER)
        $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
 
@@ -1816,10 +1838,37 @@ nsdeps: export KBUILD_NSDEPS=1
 nsdeps: modules
        $(Q)$(CONFIG_SHELL) $(srctree)/scripts/nsdeps
 
+# Clang Tooling
+# ---------------------------------------------------------------------------
+
+quiet_cmd_gen_compile_commands = GEN     $@
+      cmd_gen_compile_commands = $(PYTHON3) $< -a $(AR) -o $@ $(filter-out $<, $(real-prereqs))
+
+$(extmod-prefix)compile_commands.json: scripts/clang-tools/gen_compile_commands.py \
+       $(if $(KBUILD_EXTMOD),,$(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS)) \
+       $(if $(CONFIG_MODULES), $(MODORDER)) FORCE
+       $(call if_changed,gen_compile_commands)
+
+targets += $(extmod-prefix)compile_commands.json
+
+PHONY += clang-tidy clang-analyzer
+
+ifdef CONFIG_CC_IS_CLANG
+quiet_cmd_clang_tools = CHECK   $<
+      cmd_clang_tools = $(PYTHON3) $(srctree)/scripts/clang-tools/run-clang-tools.py $@ $<
+
+clang-tidy clang-analyzer: $(extmod-prefix)compile_commands.json
+       $(call cmd,clang_tools)
+else
+clang-tidy clang-analyzer:
+       @echo "$@ requires CC=clang" >&2
+       @false
+endif
+
 # Scripts to check various things for consistency
 # ---------------------------------------------------------------------------
 
-PHONY += includecheck versioncheck coccicheck namespacecheck export_report
+PHONY += includecheck versioncheck coccicheck export_report
 
 includecheck:
        find $(srctree)/* $(RCS_FIND_IGNORE) \
@@ -1834,9 +1883,6 @@ versioncheck:
 coccicheck:
        $(Q)$(BASH) $(srctree)/scripts/$@
 
-namespacecheck:
-       $(PERL) $(srctree)/scripts/namespace.pl
-
 export_report:
        $(PERL) $(srctree)/scripts/export_report.pl
 
index c430143..2874cd9 100644 (file)
@@ -20,10 +20,6 @@ endif
 # linker. All sections should be explicitly named in the linker script.
 LDFLAGS_vmlinux += $(call ld-option, --orphan-handling=warn)
 
-ifeq ($(CONFIG_ARM_MODULE_PLTS),y)
-KBUILD_LDS_MODULE      += $(srctree)/arch/arm/kernel/module.lds
-endif
-
 GZFLAGS                :=-9
 #KBUILD_CFLAGS +=-pipe
 
diff --git a/arch/arm/include/asm/module.lds.h b/arch/arm/include/asm/module.lds.h
new file mode 100644 (file)
index 0000000..0e7cb4e
--- /dev/null
@@ -0,0 +1,7 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifdef CONFIG_ARM_MODULE_PLTS
+SECTIONS {
+       .plt : { BYTE(0) }
+       .init.plt : { BYTE(0) }
+}
+#endif
diff --git a/arch/arm/kernel/module.lds b/arch/arm/kernel/module.lds
deleted file mode 100644 (file)
index 79cb6af..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-SECTIONS {
-       .plt : { BYTE(0) }
-       .init.plt : { BYTE(0) }
-}
index a54f707..150ce6e 100644 (file)
@@ -19,7 +19,7 @@ ccflags-y += -DDISABLE_BRANCH_PROFILING -DBUILD_VDSO32
 ldflags-$(CONFIG_CPU_ENDIAN_BE8) := --be8
 ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \
            -z max-page-size=4096 -nostdlib -shared $(ldflags-y) \
-           --hash-style=sysv --build-id \
+           --hash-style=sysv --build-id=sha1 \
            -T
 
 obj-$(CONFIG_VDSO) += vdso.o
index f4717fa..88a44e7 100644 (file)
@@ -126,10 +126,6 @@ endif
 
 CHECKFLAGS     += -D__aarch64__
 
-ifeq ($(CONFIG_ARM64_MODULE_PLTS),y)
-KBUILD_LDS_MODULE      += $(srctree)/arch/arm64/kernel/module.lds
-endif
-
 ifeq ($(CONFIG_DYNAMIC_FTRACE_WITH_REGS),y)
   KBUILD_CPPFLAGS += -DCC_USING_PATCHABLE_FUNCTION_ENTRY
   CC_FLAGS_FTRACE := -fpatchable-function-entry=2
diff --git a/arch/arm64/include/asm/module.lds.h b/arch/arm64/include/asm/module.lds.h
new file mode 100644 (file)
index 0000000..691f15a
--- /dev/null
@@ -0,0 +1,7 @@
+#ifdef CONFIG_ARM64_MODULE_PLTS
+SECTIONS {
+       .plt (NOLOAD) : { BYTE(0) }
+       .init.plt (NOLOAD) : { BYTE(0) }
+       .text.ftrace_trampoline (NOLOAD) : { BYTE(0) }
+}
+#endif
diff --git a/arch/arm64/kernel/module.lds b/arch/arm64/kernel/module.lds
deleted file mode 100644 (file)
index 22e36a2..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-SECTIONS {
-       .plt (NOLOAD) : { BYTE(0) }
-       .init.plt (NOLOAD) : { BYTE(0) }
-       .text.ftrace_trampoline (NOLOAD) : { BYTE(0) }
-}
index 04021a9..d65f522 100644 (file)
@@ -24,14 +24,13 @@ btildflags-$(CONFIG_ARM64_BTI_KERNEL) += -z force-bti
 # routines, as x86 does (see 6f121e548f83 ("x86, vdso: Reimplement vdso.so
 # preparation in build-time C")).
 ldflags-y := -shared -nostdlib -soname=linux-vdso.so.1 --hash-style=sysv       \
-            -Bsymbolic $(call ld-option, --no-eh-frame-hdr) --build-id -n      \
+            -Bsymbolic $(call ld-option, --no-eh-frame-hdr) --build-id=sha1 -n \
             $(btildflags-y) -T
 
 ccflags-y := -fno-common -fno-builtin -fno-stack-protector -ffixed-x18
 ccflags-y += -DDISABLE_BRANCH_PROFILING
 
 CFLAGS_REMOVE_vgettimeofday.o = $(CC_FLAGS_FTRACE) -Os $(CC_FLAGS_SCS) $(GCC_PLUGINS_CFLAGS)
-KBUILD_CFLAGS                  += $(DISABLE_LTO)
 KASAN_SANITIZE                 := n
 UBSAN_SANITIZE                 := n
 OBJECT_FILES_NON_STANDARD      := y
@@ -47,7 +46,7 @@ endif
 GCOV_PROFILE := n
 
 obj-y += vdso.o
-extra-y += vdso.lds
+targets += vdso.lds
 CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
 
 # Force dependency (incbin is bad)
index d6adb46..7f96a1a 100644 (file)
@@ -90,9 +90,9 @@ VDSO_CFLAGS  += -O2
 # Some useful compiler-dependent flags from top-level Makefile
 VDSO_CFLAGS += $(call cc32-option,-Wdeclaration-after-statement,)
 VDSO_CFLAGS += $(call cc32-option,-Wno-pointer-sign)
-VDSO_CFLAGS += $(call cc32-option,-fno-strict-overflow)
+VDSO_CFLAGS += -fno-strict-overflow
 VDSO_CFLAGS += $(call cc32-option,-Werror=strict-prototypes)
-VDSO_CFLAGS += $(call cc32-option,-Werror=date-time)
+VDSO_CFLAGS += -Werror=date-time
 VDSO_CFLAGS += $(call cc32-option,-Werror=incompatible-pointer-types)
 
 # The 32-bit compiler does not provide 128-bit integers, which are used in
@@ -128,7 +128,7 @@ VDSO_LDFLAGS += -Wl,-Bsymbolic -Wl,--no-undefined -Wl,-soname=linux-vdso.so.1
 VDSO_LDFLAGS += -Wl,-z,max-page-size=4096 -Wl,-z,common-page-size=4096
 VDSO_LDFLAGS += -nostdlib -shared -mfloat-abi=soft
 VDSO_LDFLAGS += -Wl,--hash-style=sysv
-VDSO_LDFLAGS += -Wl,--build-id
+VDSO_LDFLAGS += -Wl,--build-id=sha1
 VDSO_LDFLAGS += $(call cc32-ldoption,-fuse-ld=bfd)
 
 
@@ -155,7 +155,7 @@ asm-obj-vdso := $(addprefix $(obj)/, $(asm-obj-vdso))
 obj-vdso := $(c-obj-vdso) $(c-obj-vdso-gettimeofday) $(asm-obj-vdso)
 
 obj-y += vdso.o
-extra-y += vdso.lds
+targets += vdso.lds
 CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
 
 # Force dependency (vdso.s includes vdso.so through incbin)
index 2876a7d..703b1c4 100644 (file)
@@ -20,7 +20,6 @@ CHECKFLAGS    += -D__ia64=1 -D__ia64__=1 -D_LP64 -D__LP64__
 
 OBJCOPYFLAGS   := --strip-all
 LDFLAGS_vmlinux        := -static
-KBUILD_LDS_MODULE += $(srctree)/arch/ia64/module.lds
 KBUILD_AFLAGS_KERNEL := -mconstant-gp
 EXTRA          :=
 
diff --git a/arch/ia64/include/asm/module.lds.h b/arch/ia64/include/asm/module.lds.h
new file mode 100644 (file)
index 0000000..eff68f3
--- /dev/null
@@ -0,0 +1,14 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+SECTIONS {
+       /* Group unwind sections into a single section: */
+       .IA_64.unwind_info : { *(.IA_64.unwind_info*) }
+       .IA_64.unwind : { *(.IA_64.unwind*) }
+       /*
+        * Create place-holder sections to hold the PLTs, GOT, and
+        * official procedure-descriptors (.opd).
+        */
+       .core.plt : { BYTE(0) }
+       .init.plt : { BYTE(0) }
+       .got : { BYTE(0) }
+       .opd : { BYTE(0) }
+}
diff --git a/arch/ia64/module.lds b/arch/ia64/module.lds
deleted file mode 100644 (file)
index eff68f3..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-SECTIONS {
-       /* Group unwind sections into a single section: */
-       .IA_64.unwind_info : { *(.IA_64.unwind_info*) }
-       .IA_64.unwind : { *(.IA_64.unwind*) }
-       /*
-        * Create place-holder sections to hold the PLTs, GOT, and
-        * official procedure-descriptors (.opd).
-        */
-       .core.plt : { BYTE(0) }
-       .init.plt : { BYTE(0) }
-       .got : { BYTE(0) }
-       .opd : { BYTE(0) }
-}
index 4438ffb..ea14f20 100644 (file)
@@ -75,7 +75,6 @@ KBUILD_CPPFLAGS += -D__uClinux__
 endif
 
 KBUILD_LDFLAGS := -m m68kelf
-KBUILD_LDS_MODULE += $(srctree)/arch/m68k/kernel/module.lds
 
 ifdef CONFIG_SUN3
 LDFLAGS_vmlinux = -N
diff --git a/arch/m68k/include/asm/module.lds.h b/arch/m68k/include/asm/module.lds.h
new file mode 100644 (file)
index 0000000..fda94fa
--- /dev/null
@@ -0,0 +1,7 @@
+SECTIONS {
+       .m68k_fixup : {
+               __start_fixup = .;
+               *(.m68k_fixup)
+               __stop_fixup = .;
+       }
+}
diff --git a/arch/m68k/kernel/module.lds b/arch/m68k/kernel/module.lds
deleted file mode 100644 (file)
index fda94fa..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-SECTIONS {
-       .m68k_fixup : {
-               __start_fixup = .;
-               *(.m68k_fixup)
-               __stop_fixup = .;
-       }
-}
index 57fe832..5810cc1 100644 (file)
@@ -61,7 +61,7 @@ endif
 # VDSO linker flags.
 ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \
        $(filter -E%,$(KBUILD_CFLAGS)) -nostdlib -shared \
-       -G 0 --eh-frame-hdr --hash-style=sysv --build-id -T
+       -G 0 --eh-frame-hdr --hash-style=sysv --build-id=sha1 -T
 
 CFLAGS_REMOVE_vdso.o = -pg
 
index 7c3c1cc..55df25e 100644 (file)
@@ -20,7 +20,7 @@ GCOV_PROFILE := n
 
 
 obj-y += vdso.o
-extra-y += vdso.lds
+targets += vdso.lds
 CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
 
 # Force dependency
index c4f9dbd..a4d56f0 100644 (file)
@@ -65,7 +65,6 @@ UTS_MACHINE := $(subst $(space),,$(machine-y))
 ifdef CONFIG_PPC32
 KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
 else
-KBUILD_LDS_MODULE += $(srctree)/arch/powerpc/kernel/module.lds
 ifeq ($(call ld-ifversion, -ge, 225000000, y),y)
 # Have the linker provide sfpr if possible.
 # There is a corresponding test in arch/powerpc/lib/Makefile
diff --git a/arch/powerpc/include/asm/module.lds.h b/arch/powerpc/include/asm/module.lds.h
new file mode 100644 (file)
index 0000000..cea5dc1
--- /dev/null
@@ -0,0 +1,8 @@
+/* Force alignment of .toc section.  */
+SECTIONS
+{
+       .toc 0 : ALIGN(256)
+       {
+               *(.got .toc)
+       }
+}
diff --git a/arch/powerpc/kernel/module.lds b/arch/powerpc/kernel/module.lds
deleted file mode 100644 (file)
index cea5dc1..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Force alignment of .toc section.  */
-SECTIONS
-{
-       .toc 0 : ALIGN(256)
-       {
-               *(.got .toc)
-       }
-}
index e147bbd..73eada6 100644 (file)
@@ -29,7 +29,7 @@ ccflags-y := -shared -fno-common -fno-builtin -nostdlib \
 asflags-y := -D__VDSO32__ -s
 
 obj-y += vdso32_wrapper.o
-extra-y += vdso32.lds
+targets += vdso32.lds
 CPPFLAGS_vdso32.lds += -P -C -Upowerpc
 
 # Force dependency (incbin is bad)
index 32ebb35..dfd34f6 100644 (file)
@@ -17,7 +17,7 @@ ccflags-y := -shared -fno-common -fno-builtin -nostdlib \
 asflags-y := -D__VDSO64__ -s
 
 obj-y += vdso64_wrapper.o
-extra-y += vdso64.lds
+targets += vdso64.lds
 CPPFLAGS_vdso64.lds += -P -C -U$(ARCH)
 
 # Force dependency (incbin is bad)
index 10df59f..0289a97 100644 (file)
@@ -53,9 +53,6 @@ endif
 ifeq ($(CONFIG_CMODEL_MEDANY),y)
        KBUILD_CFLAGS += -mcmodel=medany
 endif
-ifeq ($(CONFIG_MODULE_SECTIONS),y)
-       KBUILD_LDS_MODULE += $(srctree)/arch/riscv/kernel/module.lds
-endif
 ifeq ($(CONFIG_PERF_EVENTS),y)
         KBUILD_CFLAGS += -fno-omit-frame-pointer
 endif
diff --git a/arch/riscv/include/asm/module.lds.h b/arch/riscv/include/asm/module.lds.h
new file mode 100644 (file)
index 0000000..4254ff2
--- /dev/null
@@ -0,0 +1,9 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright (C) 2017 Andes Technology Corporation */
+#ifdef CONFIG_MODULE_SECTIONS
+SECTIONS {
+       .plt (NOLOAD) : { BYTE(0) }
+       .got (NOLOAD) : { BYTE(0) }
+       .got.plt (NOLOAD) : { BYTE(0) }
+}
+#endif
diff --git a/arch/riscv/kernel/module.lds b/arch/riscv/kernel/module.lds
deleted file mode 100644 (file)
index 295ecfb..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) 2017 Andes Technology Corporation */
-
-SECTIONS {
-       .plt (NOLOAD) : { BYTE(0) }
-       .got (NOLOAD) : { BYTE(0) }
-       .got.plt (NOLOAD) : { BYTE(0) }
-}
index 478e733..7d6a94d 100644 (file)
@@ -49,7 +49,7 @@ $(obj)/vdso.so.dbg: $(src)/vdso.lds $(obj-vdso) FORCE
 # refer to these symbols in the kernel code rather than hand-coded addresses.
 
 SYSCFLAGS_vdso.so.dbg = -shared -s -Wl,-soname=linux-vdso.so.1 \
-       -Wl,--build-id -Wl,--hash-style=both
+       -Wl,--build-id=sha1 -Wl,--hash-style=both
 $(obj)/vdso-dummy.o: $(src)/vdso.lds $(obj)/rt_sigreturn.o FORCE
        $(call if_changed,vdsold)
 
index 3d33032..13cc5a3 100644 (file)
@@ -25,13 +25,13 @@ KBUILD_AFLAGS_64 += -m64 -s
 KBUILD_CFLAGS_64 := $(filter-out -m64,$(KBUILD_CFLAGS))
 KBUILD_CFLAGS_64 += -m64 -fPIC -shared -fno-common -fno-builtin
 ldflags-y := -fPIC -shared -nostdlib -soname=linux-vdso64.so.1 \
-            --hash-style=both --build-id -T
+            --hash-style=both --build-id=sha1 -T
 
 $(targets:%=$(obj)/%.dbg): KBUILD_CFLAGS = $(KBUILD_CFLAGS_64)
 $(targets:%=$(obj)/%.dbg): KBUILD_AFLAGS = $(KBUILD_AFLAGS_64)
 
 obj-y += vdso64_wrapper.o
-extra-y += vdso64.lds
+targets += vdso64.lds
 CPPFLAGS_vdso64.lds += -P -C -U$(ARCH)
 
 # Disable gcov profiling, ubsan and kasan for VDSO code
index f44355e..c5e1545 100644 (file)
@@ -3,8 +3,6 @@
 # Building vDSO images for sparc.
 #
 
-KBUILD_CFLAGS += $(DISABLE_LTO)
-
 VDSO64-$(CONFIG_SPARC64)       := y
 VDSOCOMPAT-$(CONFIG_COMPAT)    := y
 
@@ -115,7 +113,7 @@ quiet_cmd_vdso = VDSO    $@
                       -T $(filter %.lds,$^) $(filter %.o,$^) && \
                sh $(srctree)/$(src)/checkundef.sh '$(OBJDUMP)' '$@'
 
-VDSO_LDFLAGS = -shared --hash-style=both --build-id -Bsymbolic
+VDSO_LDFLAGS = -shared --hash-style=both --build-id=sha1 -Bsymbolic
 GCOV_PROFILE := n
 
 #
index 8d435f8..1c63b26 100644 (file)
@@ -16,6 +16,7 @@ generic-y += kdebug.h
 generic-y += mcs_spinlock.h
 generic-y += mm-arch-hooks.h
 generic-y += mmiowb.h
+generic-y += module.lds.h
 generic-y += param.h
 generic-y += pci.h
 generic-y += percpu.h
index 215376d..2124374 100644 (file)
@@ -9,8 +9,6 @@ ARCH_REL_TYPE_ABS := R_X86_64_JUMP_SLOT|R_X86_64_GLOB_DAT|R_X86_64_RELATIVE|
 ARCH_REL_TYPE_ABS += R_386_GLOB_DAT|R_386_JMP_SLOT|R_386_RELATIVE
 include $(srctree)/lib/vdso/Makefile
 
-KBUILD_CFLAGS += $(DISABLE_LTO)
-
 # Sanitizer runtimes are unavailable and cannot be linked here.
 KASAN_SANITIZE                 := n
 UBSAN_SANITIZE                 := n
@@ -176,7 +174,7 @@ quiet_cmd_vdso = VDSO    $@
                       -T $(filter %.lds,$^) $(filter %.o,$^) && \
                 sh $(srctree)/$(src)/checkundef.sh '$(NM)' '$@'
 
-VDSO_LDFLAGS = -shared --hash-style=both --build-id \
+VDSO_LDFLAGS = -shared --hash-style=both --build-id=sha1 \
        $(call ld-option, --eh-frame-hdr) -Bsymbolic
 GCOV_PROFILE := n
 
index 62ebdc7..e78bbb9 100644 (file)
@@ -39,6 +39,7 @@ mandatory-y += mmiowb.h
 mandatory-y += mmu.h
 mandatory-y += mmu_context.h
 mandatory-y += module.h
+mandatory-y += module.lds.h
 mandatory-y += msi.h
 mandatory-y += pci.h
 mandatory-y += percpu.h
diff --git a/include/asm-generic/module.lds.h b/include/asm-generic/module.lds.h
new file mode 100644 (file)
index 0000000..f210d5c
--- /dev/null
@@ -0,0 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef __ASM_GENERIC_MODULE_LDS_H
+#define __ASM_GENERIC_MODULE_LDS_H
+
+/*
+ * <asm/module.lds.h> can specify arch-specific sections for linking modules.
+ * Empty for the asm-generic header.
+ */
+
+#endif /* __ASM_GENERIC_MODULE_LDS_H */
index 2044ef0..af601b9 100644 (file)
@@ -38,9 +38,6 @@ KASAN_SANITIZE_kcov.o := n
 KCSAN_SANITIZE_kcov.o := n
 CFLAGS_kcov.o := $(call cc-option, -fno-conserve-stack) -fno-stack-protector
 
-# cond_syscall is currently not LTO compatible
-CFLAGS_sys_ni.o = $(DISABLE_LTO)
-
 obj-y += sched/
 obj-y += locking/
 obj-y += power/
index 66d44d3..d7a7bc3 100644 (file)
@@ -212,9 +212,10 @@ config DEBUG_INFO
 
          If unsure, say N.
 
+if DEBUG_INFO
+
 config DEBUG_INFO_REDUCED
        bool "Reduce debugging information"
-       depends on DEBUG_INFO
        help
          If you say Y here gcc is instructed to generate less debugging
          information for structure types. This means that tools that
@@ -227,7 +228,6 @@ config DEBUG_INFO_REDUCED
 
 config DEBUG_INFO_COMPRESSED
        bool "Compressed debugging information"
-       depends on DEBUG_INFO
        depends on $(cc-option,-gz=zlib)
        depends on $(ld-option,--compress-debug-sections=zlib)
        help
@@ -243,7 +243,6 @@ config DEBUG_INFO_COMPRESSED
 
 config DEBUG_INFO_SPLIT
        bool "Produce split debuginfo in .dwo files"
-       depends on DEBUG_INFO
        depends on $(cc-option,-gsplit-dwarf)
        help
          Generate debug info into separate .dwo files. This significantly
@@ -259,7 +258,6 @@ config DEBUG_INFO_SPLIT
 
 config DEBUG_INFO_DWARF4
        bool "Generate dwarf4 debuginfo"
-       depends on DEBUG_INFO
        depends on $(cc-option,-gdwarf-4)
        help
          Generate dwarf4 debug info. This requires recent versions
@@ -269,7 +267,6 @@ config DEBUG_INFO_DWARF4
 
 config DEBUG_INFO_BTF
        bool "Generate BTF typeinfo"
-       depends on DEBUG_INFO
        depends on !DEBUG_INFO_SPLIT && !DEBUG_INFO_REDUCED
        depends on !GCC_PLUGIN_RANDSTRUCT || COMPILE_TEST
        help
@@ -279,7 +276,6 @@ config DEBUG_INFO_BTF
 
 config GDB_SCRIPTS
        bool "Provide GDB scripts for kernel debugging"
-       depends on DEBUG_INFO
        help
          This creates the required links to GDB helper scripts in the
          build directory. If you load vmlinux into gdb, the helper
@@ -288,6 +284,8 @@ config GDB_SCRIPTS
          instance. See Documentation/dev-tools/gdb-kernel-debugging.rst
          for further details.
 
+endif # DEBUG_INFO
+
 config ENABLE_MUST_CHECK
        bool "Enable __must_check logic"
        default y
index 0d1c8e2..a6c1131 100644 (file)
@@ -8,3 +8,4 @@ asn1_compiler
 extract-cert
 sign-file
 insert-sys-cert
+/module.lds
index 83a1637..08e0111 100644 (file)
@@ -56,8 +56,6 @@ kecho := $($(quiet)kecho)
 # - If no file exist it is created
 # - If the content differ the new file is used
 # - If they are equal no change, and no timestamp update
-# - stdin is piped in from the first prerequisite ($<) so one has
-#   to specify a valid file as first prerequisite (often the kbuild file)
 define filechk
        $(Q)set -e;                                             \
        mkdir -p $(dir $@);                                     \
index bc018e4..b5418ec 100644 (file)
@@ -29,6 +29,9 @@ endif
 # The following programs are only built on demand
 hostprogs += unifdef
 
+# The module linker script is preprocessed on demand
+targets += module.lds
+
 subdir-$(CONFIG_GCC_PLUGINS) += gcc-plugins
 subdir-$(CONFIG_MODVERSIONS) += genksyms
 subdir-$(CONFIG_SECURITY_SELINUX) += selinux
index a467b93..ae64737 100644 (file)
@@ -111,7 +111,7 @@ endif
 # ---------------------------------------------------------------------------
 
 quiet_cmd_cc_s_c = CC $(quiet_modtag)  $@
-      cmd_cc_s_c = $(CC) $(filter-out $(DEBUG_CFLAGS), $(c_flags)) $(DISABLE_LTO) -fverbose-asm -S -o $@ $<
+      cmd_cc_s_c = $(CC) $(filter-out $(DEBUG_CFLAGS), $(c_flags)) -fverbose-asm -S -o $@ $<
 
 $(obj)/%.s: $(src)/%.c FORCE
        $(call if_changed_dep,cc_s_c)
index f4beee1..1e000cc 100644 (file)
@@ -1,8 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
-ifdef CONFIG_KASAN
 CFLAGS_KASAN_NOSANITIZE := -fno-builtin
 KASAN_SHADOW_OFFSET ?= $(CONFIG_KASAN_SHADOW_OFFSET)
-endif
 
 ifdef CONFIG_KASAN_GENERIC
 
@@ -49,3 +47,5 @@ CFLAGS_KASAN := -fsanitize=kernel-hwaddress \
                $(instrumentation_flags)
 
 endif # CONFIG_KASAN_SW_TAGS
+
+export CFLAGS_KASAN CFLAGS_KASAN_NOSANITIZE
index c37f951..37cb504 100644 (file)
@@ -9,7 +9,7 @@ endif
 
 # Keep most options here optional, to allow enabling more compilers if absence
 # of some options does not break KCSAN nor causes false positive reports.
-CFLAGS_KCSAN := -fsanitize=thread \
+export CFLAGS_KCSAN := -fsanitize=thread \
        $(call cc-option,$(call cc-param,tsan-instrument-func-entry-exit=0) -fno-optimize-sibling-calls) \
        $(call cc-option,$(call cc-param,tsan-compound-read-before-write=1),$(call cc-option,$(call cc-param,tsan-instrument-read-before-write=1))) \
        $(call cc-param,tsan-distinguish-volatile=1)
index 411c1e6..ae01baf 100644 (file)
@@ -33,11 +33,10 @@ quiet_cmd_ld_ko_o = LD [M]  $@
       cmd_ld_ko_o =                                                     \
        $(LD) -r $(KBUILD_LDFLAGS)                                      \
                $(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE)              \
-               $(addprefix -T , $(KBUILD_LDS_MODULE))                  \
-               -o $@ $(filter %.o, $^);                                \
+               -T scripts/module.lds -o $@ $(filter %.o, $^);          \
        $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
 
-$(modules): %.ko: %.o %.mod.o $(KBUILD_LDS_MODULE) FORCE
+$(modules): %.ko: %.o %.mod.o scripts/module.lds FORCE
        +$(call if_changed,ld_ko_o)
 
 targets += $(modules) $(modules:.ko=.mod.o)
index 4e3fff0..9716dab 100644 (file)
@@ -1,4 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
+
+export CFLAGS_UBSAN :=
+
 ifdef CONFIG_UBSAN_ALIGNMENT
       CFLAGS_UBSAN += $(call cc-option, -fsanitize=alignment)
 endif
diff --git a/scripts/clang-tools/gen_compile_commands.py b/scripts/clang-tools/gen_compile_commands.py
new file mode 100755 (executable)
index 0000000..1996370
--- /dev/null
@@ -0,0 +1,236 @@
+#!/usr/bin/env python
+# SPDX-License-Identifier: GPL-2.0
+#
+# Copyright (C) Google LLC, 2018
+#
+# Author: Tom Roeder <tmroeder@google.com>
+#
+"""A tool for generating compile_commands.json in the Linux kernel."""
+
+import argparse
+import json
+import logging
+import os
+import re
+import subprocess
+
+_DEFAULT_OUTPUT = 'compile_commands.json'
+_DEFAULT_LOG_LEVEL = 'WARNING'
+
+_FILENAME_PATTERN = r'^\..*\.cmd$'
+_LINE_PATTERN = r'^cmd_[^ ]*\.o := (.* )([^ ]*\.c)$'
+_VALID_LOG_LEVELS = ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']
+
+
+def parse_arguments():
+    """Sets up and parses command-line arguments.
+
+    Returns:
+        log_level: A logging level to filter log output.
+        directory: The work directory where the objects were built.
+        ar: Command used for parsing .a archives.
+        output: Where to write the compile-commands JSON file.
+        paths: The list of files/directories to handle to find .cmd files.
+    """
+    usage = 'Creates a compile_commands.json database from kernel .cmd files'
+    parser = argparse.ArgumentParser(description=usage)
+
+    directory_help = ('specify the output directory used for the kernel build '
+                      '(defaults to the working directory)')
+    parser.add_argument('-d', '--directory', type=str, default='.',
+                        help=directory_help)
+
+    output_help = ('path to the output command database (defaults to ' +
+                   _DEFAULT_OUTPUT + ')')
+    parser.add_argument('-o', '--output', type=str, default=_DEFAULT_OUTPUT,
+                        help=output_help)
+
+    log_level_help = ('the level of log messages to produce (defaults to ' +
+                      _DEFAULT_LOG_LEVEL + ')')
+    parser.add_argument('--log_level', choices=_VALID_LOG_LEVELS,
+                        default=_DEFAULT_LOG_LEVEL, help=log_level_help)
+
+    ar_help = 'command used for parsing .a archives'
+    parser.add_argument('-a', '--ar', type=str, default='llvm-ar', help=ar_help)
+
+    paths_help = ('directories to search or files to parse '
+                  '(files should be *.o, *.a, or modules.order). '
+                  'If nothing is specified, the current directory is searched')
+    parser.add_argument('paths', type=str, nargs='*', help=paths_help)
+
+    args = parser.parse_args()
+
+    return (args.log_level,
+            os.path.abspath(args.directory),
+            args.output,
+            args.ar,
+            args.paths if len(args.paths) > 0 else [args.directory])
+
+
+def cmdfiles_in_dir(directory):
+    """Generate the iterator of .cmd files found under the directory.
+
+    Walk under the given directory, and yield every .cmd file found.
+
+    Args:
+        directory: The directory to search for .cmd files.
+
+    Yields:
+        The path to a .cmd file.
+    """
+
+    filename_matcher = re.compile(_FILENAME_PATTERN)
+
+    for dirpath, _, filenames in os.walk(directory):
+        for filename in filenames:
+            if filename_matcher.match(filename):
+                yield os.path.join(dirpath, filename)
+
+
+def to_cmdfile(path):
+    """Return the path of .cmd file used for the given build artifact
+
+    Args:
+        Path: file path
+
+    Returns:
+        The path to .cmd file
+    """
+    dir, base = os.path.split(path)
+    return os.path.join(dir, '.' + base + '.cmd')
+
+
+def cmdfiles_for_o(obj):
+    """Generate the iterator of .cmd files associated with the object
+
+    Yield the .cmd file used to build the given object
+
+    Args:
+        obj: The object path
+
+    Yields:
+        The path to .cmd file
+    """
+    yield to_cmdfile(obj)
+
+
+def cmdfiles_for_a(archive, ar):
+    """Generate the iterator of .cmd files associated with the archive.
+
+    Parse the given archive, and yield every .cmd file used to build it.
+
+    Args:
+        archive: The archive to parse
+
+    Yields:
+        The path to every .cmd file found
+    """
+    for obj in subprocess.check_output([ar, '-t', archive]).decode().split():
+        yield to_cmdfile(obj)
+
+
+def cmdfiles_for_modorder(modorder):
+    """Generate the iterator of .cmd files associated with the modules.order.
+
+    Parse the given modules.order, and yield every .cmd file used to build the
+    contained modules.
+
+    Args:
+        modorder: The modules.order file to parse
+
+    Yields:
+        The path to every .cmd file found
+    """
+    with open(modorder) as f:
+        for line in f:
+            ko = line.rstrip()
+            base, ext = os.path.splitext(ko)
+            if ext != '.ko':
+                sys.exit('{}: module path must end with .ko'.format(ko))
+            mod = base + '.mod'
+           # The first line of *.mod lists the objects that compose the module.
+            with open(mod) as m:
+                for obj in m.readline().split():
+                    yield to_cmdfile(obj)
+
+
+def process_line(root_directory, command_prefix, file_path):
+    """Extracts information from a .cmd line and creates an entry from it.
+
+    Args:
+        root_directory: The directory that was searched for .cmd files. Usually
+            used directly in the "directory" entry in compile_commands.json.
+        command_prefix: The extracted command line, up to the last element.
+        file_path: The .c file from the end of the extracted command.
+            Usually relative to root_directory, but sometimes absolute.
+
+    Returns:
+        An entry to append to compile_commands.
+
+    Raises:
+        ValueError: Could not find the extracted file based on file_path and
+            root_directory or file_directory.
+    """
+    # The .cmd files are intended to be included directly by Make, so they
+    # escape the pound sign '#', either as '\#' or '$(pound)' (depending on the
+    # kernel version). The compile_commands.json file is not interepreted
+    # by Make, so this code replaces the escaped version with '#'.
+    prefix = command_prefix.replace('\#', '#').replace('$(pound)', '#')
+
+    # Use os.path.abspath() to normalize the path resolving '.' and '..' .
+    abs_path = os.path.abspath(os.path.join(root_directory, file_path))
+    if not os.path.exists(abs_path):
+        raise ValueError('File %s not found' % abs_path)
+    return {
+        'directory': root_directory,
+        'file': abs_path,
+        'command': prefix + file_path,
+    }
+
+
+def main():
+    """Walks through the directory and finds and parses .cmd files."""
+    log_level, directory, output, ar, paths = parse_arguments()
+
+    level = getattr(logging, log_level)
+    logging.basicConfig(format='%(levelname)s: %(message)s', level=level)
+
+    line_matcher = re.compile(_LINE_PATTERN)
+
+    compile_commands = []
+
+    for path in paths:
+        # If 'path' is a directory, handle all .cmd files under it.
+        # Otherwise, handle .cmd files associated with the file.
+        # Most of built-in objects are linked via archives (built-in.a or lib.a)
+        # but some objects are linked to vmlinux directly.
+        # Modules are listed in modules.order.
+        if os.path.isdir(path):
+            cmdfiles = cmdfiles_in_dir(path)
+        elif path.endswith('.o'):
+            cmdfiles = cmdfiles_for_o(path)
+        elif path.endswith('.a'):
+            cmdfiles = cmdfiles_for_a(path, ar)
+        elif path.endswith('modules.order'):
+            cmdfiles = cmdfiles_for_modorder(path)
+        else:
+            sys.exit('{}: unknown file type'.format(path))
+
+        for cmdfile in cmdfiles:
+            with open(cmdfile, 'rt') as f:
+                result = line_matcher.match(f.readline())
+                if result:
+                    try:
+                        entry = process_line(directory, result.group(1),
+                                             result.group(2))
+                        compile_commands.append(entry)
+                    except ValueError as err:
+                        logging.info('Could not add line from %s: %s',
+                                     cmdfile, err)
+
+    with open(output, 'wt') as f:
+        json.dump(compile_commands, f, indent=2, sort_keys=True)
+
+
+if __name__ == '__main__':
+    main()
diff --git a/scripts/clang-tools/run-clang-tools.py b/scripts/clang-tools/run-clang-tools.py
new file mode 100755 (executable)
index 0000000..fa7655c
--- /dev/null
@@ -0,0 +1,74 @@
+#!/usr/bin/env python
+# SPDX-License-Identifier: GPL-2.0
+#
+# Copyright (C) Google LLC, 2020
+#
+# Author: Nathan Huckleberry <nhuck@google.com>
+#
+"""A helper routine run clang-tidy and the clang static-analyzer on
+compile_commands.json.
+"""
+
+import argparse
+import json
+import multiprocessing
+import os
+import subprocess
+import sys
+
+
+def parse_arguments():
+    """Set up and parses command-line arguments.
+    Returns:
+        args: Dict of parsed args
+        Has keys: [path, type]
+    """
+    usage = """Run clang-tidy or the clang static-analyzer on a
+        compilation database."""
+    parser = argparse.ArgumentParser(description=usage)
+
+    type_help = "Type of analysis to be performed"
+    parser.add_argument("type",
+                        choices=["clang-tidy", "clang-analyzer"],
+                        help=type_help)
+    path_help = "Path to the compilation database to parse"
+    parser.add_argument("path", type=str, help=path_help)
+
+    return parser.parse_args()
+
+
+def init(l, a):
+    global lock
+    global args
+    lock = l
+    args = a
+
+
+def run_analysis(entry):
+    # Disable all checks, then re-enable the ones we want
+    checks = "-checks=-*,"
+    if args.type == "clang-tidy":
+        checks += "linuxkernel-*"
+    else:
+        checks += "clang-analyzer-*"
+    p = subprocess.run(["clang-tidy", "-p", args.path, checks, entry["file"]],
+                       stdout=subprocess.PIPE,
+                       stderr=subprocess.STDOUT,
+                       cwd=entry["directory"])
+    with lock:
+        sys.stderr.buffer.write(p.stdout)
+
+
+def main():
+    args = parse_arguments()
+
+    lock = multiprocessing.Lock()
+    pool = multiprocessing.Pool(initializer=init, initargs=(lock, args))
+    # Read JSON data into the datastore variable
+    with open(args.path, "r") as f:
+        datastore = json.load(f)
+        pool.map(run_analysis, datastore)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/scripts/gen_compile_commands.py b/scripts/gen_compile_commands.py
deleted file mode 100755 (executable)
index c458696..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-#!/usr/bin/env python
-# SPDX-License-Identifier: GPL-2.0
-#
-# Copyright (C) Google LLC, 2018
-#
-# Author: Tom Roeder <tmroeder@google.com>
-#
-"""A tool for generating compile_commands.json in the Linux kernel."""
-
-import argparse
-import json
-import logging
-import os
-import re
-
-_DEFAULT_OUTPUT = 'compile_commands.json'
-_DEFAULT_LOG_LEVEL = 'WARNING'
-
-_FILENAME_PATTERN = r'^\..*\.cmd$'
-_LINE_PATTERN = r'^cmd_[^ ]*\.o := (.* )([^ ]*\.c)$'
-_VALID_LOG_LEVELS = ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']
-
-# A kernel build generally has over 2000 entries in its compile_commands.json
-# database. If this code finds 300 or fewer, then warn the user that they might
-# not have all the .cmd files, and they might need to compile the kernel.
-_LOW_COUNT_THRESHOLD = 300
-
-
-def parse_arguments():
-    """Sets up and parses command-line arguments.
-
-    Returns:
-        log_level: A logging level to filter log output.
-        directory: The directory to search for .cmd files.
-        output: Where to write the compile-commands JSON file.
-    """
-    usage = 'Creates a compile_commands.json database from kernel .cmd files'
-    parser = argparse.ArgumentParser(description=usage)
-
-    directory_help = ('Path to the kernel source directory to search '
-                      '(defaults to the working directory)')
-    parser.add_argument('-d', '--directory', type=str, help=directory_help)
-
-    output_help = ('The location to write compile_commands.json (defaults to '
-                   'compile_commands.json in the search directory)')
-    parser.add_argument('-o', '--output', type=str, help=output_help)
-
-    log_level_help = ('The level of log messages to produce (one of ' +
-                      ', '.join(_VALID_LOG_LEVELS) + '; defaults to ' +
-                      _DEFAULT_LOG_LEVEL + ')')
-    parser.add_argument(
-        '--log_level', type=str, default=_DEFAULT_LOG_LEVEL,
-        help=log_level_help)
-
-    args = parser.parse_args()
-
-    log_level = args.log_level
-    if log_level not in _VALID_LOG_LEVELS:
-        raise ValueError('%s is not a valid log level' % log_level)
-
-    directory = args.directory or os.getcwd()
-    output = args.output or os.path.join(directory, _DEFAULT_OUTPUT)
-    directory = os.path.abspath(directory)
-
-    return log_level, directory, output
-
-
-def process_line(root_directory, file_directory, command_prefix, relative_path):
-    """Extracts information from a .cmd line and creates an entry from it.
-
-    Args:
-        root_directory: The directory that was searched for .cmd files. Usually
-            used directly in the "directory" entry in compile_commands.json.
-        file_directory: The path to the directory the .cmd file was found in.
-        command_prefix: The extracted command line, up to the last element.
-        relative_path: The .c file from the end of the extracted command.
-            Usually relative to root_directory, but sometimes relative to
-            file_directory and sometimes neither.
-
-    Returns:
-        An entry to append to compile_commands.
-
-    Raises:
-        ValueError: Could not find the extracted file based on relative_path and
-            root_directory or file_directory.
-    """
-    # The .cmd files are intended to be included directly by Make, so they
-    # escape the pound sign '#', either as '\#' or '$(pound)' (depending on the
-    # kernel version). The compile_commands.json file is not interepreted
-    # by Make, so this code replaces the escaped version with '#'.
-    prefix = command_prefix.replace('\#', '#').replace('$(pound)', '#')
-
-    cur_dir = root_directory
-    expected_path = os.path.join(cur_dir, relative_path)
-    if not os.path.exists(expected_path):
-        # Try using file_directory instead. Some of the tools have a different
-        # style of .cmd file than the kernel.
-        cur_dir = file_directory
-        expected_path = os.path.join(cur_dir, relative_path)
-        if not os.path.exists(expected_path):
-            raise ValueError('File %s not in %s or %s' %
-                             (relative_path, root_directory, file_directory))
-    return {
-        'directory': cur_dir,
-        'file': relative_path,
-        'command': prefix + relative_path,
-    }
-
-
-def main():
-    """Walks through the directory and finds and parses .cmd files."""
-    log_level, directory, output = parse_arguments()
-
-    level = getattr(logging, log_level)
-    logging.basicConfig(format='%(levelname)s: %(message)s', level=level)
-
-    filename_matcher = re.compile(_FILENAME_PATTERN)
-    line_matcher = re.compile(_LINE_PATTERN)
-
-    compile_commands = []
-    for dirpath, _, filenames in os.walk(directory):
-        for filename in filenames:
-            if not filename_matcher.match(filename):
-                continue
-            filepath = os.path.join(dirpath, filename)
-
-            with open(filepath, 'rt') as f:
-                for line in f:
-                    result = line_matcher.match(line)
-                    if not result:
-                        continue
-
-                    try:
-                        entry = process_line(directory, dirpath,
-                                             result.group(1), result.group(2))
-                        compile_commands.append(entry)
-                    except ValueError as err:
-                        logging.info('Could not add line from %s: %s',
-                                     filepath, err)
-
-    with open(output, 'wt') as f:
-        json.dump(compile_commands, f, indent=2, sort_keys=True)
-
-    count = len(compile_commands)
-    if count < _LOW_COUNT_THRESHOLD:
-        logging.warning(
-            'Found %s entries. Have you compiled the kernel?', count)
-
-
-if __name__ == '__main__':
-    main()
index 52b59bf..e46df0a 100644 (file)
@@ -20,19 +20,19 @@ endif
 unexport CONFIG_
 
 xconfig: $(obj)/qconf
-       $< $(silent) $(Kconfig)
+       $(Q)$< $(silent) $(Kconfig)
 
 gconfig: $(obj)/gconf
-       $< $(silent) $(Kconfig)
+       $(Q)$< $(silent) $(Kconfig)
 
 menuconfig: $(obj)/mconf
-       $< $(silent) $(Kconfig)
+       $(Q)$< $(silent) $(Kconfig)
 
 config: $(obj)/conf
-       $< $(silent) --oldaskconfig $(Kconfig)
+       $(Q)$< $(silent) --oldaskconfig $(Kconfig)
 
 nconfig: $(obj)/nconf
-       $< $(silent) $(Kconfig)
+       $(Q)$< $(silent) $(Kconfig)
 
 build_menuconfig: $(obj)/mconf
 
@@ -68,12 +68,12 @@ simple-targets := oldconfig allnoconfig allyesconfig allmodconfig \
 PHONY += $(simple-targets)
 
 $(simple-targets): $(obj)/conf
-       $< $(silent) --$@ $(Kconfig)
+       $(Q)$< $(silent) --$@ $(Kconfig)
 
 PHONY += savedefconfig defconfig
 
 savedefconfig: $(obj)/conf
-       $< $(silent) --$@=defconfig $(Kconfig)
+       $(Q)$< $(silent) --$@=defconfig $(Kconfig)
 
 defconfig: $(obj)/conf
 ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)),)
@@ -111,7 +111,7 @@ tinyconfig:
 # CHECK: -o cache_dir=<path> working?
 PHONY += testconfig
 testconfig: $(obj)/conf
-       $(PYTHON3) -B -m pytest $(srctree)/$(src)/tests \
+       $(Q)$(PYTHON3) -B -m pytest $(srctree)/$(src)/tests \
        -o cache_dir=$(abspath $(obj)/tests/.cache) \
        $(if $(findstring 1,$(KBUILD_VERBOSE)),--capture=no)
 clean-files += tests/.cache
index dbde59d..6eded32 100755 (executable)
@@ -169,10 +169,9 @@ gen_btf()
        printf '\1' | dd of=${2} conv=notrunc bs=1 seek=16 status=none
 }
 
-# Create ${2} .o file with all symbols from the ${1} object file
+# Create ${2} .S file with all symbols from the ${1} object file
 kallsyms()
 {
-       info KSYM ${2}
        local kallsymopt;
 
        if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then
@@ -187,13 +186,8 @@ kallsyms()
                kallsymopt="${kallsymopt} --base-relative"
        fi
 
-       local aflags="${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL}               \
-                     ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS}"
-
-       local afile="`basename ${2} .o`.S"
-
-       ${NM} -n ${1} | scripts/kallsyms ${kallsymopt} > ${afile}
-       ${CC} ${aflags} -c -o ${2} ${afile}
+       info KSYMS ${2}
+       ${NM} -n ${1} | scripts/kallsyms ${kallsymopt} > ${2}
 }
 
 # Perform one step in kallsyms generation, including temporary linking of
@@ -203,9 +197,15 @@ kallsyms_step()
        kallsymso_prev=${kallsymso}
        kallsyms_vmlinux=.tmp_vmlinux.kallsyms${1}
        kallsymso=${kallsyms_vmlinux}.o
+       kallsyms_S=${kallsyms_vmlinux}.S
 
        vmlinux_link ${kallsyms_vmlinux} "${kallsymso_prev}" ${btf_vmlinux_bin_o}
-       kallsyms ${kallsyms_vmlinux} ${kallsymso}
+       kallsyms ${kallsyms_vmlinux} ${kallsyms_S}
+
+       info AS ${kallsyms_S}
+       ${CC} ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS} \
+             ${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} \
+             -c -o ${kallsymso} ${kallsyms_S}
 }
 
 # Create map file with all symbols from ${1}
index baf3ab8..4ae7350 100755 (executable)
@@ -35,7 +35,7 @@ else
        LINUX_COMPILE_BY=$KBUILD_BUILD_USER
 fi
 if test -z "$KBUILD_BUILD_HOST"; then
-       LINUX_COMPILE_HOST=`hostname`
+       LINUX_COMPILE_HOST=`uname -n`
 else
        LINUX_COMPILE_HOST=$KBUILD_BUILD_HOST
 fi
diff --git a/scripts/module-common.lds b/scripts/module-common.lds
deleted file mode 100644 (file)
index d61b9e8..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Common module linker script, always used when linking a module.
- * Archs are free to supply their own linker scripts.  ld will
- * combine them automatically.
- */
-SECTIONS {
-       /DISCARD/ : {
-               *(.discard)
-               *(.discard.*)
-       }
-
-       __ksymtab               0 : { *(SORT(___ksymtab+*)) }
-       __ksymtab_gpl           0 : { *(SORT(___ksymtab_gpl+*)) }
-       __ksymtab_unused        0 : { *(SORT(___ksymtab_unused+*)) }
-       __ksymtab_unused_gpl    0 : { *(SORT(___ksymtab_unused_gpl+*)) }
-       __ksymtab_gpl_future    0 : { *(SORT(___ksymtab_gpl_future+*)) }
-       __kcrctab               0 : { *(SORT(___kcrctab+*)) }
-       __kcrctab_gpl           0 : { *(SORT(___kcrctab_gpl+*)) }
-       __kcrctab_unused        0 : { *(SORT(___kcrctab_unused+*)) }
-       __kcrctab_unused_gpl    0 : { *(SORT(___kcrctab_unused_gpl+*)) }
-       __kcrctab_gpl_future    0 : { *(SORT(___kcrctab_gpl_future+*)) }
-
-       .init_array             0 : ALIGN(8) { *(SORT(.init_array.*)) *(.init_array) }
-
-       __jump_table            0 : ALIGN(8) { KEEP(*(__jump_table)) }
-}
diff --git a/scripts/module.lds.S b/scripts/module.lds.S
new file mode 100644 (file)
index 0000000..69b9b71
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Common module linker script, always used when linking a module.
+ * Archs are free to supply their own linker scripts.  ld will
+ * combine them automatically.
+ */
+SECTIONS {
+       /DISCARD/ : {
+               *(.discard)
+               *(.discard.*)
+       }
+
+       __ksymtab               0 : { *(SORT(___ksymtab+*)) }
+       __ksymtab_gpl           0 : { *(SORT(___ksymtab_gpl+*)) }
+       __ksymtab_unused        0 : { *(SORT(___ksymtab_unused+*)) }
+       __ksymtab_unused_gpl    0 : { *(SORT(___ksymtab_unused_gpl+*)) }
+       __ksymtab_gpl_future    0 : { *(SORT(___ksymtab_gpl_future+*)) }
+       __kcrctab               0 : { *(SORT(___kcrctab+*)) }
+       __kcrctab_gpl           0 : { *(SORT(___kcrctab_gpl+*)) }
+       __kcrctab_unused        0 : { *(SORT(___kcrctab_unused+*)) }
+       __kcrctab_unused_gpl    0 : { *(SORT(___kcrctab_unused_gpl+*)) }
+       __kcrctab_gpl_future    0 : { *(SORT(___kcrctab_gpl_future+*)) }
+
+       .init_array             0 : ALIGN(8) { *(SORT(.init_array.*)) *(.init_array) }
+
+       __jump_table            0 : ALIGN(8) { KEEP(*(__jump_table)) }
+}
+
+/* bring in arch-specific sections */
+#include <asm/module.lds.h>
diff --git a/scripts/namespace.pl b/scripts/namespace.pl
deleted file mode 100755 (executable)
index 1da7bca..0000000
+++ /dev/null
@@ -1,473 +0,0 @@
-#!/usr/bin/env perl
-#
-#      namespace.pl.  Mon Aug 30 2004
-#
-#      Perform a name space analysis on the linux kernel.
-#
-#      Copyright Keith Owens <kaos@ocs.com.au>.  GPL.
-#
-#      Invoke by changing directory to the top of the kernel object
-#      tree then namespace.pl, no parameters.
-#
-#      Tuned for 2.1.x kernels with the new module handling, it will
-#      work with 2.0 kernels as well.
-#
-#      Last change 2.6.9-rc1, adding support for separate source and object
-#      trees.
-#
-#      The source must be compiled/assembled first, the object files
-#      are the primary input to this script.  Incomplete or missing
-#      objects will result in a flawed analysis.  Compile both vmlinux
-#      and modules.
-#
-#      Even with complete objects, treat the result of the analysis
-#      with caution.  Some external references are only used by
-#      certain architectures, others with certain combinations of
-#      configuration parameters.  Ideally the source should include
-#      something like
-#
-#      #ifndef CONFIG_...
-#      static
-#      #endif
-#      symbol_definition;
-#
-#      so the symbols are defined as static unless a particular
-#      CONFIG_... requires it to be external.
-#
-#      A symbol that is suffixed with '(export only)' has these properties
-#
-#      * It is global.
-#      * It is marked EXPORT_SYMBOL or EXPORT_SYMBOL_GPL, either in the same
-#        source file or a different source file.
-#      * Given the current .config, nothing uses the symbol.
-#
-#      The symbol is a candidate for conversion to static, plus removal of the
-#      export.  But be careful that a different .config might use the symbol.
-#
-#
-#      Name space analysis and cleanup is an iterative process.  You cannot
-#      expect to find all the problems in a single pass.
-#
-#      * Identify possibly unnecessary global declarations, verify that they
-#        really are unnecessary and change them to static.
-#      * Compile and fix up gcc warnings about static, removing dead symbols
-#        as necessary.
-#      * make clean and rebuild with different configs (especially
-#        CONFIG_MODULES=n) to see which symbols are being defined when the
-#        config does not require them.  These symbols bloat the kernel object
-#        for no good reason, which is frustrating for embedded systems.
-#      * Wrap config sensitive symbols in #ifdef CONFIG_foo, as long as the
-#        code does not get too ugly.
-#      * Repeat the name space analysis until you can live with with the
-#        result.
-#
-
-use warnings;
-use strict;
-use File::Find;
-use File::Spec;
-
-my $nm = ($ENV{'NM'} || "nm") . " -p";
-my $objdump = ($ENV{'OBJDUMP'} || "objdump") . " -s -j .comment";
-my $srctree = File::Spec->curdir();
-my $objtree = File::Spec->curdir();
-$srctree = File::Spec->rel2abs($ENV{'srctree'}) if (exists($ENV{'srctree'}));
-$objtree = File::Spec->rel2abs($ENV{'objtree'}) if (exists($ENV{'objtree'}));
-
-if ($#ARGV != -1) {
-       print STDERR "usage: $0 takes no parameters\n";
-       die("giving up\n");
-}
-
-my %nmdata = ();       # nm data for each object
-my %def = ();          # all definitions for each name
-my %ksymtab = ();      # names that appear in __ksymtab_
-my %ref = ();          # $ref{$name} exists if there is a true external reference to $name
-my %export = ();       # $export{$name} exists if there is an EXPORT_... of $name
-
-my %nmexception = (
-    'fs/ext3/bitmap'                   => 1,
-    'fs/ext4/bitmap'                   => 1,
-    'arch/x86/lib/thunk_32'            => 1,
-    'arch/x86/lib/cmpxchg'             => 1,
-    'arch/x86/vdso/vdso32/note'                => 1,
-    'lib/irq_regs'                     => 1,
-    'usr/initramfs_data'               => 1,
-    'drivers/scsi/aic94xx/aic94xx_dump'        => 1,
-    'drivers/scsi/libsas/sas_dump'     => 1,
-    'lib/dec_and_lock'                 => 1,
-    'drivers/ide/ide-probe-mini'       => 1,
-    'usr/initramfs_data'               => 1,
-    'drivers/acpi/acpia/exdump'                => 1,
-    'drivers/acpi/acpia/rsdump'                => 1,
-    'drivers/acpi/acpia/nsdumpdv'      => 1,
-    'drivers/acpi/acpia/nsdump'                => 1,
-    'arch/ia64/sn/kernel/sn2/io'       => 1,
-    'arch/ia64/kernel/gate-data'       => 1,
-    'security/capability'              => 1,
-    'fs/ntfs/sysctl'                   => 1,
-    'fs/jfs/jfs_debug'                 => 1,
-);
-
-my %nameexception = (
-    'mod_use_count_'    => 1,
-    '__initramfs_end'  => 1,
-    '__initramfs_start'        => 1,
-    '_einittext'       => 1,
-    '_sinittext'       => 1,
-    'kallsyms_names'   => 1,
-    'kallsyms_num_syms'        => 1,
-    'kallsyms_addresses'=> 1,
-    'kallsyms_offsets' => 1,
-    'kallsyms_relative_base'=> 1,
-    '__this_module'    => 1,
-    '_etext'           => 1,
-    '_edata'           => 1,
-    '_end'             => 1,
-    '__bss_start'      => 1,
-    '_text'            => 1,
-    '_stext'           => 1,
-    '__gp'             => 1,
-    'ia64_unw_start'   => 1,
-    'ia64_unw_end'     => 1,
-    '__init_begin'     => 1,
-    '__init_end'       => 1,
-    '__bss_stop'       => 1,
-    '__nosave_begin'   => 1,
-    '__nosave_end'     => 1,
-    'pg0'              => 1,
-    'vdso_enabled'     => 1,
-    '__stack_chk_fail'  => 1,
-    'VDSO32_PRELINK'   => 1,
-    'VDSO32_vsyscall'  => 1,
-    'VDSO32_rt_sigreturn'=>1,
-    'VDSO32_sigreturn' => 1,
-);
-
-
-&find(\&linux_objects, '.');   # find the objects and do_nm on them
-&list_multiply_defined();
-&resolve_external_references();
-&list_extra_externals();
-
-exit(0);
-
-sub linux_objects
-{
-       # Select objects, ignoring objects which are only created by
-       # merging other objects.  Also ignore all of modules, scripts
-       # and compressed.  Most conglomerate objects are handled by do_nm,
-       # this list only contains the special cases.  These include objects
-       # that are linked from just one other object and objects for which
-       # there is really no permanent source file.
-       my $basename = $_;
-       $_ = $File::Find::name;
-       s:^\./::;
-       if (/.*\.o$/ &&
-               ! (
-               m:/built-in.a$:
-               || m:arch/x86/vdso/:
-               || m:arch/x86/boot/:
-               || m:arch/ia64/ia32/ia32.o$:
-               || m:arch/ia64/kernel/gate-syms.o$:
-               || m:arch/ia64/lib/__divdi3.o$:
-               || m:arch/ia64/lib/__divsi3.o$:
-               || m:arch/ia64/lib/__moddi3.o$:
-               || m:arch/ia64/lib/__modsi3.o$:
-               || m:arch/ia64/lib/__udivdi3.o$:
-               || m:arch/ia64/lib/__udivsi3.o$:
-               || m:arch/ia64/lib/__umoddi3.o$:
-               || m:arch/ia64/lib/__umodsi3.o$:
-               || m:arch/ia64/scripts/check_gas_for_hint.o$:
-               || m:arch/ia64/sn/kernel/xp.o$:
-               || m:boot/bbootsect.o$:
-               || m:boot/bsetup.o$:
-               || m:/bootsect.o$:
-               || m:/boot/setup.o$:
-               || m:/compressed/:
-               || m:drivers/cdrom/driver.o$:
-               || m:drivers/char/drm/tdfx_drv.o$:
-               || m:drivers/ide/ide-detect.o$:
-               || m:drivers/ide/pci/idedriver-pci.o$:
-               || m:drivers/media/media.o$:
-               || m:drivers/scsi/sd_mod.o$:
-               || m:drivers/video/video.o$:
-               || m:fs/devpts/devpts.o$:
-               || m:fs/exportfs/exportfs.o$:
-               || m:fs/hugetlbfs/hugetlbfs.o$:
-               || m:fs/msdos/msdos.o$:
-               || m:fs/nls/nls.o$:
-               || m:fs/ramfs/ramfs.o$:
-               || m:fs/romfs/romfs.o$:
-               || m:fs/vfat/vfat.o$:
-               || m:init/mounts.o$:
-               || m:^modules/:
-               || m:net/netlink/netlink.o$:
-               || m:net/sched/sched.o$:
-               || m:/piggy.o$:
-               || m:^scripts/:
-               || m:sound/.*/snd-:
-               || m:^.*/\.tmp_:
-               || m:^\.tmp_:
-               || m:/vmlinux-obj.o$:
-               || m:^tools/:
-               )
-       ) {
-               do_nm($basename, $_);
-       }
-       $_ = $basename;         # File::Find expects $_ untouched (undocumented)
-}
-
-sub do_nm
-{
-       my ($basename, $fullname) = @_;
-       my ($source, $type, $name);
-       if (! -e $basename) {
-               printf STDERR "$basename does not exist\n";
-               return;
-       }
-       if ($fullname !~ /\.o$/) {
-               printf STDERR "$fullname is not an object file\n";
-               return;
-       }
-       ($source = $basename) =~ s/\.o$//;
-       if (-e "$source.c" || -e "$source.S") {
-               $source = File::Spec->catfile($objtree, $File::Find::dir, $source)
-       } else {
-               $source = File::Spec->catfile($srctree, $File::Find::dir, $source)
-       }
-       if (! -e "$source.c" && ! -e "$source.S") {
-               # No obvious source, exclude the object if it is conglomerate
-               open(my $objdumpdata, "$objdump $basename|")
-                   or die "$objdump $fullname failed $!\n";
-
-               my $comment;
-               while (<$objdumpdata>) {
-                       chomp();
-                       if (/^In archive/) {
-                               # Archives are always conglomerate
-                               $comment = "GCC:GCC:";
-                               last;
-                       }
-                       next if (! /^[ 0-9a-f]{5,} /);
-                       $comment .= substr($_, 43);
-               }
-               close($objdumpdata);
-
-               if (!defined($comment) || $comment !~ /GCC\:.*GCC\:/m) {
-                       printf STDERR "No source file found for $fullname\n";
-               }
-               return;
-       }
-       open (my $nmdata, "$nm $basename|")
-           or die "$nm $fullname failed $!\n";
-
-       my @nmdata;
-       while (<$nmdata>) {
-               chop;
-               ($type, $name) = (split(/ +/, $_, 3))[1..2];
-               # Expected types
-               # A absolute symbol
-               # B weak external reference to data that has been resolved
-               # C global variable, uninitialised
-               # D global variable, initialised
-               # G global variable, initialised, small data section
-               # R global array, initialised
-               # S global variable, uninitialised, small bss
-               # T global label/procedure
-               # U external reference
-               # W weak external reference to text that has been resolved
-               # V similar to W, but the value of the weak symbol becomes zero with no error.
-               # a assembler equate
-               # b static variable, uninitialised
-               # d static variable, initialised
-               # g static variable, initialised, small data section
-               # r static array, initialised
-               # s static variable, uninitialised, small bss
-               # t static label/procedures
-               # w weak external reference to text that has not been resolved
-               # v similar to w
-               # ? undefined type, used a lot by modules
-               if ($type !~ /^[ABCDGRSTUWVabdgrstwv?]$/) {
-                       printf STDERR "nm output for $fullname contains unknown type '$_'\n";
-               }
-               elsif ($name =~ /\./) {
-                       # name with '.' is local static
-               }
-               else {
-                       $type = 'R' if ($type eq '?');  # binutils replaced ? with R at one point
-                       # binutils keeps changing the type for exported symbols, force it to R
-                       $type = 'R' if ($name =~ /^__ksymtab/ || $name =~ /^__kstrtab/);
-                       $name =~ s/_R[a-f0-9]{8}$//;    # module versions adds this
-                       if ($type =~ /[ABCDGRSTWV]/ &&
-                               $name ne 'init_module' &&
-                               $name ne 'cleanup_module' &&
-                               $name ne 'Using_Versions' &&
-                               $name !~ /^Version_[0-9]+$/ &&
-                               $name !~ /^__parm_/ &&
-                               $name !~ /^__kstrtab/ &&
-                               $name !~ /^__ksymtab/ &&
-                               $name !~ /^__kcrctab_/ &&
-                               $name !~ /^__exitcall_/ &&
-                               $name !~ /^__initcall_/ &&
-                               $name !~ /^__kdb_initcall_/ &&
-                               $name !~ /^__kdb_exitcall_/ &&
-                               $name !~ /^__module_/ &&
-                               $name !~ /^__mod_/ &&
-                               $name !~ /^__crc_/ &&
-                               $name ne '__this_module' &&
-                               $name ne 'kernel_version') {
-                               if (!exists($def{$name})) {
-                                       $def{$name} = [];
-                               }
-                               push(@{$def{$name}}, $fullname);
-                       }
-                       push(@nmdata, "$type $name");
-                       if ($name =~ /^__ksymtab_/) {
-                               $name = substr($name, 10);
-                               if (!exists($ksymtab{$name})) {
-                                       $ksymtab{$name} = [];
-                               }
-                               push(@{$ksymtab{$name}}, $fullname);
-                       }
-               }
-       }
-       close($nmdata);
-
-       if ($#nmdata < 0) {
-           printf "No nm data for $fullname\n"
-               unless $nmexception{$fullname};
-           return;
-       }
-       $nmdata{$fullname} = \@nmdata;
-}
-
-sub drop_def
-{
-       my ($object, $name) = @_;
-       my $nmdata = $nmdata{$object};
-       my ($i, $j);
-       for ($i = 0; $i <= $#{$nmdata}; ++$i) {
-               if ($name eq (split(' ', $nmdata->[$i], 2))[1]) {
-                       splice(@{$nmdata{$object}}, $i, 1);
-                       my $def = $def{$name};
-                       for ($j = 0; $j < $#{$def{$name}}; ++$j) {
-                               if ($def{$name}[$j] eq $object) {
-                                       splice(@{$def{$name}}, $j, 1);
-                               }
-                       }
-                       last;
-               }
-       }
-}
-
-sub list_multiply_defined
-{
-       foreach my $name (keys(%def)) {
-               if ($#{$def{$name}} > 0) {
-                       # Special case for cond_syscall
-                       if ($#{$def{$name}} == 1 &&
-                          ($name =~ /^sys_/ || $name =~ /^compat_sys_/ ||
-                           $name =~ /^sys32_/)) {
-                               if($def{$name}[0] eq "kernel/sys_ni.o" ||
-                                  $def{$name}[1] eq "kernel/sys_ni.o") {
-                                       &drop_def("kernel/sys_ni.o", $name);
-                                       next;
-                               }
-                       }
-
-                       printf "$name is multiply defined in :-\n";
-                       foreach my $module (@{$def{$name}}) {
-                               printf "\t$module\n";
-                       }
-               }
-       }
-}
-
-sub resolve_external_references
-{
-       my ($kstrtab, $ksymtab, $export);
-
-       printf "\n";
-       foreach my $object (keys(%nmdata)) {
-               my $nmdata = $nmdata{$object};
-               for (my $i = 0; $i <= $#{$nmdata}; ++$i) {
-                       my ($type, $name) = split(' ', $nmdata->[$i], 2);
-                       if ($type eq "U" || $type eq "w") {
-                               if (exists($def{$name}) || exists($ksymtab{$name})) {
-                                       # add the owning object to the nmdata
-                                       $nmdata->[$i] = "$type $name $object";
-                                       # only count as a reference if it is not EXPORT_...
-                                       $kstrtab = "R __kstrtab_$name";
-                                       $ksymtab = "R __ksymtab_$name";
-                                       $export = 0;
-                                       for (my $j = 0; $j <= $#{$nmdata}; ++$j) {
-                                               if ($nmdata->[$j] eq $kstrtab ||
-                                                   $nmdata->[$j] eq $ksymtab) {
-                                                       $export = 1;
-                                                       last;
-                                               }
-                                       }
-                                       if ($export) {
-                                               $export{$name} = "";
-                                       }
-                                       else {
-                                               $ref{$name} = ""
-                                       }
-                               }
-                               elsif ( ! $nameexception{$name}
-                                       && $name !~ /^__sched_text_/
-                                       && $name !~ /^__start_/
-                                       && $name !~ /^__end_/
-                                       && $name !~ /^__stop_/
-                                       && $name !~ /^__scheduling_functions_.*_here/
-                                       && $name !~ /^__.*initcall_/
-                                       && $name !~ /^__.*per_cpu_start/
-                                       && $name !~ /^__.*per_cpu_end/
-                                       && $name !~ /^__alt_instructions/
-                                       && $name !~ /^__setup_/
-                                       && $name !~ /^__mod_timer/
-                                       && $name !~ /^__mod_page_state/
-                                       && $name !~ /^init_module/
-                                       && $name !~ /^cleanup_module/
-                               ) {
-                                       printf "Cannot resolve ";
-                                       printf "weak " if ($type eq "w");
-                                       printf "reference to $name from $object\n";
-                               }
-                       }
-               }
-       }
-}
-
-sub list_extra_externals
-{
-       my %noref = ();
-
-       foreach my $name (keys(%def)) {
-               if (! exists($ref{$name})) {
-                       my @module = @{$def{$name}};
-                       foreach my $module (@module) {
-                               if (! exists($noref{$module})) {
-                                       $noref{$module} = [];
-                               }
-                               push(@{$noref{$module}}, $name);
-                       }
-               }
-       }
-       if (%noref) {
-               printf "\nExternally defined symbols with no external references\n";
-               foreach my $module (sort(keys(%noref))) {
-                       printf "  $module\n";
-                       foreach (sort(@{$noref{$module}})) {
-                           my $export;
-                           if (exists($export{$_})) {
-                               $export = " (export only)";
-                           } else {
-                               $export = "";
-                           }
-                           printf "    $_$export\n";
-                       }
-               }
-       }
-}
index 6df3c9f..1b11f89 100755 (executable)
@@ -26,24 +26,29 @@ if_enabled_echo() {
 
 create_package() {
        local pname="$1" pdir="$2"
+       local dpkg_deb_opts
 
        mkdir -m 755 -p "$pdir/DEBIAN"
        mkdir -p "$pdir/usr/share/doc/$pname"
        cp debian/copyright "$pdir/usr/share/doc/$pname/"
        cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian"
-       gzip -9 "$pdir/usr/share/doc/$pname/changelog.Debian"
+       gzip -n -9 "$pdir/usr/share/doc/$pname/changelog.Debian"
        sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \
                | xargs -r0 md5sum > DEBIAN/md5sums"
 
        # Fix ownership and permissions
-       chown -R root:root "$pdir"
+       if [ "$DEB_RULES_REQUIRES_ROOT" = "no" ]; then
+               dpkg_deb_opts="--root-owner-group"
+       else
+               chown -R root:root "$pdir"
+       fi
        chmod -R go-w "$pdir"
        # in case we are in a restrictive umask environment like 0077
        chmod -R a+rX "$pdir"
 
        # Create the package
        dpkg-gencontrol -p$pname -P"$pdir"
-       dpkg-deb ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" ..
+       dpkg-deb $dpkg_deb_opts ${KDEB_COMPRESS:+-Z$KDEB_COMPRESS} --build "$pdir" ..
 }
 
 deploy_kernel_headers () {
@@ -55,7 +60,7 @@ deploy_kernel_headers () {
                cd $srctree
                find . arch/$SRCARCH -maxdepth 1 -name Makefile\*
                find include scripts -type f -o -type l
-               find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform
+               find arch/$SRCARCH -name Kbuild.platforms -o -name Platform
                find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f
        ) > debian/hdrsrcfiles
 
@@ -202,8 +207,10 @@ EOF
 done
 
 if [ "$ARCH" != "um" ]; then
-       deploy_kernel_headers debian/linux-headers
-       create_package linux-headers-$version debian/linux-headers
+       if is_enabled CONFIG_MODULES; then
+               deploy_kernel_headers debian/linux-headers
+               create_package linux-headers-$version debian/linux-headers
+       fi
 
        deploy_libc_headers debian/linux-libc-dev
        create_package linux-libc-dev debian/linux-libc-dev
index 48fbd3d..60a2a63 100755 (executable)
@@ -94,16 +94,16 @@ else
        packageversion=$version-$revision
 fi
 sourcename=$KDEB_SOURCENAME
-packagename=linux-image-$version
-kernel_headers_packagename=linux-headers-$version
-dbg_packagename=$packagename-dbg
-debarch=
-set_debarch
 
 if [ "$ARCH" = "um" ] ; then
-       packagename=user-mode-linux-$version
+       packagename=user-mode-linux
+else
+       packagename=linux-image
 fi
 
+debarch=
+set_debarch
+
 email=${DEBEMAIL-$EMAIL}
 
 # use email string directly if it contains <email>
@@ -174,22 +174,16 @@ Source: $sourcename
 Section: kernel
 Priority: optional
 Maintainer: $maintainer
+Rules-Requires-Root: no
 Build-Depends: bc, rsync, kmod, cpio, bison, flex | flex:native $extra_build_depends
 Homepage: https://www.kernel.org/
 
-Package: $packagename
+Package: $packagename-$version
 Architecture: $debarch
 Description: Linux kernel, version $version
  This package contains the Linux kernel, modules and corresponding other
  files, version: $version.
 
-Package: $kernel_headers_packagename
-Architecture: $debarch
-Description: Linux kernel headers for $version on $debarch
- This package provides kernel header files for $version on $debarch
- .
- This is useful for people who need to build external modules
-
 Package: linux-libc-dev
 Section: devel
 Provides: linux-kernel-headers
@@ -200,10 +194,22 @@ Description: Linux support headers for userspace development
 Multi-Arch: same
 EOF
 
+if is_enabled CONFIG_MODULES; then
+cat <<EOF >> debian/control
+
+Package: linux-headers-$version
+Architecture: $debarch
+Description: Linux kernel headers for $version on $debarch
+ This package provides kernel header files for $version on $debarch
+ .
+ This is useful for people who need to build external modules
+EOF
+fi
+
 if is_enabled CONFIG_DEBUG_INFO; then
 cat <<EOF >> debian/control
 
-Package: $dbg_packagename
+Package: linux-image-$version-dbg
 Section: debug
 Architecture: $debarch
 Description: Linux kernel debugging symbols for $version
@@ -217,11 +223,15 @@ cat <<EOF > debian/rules
 
 srctree ?= .
 
-build:
+build-indep:
+build-arch:
        \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \
        KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile
 
-binary-arch:
+build: build-arch
+
+binary-indep:
+binary-arch: build-arch
        \$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \
        KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile intdeb-pkg
 
index 20f2efd..bb709ed 100755 (executable)
@@ -45,7 +45,7 @@ scm_version()
 
        # Check for git and a git repo.
        if test -z "$(git rev-parse --show-cdup 2>/dev/null)" &&
-          head=$(git rev-parse --verify --short HEAD 2>/dev/null); then
+          head=$(git rev-parse --verify HEAD 2>/dev/null); then
 
                # If we are at a tagged commit (like "v2.6.30-rc6"), we ignore
                # it, because this version is defined in the top level Makefile.
@@ -59,11 +59,22 @@ scm_version()
                        fi
                        # If we are past a tagged commit (like
                        # "v2.6.30-rc5-302-g72357d5"), we pretty print it.
-                       if atag="$(git describe 2>/dev/null)"; then
-                               echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'
-
-                       # If we don't have a tag at all we print -g{commitish}.
+                       #
+                       # Ensure the abbreviated sha1 has exactly 12
+                       # hex characters, to make the output
+                       # independent of git version, local
+                       # core.abbrev settings and/or total number of
+                       # objects in the current repository - passing
+                       # --abbrev=12 ensures a minimum of 12, and the
+                       # awk substr() then picks the 'g' and first 12
+                       # hex chars.
+                       if atag="$(git describe --abbrev=12 2>/dev/null)"; then
+                               echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),substr($(NF),0,13))}'
+
+                       # If we don't have a tag at all we print -g{commitish},
+                       # again using exactly 12 hex chars.
                        else
+                               head="$(echo $head | cut -c1-12)"
                                printf '%s%s' -g $head
                        fi
                fi
index bdbeafe..542768f 100644 (file)
@@ -134,7 +134,7 @@ $(OUTPUT)/%:%.c
 
 $(OUTPUT)/urandom_read: urandom_read.c
        $(call msg,BINARY,,$@)
-       $(Q)$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS) -Wl,--build-id
+       $(Q)$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS) -Wl,--build-id=sha1
 
 $(OUTPUT)/test_stub.o: test_stub.c $(BPFOBJ)
        $(call msg,CC,,$@)