mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 00:30:52 +07:00
Kbuild updates for v5.10
- 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 -----BEGIN PGP SIGNATURE----- iQJJBAABCgAzFiEEbmPs18K1szRHjPqEPYsBB53g2wYFAl+RfS0VHG1hc2FoaXJv eUBrZXJuZWwub3JnAAoJED2LAQed4NsGG1QP/2hzoMzK1YXErPUhGrhYU1rxz7Nu HkLTIkyKF1HPwSJf5XyNW/FTBI4SDlkNoVg/weEDCS1yFxxpvQLIck8ChzA1kIIM P+1IfBWOTzqn91XsapU2zwSno3gylphVchVIvYAB3oLUotGeMSluy1cQtBRzyA5D rj2Q7H8fzkzk3YoBcBC/BOKDlfo/usqQ1X/gsfRFwN/BJxeZSYoujNBE7KtHaDsd 8K/ggBIqmST4NBn+M8c11d8CxzvWbtG1gq3EkUL5nG8T13DsGn1EFC0SPt85bkvv f9YywfJi37HixhZzK6tXYjN/PWoiEY6z90mhd0NtZghQT7kQMiTQ3sWrM8dX3ssf phBzO94uFQDjhyxOaSSsCoI/TIciAPo4+G8PNjcaEtj63IEfhEz/dnlstYwY5Y9P Pp3aZtVjSGJwGW2u2EUYj6paFVqjf6DXQjQKPNHnsYCEidIvFTjjguRGvx9gl6mx yd8oseOsAtOEf0alRe9MMdvN17O3UrRAxgBdap7fktg02TLVRGxZIbuwKmBf29ho ORl9zeFkYBn6XQFyuItJoXy/kYFyHDaBEPYCRQcY4dwqcjZIiAc/FhYbqYthJ59L 5vLN2etmDIVSuUv1J5nBqHHGCqJChykbqg7riQ651dCNKw4gZB8ctCay2lXhBXMg 1mqOcoG5WWL7//F+ =tZRN -----END PGP SIGNATURE----- Merge tag 'kbuild-v5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild 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 ...
This commit is contained in:
commit
746b25b1aa
@ -53,8 +53,7 @@ and elsewhere regarding submitting Linux kernel patches.
|
|||||||
|
|
||||||
9) Check cleanly with sparse.
|
9) Check cleanly with sparse.
|
||||||
|
|
||||||
10) Use ``make checkstack`` and ``make namespacecheck`` and fix any problems
|
10) Use ``make checkstack`` and fix any problems that it finds.
|
||||||
that they find.
|
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
|
|
||||||
|
@ -4273,6 +4273,7 @@ W: https://clangbuiltlinux.github.io/
|
|||||||
B: https://github.com/ClangBuiltLinux/linux/issues
|
B: https://github.com/ClangBuiltLinux/linux/issues
|
||||||
C: irc://chat.freenode.net/clangbuiltlinux
|
C: irc://chat.freenode.net/clangbuiltlinux
|
||||||
F: Documentation/kbuild/llvm.rst
|
F: Documentation/kbuild/llvm.rst
|
||||||
|
F: scripts/clang-tools/
|
||||||
K: \b(?i:clang|llvm)\b
|
K: \b(?i:clang|llvm)\b
|
||||||
|
|
||||||
CLEANCACHE API
|
CLEANCACHE API
|
||||||
|
94
Makefile
94
Makefile
@ -497,7 +497,7 @@ KBUILD_AFLAGS := -D__ASSEMBLY__ -fno-PIE
|
|||||||
KBUILD_CFLAGS := -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs \
|
KBUILD_CFLAGS := -Wall -Wundef -Werror=strict-prototypes -Wno-trigraphs \
|
||||||
-fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE \
|
-fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE \
|
||||||
-Werror=implicit-function-declaration -Werror=implicit-int \
|
-Werror=implicit-function-declaration -Werror=implicit-int \
|
||||||
-Wno-format-security \
|
-Werror=return-type -Wno-format-security \
|
||||||
-std=gnu89
|
-std=gnu89
|
||||||
KBUILD_CPPFLAGS := -D__KERNEL__
|
KBUILD_CPPFLAGS := -D__KERNEL__
|
||||||
KBUILD_AFLAGS_KERNEL :=
|
KBUILD_AFLAGS_KERNEL :=
|
||||||
@ -505,7 +505,6 @@ KBUILD_CFLAGS_KERNEL :=
|
|||||||
KBUILD_AFLAGS_MODULE := -DMODULE
|
KBUILD_AFLAGS_MODULE := -DMODULE
|
||||||
KBUILD_CFLAGS_MODULE := -DMODULE
|
KBUILD_CFLAGS_MODULE := -DMODULE
|
||||||
KBUILD_LDFLAGS_MODULE :=
|
KBUILD_LDFLAGS_MODULE :=
|
||||||
export KBUILD_LDS_MODULE := $(srctree)/scripts/module-common.lds
|
|
||||||
KBUILD_LDFLAGS :=
|
KBUILD_LDFLAGS :=
|
||||||
CLANG_FLAGS :=
|
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_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS KBUILD_LDFLAGS
|
||||||
export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE
|
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 AFLAGS_KERNEL AFLAGS_MODULE
|
||||||
export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE
|
export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE
|
||||||
export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
|
export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
|
||||||
@ -634,7 +632,7 @@ endif
|
|||||||
# in addition to whatever we do anyway.
|
# in addition to whatever we do anyway.
|
||||||
# Just "make" or "make all" shall build modules as well
|
# 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
|
KBUILD_MODULES := 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -707,8 +705,11 @@ $(KCONFIG_CONFIG):
|
|||||||
# This exploits the 'multi-target pattern rule' trick.
|
# This exploits the 'multi-target pattern rule' trick.
|
||||||
# The syncconfig should be executed only once to make all the targets.
|
# 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)
|
# (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)
|
%/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
|
else # !may-sync-config
|
||||||
# External modules and some install targets need include/generated/autoconf.h
|
# 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.
|
# 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
|
KBUILD_CFLAGS += -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang
|
||||||
endif
|
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
|
||||||
|
|
||||||
ifdef CONFIG_DEBUG_INFO_SPLIT
|
ifdef CONFIG_DEBUG_INFO_SPLIT
|
||||||
DEBUG_CFLAGS += -gsplit-dwarf
|
DEBUG_CFLAGS += -gsplit-dwarf
|
||||||
else
|
else
|
||||||
DEBUG_CFLAGS += -g
|
DEBUG_CFLAGS += -g
|
||||||
endif
|
endif
|
||||||
|
|
||||||
KBUILD_AFLAGS += -Wa,-gdwarf-2
|
KBUILD_AFLAGS += -Wa,-gdwarf-2
|
||||||
endif
|
|
||||||
ifdef CONFIG_DEBUG_INFO_DWARF4
|
ifdef CONFIG_DEBUG_INFO_DWARF4
|
||||||
DEBUG_CFLAGS += -gdwarf-4
|
DEBUG_CFLAGS += -gdwarf-4
|
||||||
endif
|
endif
|
||||||
@ -838,6 +845,8 @@ KBUILD_AFLAGS += -gz=zlib
|
|||||||
KBUILD_LDFLAGS += --compress-debug-sections=zlib
|
KBUILD_LDFLAGS += --compress-debug-sections=zlib
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
endif # CONFIG_DEBUG_INFO
|
||||||
|
|
||||||
KBUILD_CFLAGS += $(DEBUG_CFLAGS)
|
KBUILD_CFLAGS += $(DEBUG_CFLAGS)
|
||||||
export DEBUG_CFLAGS
|
export DEBUG_CFLAGS
|
||||||
|
|
||||||
@ -919,16 +928,16 @@ KBUILD_CFLAGS += $(call cc-disable-warning, restrict)
|
|||||||
KBUILD_CFLAGS += $(call cc-disable-warning, maybe-uninitialized)
|
KBUILD_CFLAGS += $(call cc-disable-warning, maybe-uninitialized)
|
||||||
|
|
||||||
# disable invalid "can't wrap" optimizations for signed / pointers
|
# 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)
|
# 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
|
# conserve stack if available
|
||||||
KBUILD_CFLAGS += $(call cc-option,-fconserve-stack)
|
KBUILD_CFLAGS += $(call cc-option,-fconserve-stack)
|
||||||
|
|
||||||
# Prohibit date/time macros, which would make the build non-deterministic
|
# 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
|
# enforce correct pointer usage
|
||||||
KBUILD_CFLAGS += $(call cc-option,-Werror=incompatible-pointer-types)
|
KBUILD_CFLAGS += $(call cc-option,-Werror=incompatible-pointer-types)
|
||||||
@ -964,8 +973,8 @@ KBUILD_CPPFLAGS += $(KCPPFLAGS)
|
|||||||
KBUILD_AFLAGS += $(KAFLAGS)
|
KBUILD_AFLAGS += $(KAFLAGS)
|
||||||
KBUILD_CFLAGS += $(KCFLAGS)
|
KBUILD_CFLAGS += $(KCFLAGS)
|
||||||
|
|
||||||
KBUILD_LDFLAGS_MODULE += --build-id
|
KBUILD_LDFLAGS_MODULE += --build-id=sha1
|
||||||
LDFLAGS_vmlinux += --build-id
|
LDFLAGS_vmlinux += --build-id=sha1
|
||||||
|
|
||||||
ifeq ($(CONFIG_STRIP_ASM_SYMS),y)
|
ifeq ($(CONFIG_STRIP_ASM_SYMS),y)
|
||||||
LDFLAGS_vmlinux += $(call ld-option, -X,)
|
LDFLAGS_vmlinux += $(call ld-option, -X,)
|
||||||
@ -1377,7 +1386,7 @@ endif
|
|||||||
# using awk while concatenating to the final file.
|
# using awk while concatenating to the final file.
|
||||||
|
|
||||||
PHONY += modules
|
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
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
||||||
|
|
||||||
PHONY += modules_check
|
PHONY += modules_check
|
||||||
@ -1394,6 +1403,7 @@ targets += modules.order
|
|||||||
# Target to prepare building external modules
|
# Target to prepare building external modules
|
||||||
PHONY += modules_prepare
|
PHONY += modules_prepare
|
||||||
modules_prepare: prepare
|
modules_prepare: prepare
|
||||||
|
$(Q)$(MAKE) $(build)=scripts scripts/module.lds
|
||||||
|
|
||||||
# Target to install modules
|
# Target to install modules
|
||||||
PHONY += modules_install
|
PHONY += modules_install
|
||||||
@ -1452,7 +1462,8 @@ endif # CONFIG_MODULES
|
|||||||
|
|
||||||
# Directories & files removed with 'make clean'
|
# Directories & files removed with 'make clean'
|
||||||
CLEAN_FILES += include/ksym vmlinux.symvers \
|
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'
|
# Directories & files removed with 'make mrproper'
|
||||||
MRPROPER_FILES += include/config include/generated \
|
MRPROPER_FILES += include/config include/generated \
|
||||||
@ -1558,12 +1569,13 @@ help:
|
|||||||
echo ''
|
echo ''
|
||||||
@echo 'Static analysers:'
|
@echo 'Static analysers:'
|
||||||
@echo ' checkstack - Generate a list of stack hogs'
|
@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 ' versioncheck - Sanity check on version.h usage'
|
||||||
@echo ' includecheck - Check for duplicate included header files'
|
@echo ' includecheck - Check for duplicate included header files'
|
||||||
@echo ' export_report - List the usages of all exported symbols'
|
@echo ' export_report - List the usages of all exported symbols'
|
||||||
@echo ' headerdep - Detect inclusion cycles in headers'
|
@echo ' headerdep - Detect inclusion cycles in headers'
|
||||||
@echo ' coccicheck - Check with Coccinelle'
|
@echo ' coccicheck - Check with Coccinelle'
|
||||||
|
@echo ' clang-analyzer - Check with clang static analyzer'
|
||||||
|
@echo ' clang-tidy - Check with clang-tidy'
|
||||||
@echo ''
|
@echo ''
|
||||||
@echo 'Tools:'
|
@echo 'Tools:'
|
||||||
@echo ' nsdeps - Generate missing symbol namespace dependencies'
|
@echo ' nsdeps - Generate missing symbol namespace dependencies'
|
||||||
@ -1681,14 +1693,18 @@ else # KBUILD_EXTMOD
|
|||||||
# Install the modules built in the module directory
|
# Install the modules built in the module directory
|
||||||
# Assumes install directory is already created
|
# Assumes install directory is already created
|
||||||
|
|
||||||
# We are always building modules
|
# We are always building only modules.
|
||||||
|
KBUILD_BUILTIN :=
|
||||||
KBUILD_MODULES := 1
|
KBUILD_MODULES := 1
|
||||||
|
|
||||||
build-dirs := $(KBUILD_EXTMOD)
|
build-dirs := $(KBUILD_EXTMOD)
|
||||||
PHONY += modules
|
PHONY += modules
|
||||||
modules: descend
|
modules: $(MODORDER)
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
||||||
|
|
||||||
|
$(MODORDER): descend
|
||||||
|
@:
|
||||||
|
|
||||||
PHONY += modules_install
|
PHONY += modules_install
|
||||||
modules_install: _emodinst_ _emodinst_post
|
modules_install: _emodinst_ _emodinst_post
|
||||||
|
|
||||||
@ -1702,8 +1718,12 @@ PHONY += _emodinst_post
|
|||||||
_emodinst_post: _emodinst_
|
_emodinst_post: _emodinst_
|
||||||
$(call cmd,depmod)
|
$(call cmd,depmod)
|
||||||
|
|
||||||
|
compile_commands.json: $(extmod-prefix)compile_commands.json
|
||||||
|
PHONY += compile_commands.json
|
||||||
|
|
||||||
clean-dirs := $(KBUILD_EXTMOD)
|
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
|
PHONY += help
|
||||||
help:
|
help:
|
||||||
@ -1715,7 +1735,9 @@ help:
|
|||||||
@echo ' clean - remove generated files in module directory only'
|
@echo ' clean - remove generated files in module directory only'
|
||||||
@echo ''
|
@echo ''
|
||||||
|
|
||||||
PHONY += prepare
|
# no-op for external module builds
|
||||||
|
PHONY += prepare modules_prepare
|
||||||
|
|
||||||
endif # KBUILD_EXTMOD
|
endif # KBUILD_EXTMOD
|
||||||
|
|
||||||
# Single targets
|
# Single targets
|
||||||
@ -1748,7 +1770,7 @@ MODORDER := .modules.tmp
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
PHONY += single_modpost
|
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){ $(foreach m, $(single-ko), echo $(extmod-prefix)$m;) } > $(MODORDER)
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
||||||
|
|
||||||
@ -1816,10 +1838,37 @@ nsdeps: export KBUILD_NSDEPS=1
|
|||||||
nsdeps: modules
|
nsdeps: modules
|
||||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/nsdeps
|
$(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
|
# Scripts to check various things for consistency
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
PHONY += includecheck versioncheck coccicheck namespacecheck export_report
|
PHONY += includecheck versioncheck coccicheck export_report
|
||||||
|
|
||||||
includecheck:
|
includecheck:
|
||||||
find $(srctree)/* $(RCS_FIND_IGNORE) \
|
find $(srctree)/* $(RCS_FIND_IGNORE) \
|
||||||
@ -1834,9 +1883,6 @@ versioncheck:
|
|||||||
coccicheck:
|
coccicheck:
|
||||||
$(Q)$(BASH) $(srctree)/scripts/$@
|
$(Q)$(BASH) $(srctree)/scripts/$@
|
||||||
|
|
||||||
namespacecheck:
|
|
||||||
$(PERL) $(srctree)/scripts/namespace.pl
|
|
||||||
|
|
||||||
export_report:
|
export_report:
|
||||||
$(PERL) $(srctree)/scripts/export_report.pl
|
$(PERL) $(srctree)/scripts/export_report.pl
|
||||||
|
|
||||||
|
@ -20,10 +20,6 @@ endif
|
|||||||
# linker. All sections should be explicitly named in the linker script.
|
# linker. All sections should be explicitly named in the linker script.
|
||||||
LDFLAGS_vmlinux += $(call ld-option, --orphan-handling=warn)
|
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
|
GZFLAGS :=-9
|
||||||
#KBUILD_CFLAGS +=-pipe
|
#KBUILD_CFLAGS +=-pipe
|
||||||
|
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
#ifdef CONFIG_ARM_MODULE_PLTS
|
||||||
SECTIONS {
|
SECTIONS {
|
||||||
.plt : { BYTE(0) }
|
.plt : { BYTE(0) }
|
||||||
.init.plt : { BYTE(0) }
|
.init.plt : { BYTE(0) }
|
||||||
}
|
}
|
||||||
|
#endif
|
@ -19,7 +19,7 @@ ccflags-y += -DDISABLE_BRANCH_PROFILING -DBUILD_VDSO32
|
|||||||
ldflags-$(CONFIG_CPU_ENDIAN_BE8) := --be8
|
ldflags-$(CONFIG_CPU_ENDIAN_BE8) := --be8
|
||||||
ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \
|
ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \
|
||||||
-z max-page-size=4096 -nostdlib -shared $(ldflags-y) \
|
-z max-page-size=4096 -nostdlib -shared $(ldflags-y) \
|
||||||
--hash-style=sysv --build-id \
|
--hash-style=sysv --build-id=sha1 \
|
||||||
-T
|
-T
|
||||||
|
|
||||||
obj-$(CONFIG_VDSO) += vdso.o
|
obj-$(CONFIG_VDSO) += vdso.o
|
||||||
|
@ -126,10 +126,6 @@ endif
|
|||||||
|
|
||||||
CHECKFLAGS += -D__aarch64__
|
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)
|
ifeq ($(CONFIG_DYNAMIC_FTRACE_WITH_REGS),y)
|
||||||
KBUILD_CPPFLAGS += -DCC_USING_PATCHABLE_FUNCTION_ENTRY
|
KBUILD_CPPFLAGS += -DCC_USING_PATCHABLE_FUNCTION_ENTRY
|
||||||
CC_FLAGS_FTRACE := -fpatchable-function-entry=2
|
CC_FLAGS_FTRACE := -fpatchable-function-entry=2
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
|
#ifdef CONFIG_ARM64_MODULE_PLTS
|
||||||
SECTIONS {
|
SECTIONS {
|
||||||
.plt (NOLOAD) : { BYTE(0) }
|
.plt (NOLOAD) : { BYTE(0) }
|
||||||
.init.plt (NOLOAD) : { BYTE(0) }
|
.init.plt (NOLOAD) : { BYTE(0) }
|
||||||
.text.ftrace_trampoline (NOLOAD) : { BYTE(0) }
|
.text.ftrace_trampoline (NOLOAD) : { BYTE(0) }
|
||||||
}
|
}
|
||||||
|
#endif
|
@ -24,14 +24,13 @@ btildflags-$(CONFIG_ARM64_BTI_KERNEL) += -z force-bti
|
|||||||
# routines, as x86 does (see 6f121e548f83 ("x86, vdso: Reimplement vdso.so
|
# routines, as x86 does (see 6f121e548f83 ("x86, vdso: Reimplement vdso.so
|
||||||
# preparation in build-time C")).
|
# preparation in build-time C")).
|
||||||
ldflags-y := -shared -nostdlib -soname=linux-vdso.so.1 --hash-style=sysv \
|
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
|
$(btildflags-y) -T
|
||||||
|
|
||||||
ccflags-y := -fno-common -fno-builtin -fno-stack-protector -ffixed-x18
|
ccflags-y := -fno-common -fno-builtin -fno-stack-protector -ffixed-x18
|
||||||
ccflags-y += -DDISABLE_BRANCH_PROFILING
|
ccflags-y += -DDISABLE_BRANCH_PROFILING
|
||||||
|
|
||||||
CFLAGS_REMOVE_vgettimeofday.o = $(CC_FLAGS_FTRACE) -Os $(CC_FLAGS_SCS) $(GCC_PLUGINS_CFLAGS)
|
CFLAGS_REMOVE_vgettimeofday.o = $(CC_FLAGS_FTRACE) -Os $(CC_FLAGS_SCS) $(GCC_PLUGINS_CFLAGS)
|
||||||
KBUILD_CFLAGS += $(DISABLE_LTO)
|
|
||||||
KASAN_SANITIZE := n
|
KASAN_SANITIZE := n
|
||||||
UBSAN_SANITIZE := n
|
UBSAN_SANITIZE := n
|
||||||
OBJECT_FILES_NON_STANDARD := y
|
OBJECT_FILES_NON_STANDARD := y
|
||||||
@ -47,7 +46,7 @@ endif
|
|||||||
GCOV_PROFILE := n
|
GCOV_PROFILE := n
|
||||||
|
|
||||||
obj-y += vdso.o
|
obj-y += vdso.o
|
||||||
extra-y += vdso.lds
|
targets += vdso.lds
|
||||||
CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
|
CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
|
||||||
|
|
||||||
# Force dependency (incbin is bad)
|
# Force dependency (incbin is bad)
|
||||||
|
@ -90,9 +90,9 @@ VDSO_CFLAGS += -O2
|
|||||||
# Some useful compiler-dependent flags from top-level Makefile
|
# Some useful compiler-dependent flags from top-level Makefile
|
||||||
VDSO_CFLAGS += $(call cc32-option,-Wdeclaration-after-statement,)
|
VDSO_CFLAGS += $(call cc32-option,-Wdeclaration-after-statement,)
|
||||||
VDSO_CFLAGS += $(call cc32-option,-Wno-pointer-sign)
|
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=strict-prototypes)
|
||||||
VDSO_CFLAGS += $(call cc32-option,-Werror=date-time)
|
VDSO_CFLAGS += -Werror=date-time
|
||||||
VDSO_CFLAGS += $(call cc32-option,-Werror=incompatible-pointer-types)
|
VDSO_CFLAGS += $(call cc32-option,-Werror=incompatible-pointer-types)
|
||||||
|
|
||||||
# The 32-bit compiler does not provide 128-bit integers, which are used in
|
# 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 += -Wl,-z,max-page-size=4096 -Wl,-z,common-page-size=4096
|
||||||
VDSO_LDFLAGS += -nostdlib -shared -mfloat-abi=soft
|
VDSO_LDFLAGS += -nostdlib -shared -mfloat-abi=soft
|
||||||
VDSO_LDFLAGS += -Wl,--hash-style=sysv
|
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)
|
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-vdso := $(c-obj-vdso) $(c-obj-vdso-gettimeofday) $(asm-obj-vdso)
|
||||||
|
|
||||||
obj-y += vdso.o
|
obj-y += vdso.o
|
||||||
extra-y += vdso.lds
|
targets += vdso.lds
|
||||||
CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
|
CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
|
||||||
|
|
||||||
# Force dependency (vdso.s includes vdso.so through incbin)
|
# Force dependency (vdso.s includes vdso.so through incbin)
|
||||||
|
@ -20,7 +20,6 @@ CHECKFLAGS += -D__ia64=1 -D__ia64__=1 -D_LP64 -D__LP64__
|
|||||||
|
|
||||||
OBJCOPYFLAGS := --strip-all
|
OBJCOPYFLAGS := --strip-all
|
||||||
LDFLAGS_vmlinux := -static
|
LDFLAGS_vmlinux := -static
|
||||||
KBUILD_LDS_MODULE += $(srctree)/arch/ia64/module.lds
|
|
||||||
KBUILD_AFLAGS_KERNEL := -mconstant-gp
|
KBUILD_AFLAGS_KERNEL := -mconstant-gp
|
||||||
EXTRA :=
|
EXTRA :=
|
||||||
|
|
||||||
|
@ -75,7 +75,6 @@ KBUILD_CPPFLAGS += -D__uClinux__
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
KBUILD_LDFLAGS := -m m68kelf
|
KBUILD_LDFLAGS := -m m68kelf
|
||||||
KBUILD_LDS_MODULE += $(srctree)/arch/m68k/kernel/module.lds
|
|
||||||
|
|
||||||
ifdef CONFIG_SUN3
|
ifdef CONFIG_SUN3
|
||||||
LDFLAGS_vmlinux = -N
|
LDFLAGS_vmlinux = -N
|
||||||
|
@ -61,7 +61,7 @@ endif
|
|||||||
# VDSO linker flags.
|
# VDSO linker flags.
|
||||||
ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \
|
ldflags-y := -Bsymbolic --no-undefined -soname=linux-vdso.so.1 \
|
||||||
$(filter -E%,$(KBUILD_CFLAGS)) -nostdlib -shared \
|
$(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
|
CFLAGS_REMOVE_vdso.o = -pg
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ GCOV_PROFILE := n
|
|||||||
|
|
||||||
|
|
||||||
obj-y += vdso.o
|
obj-y += vdso.o
|
||||||
extra-y += vdso.lds
|
targets += vdso.lds
|
||||||
CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
|
CPPFLAGS_vdso.lds += -P -C -U$(ARCH)
|
||||||
|
|
||||||
# Force dependency
|
# Force dependency
|
||||||
|
@ -65,7 +65,6 @@ UTS_MACHINE := $(subst $(space),,$(machine-y))
|
|||||||
ifdef CONFIG_PPC32
|
ifdef CONFIG_PPC32
|
||||||
KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
|
KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
|
||||||
else
|
else
|
||||||
KBUILD_LDS_MODULE += $(srctree)/arch/powerpc/kernel/module.lds
|
|
||||||
ifeq ($(call ld-ifversion, -ge, 225000000, y),y)
|
ifeq ($(call ld-ifversion, -ge, 225000000, y),y)
|
||||||
# Have the linker provide sfpr if possible.
|
# Have the linker provide sfpr if possible.
|
||||||
# There is a corresponding test in arch/powerpc/lib/Makefile
|
# There is a corresponding test in arch/powerpc/lib/Makefile
|
||||||
|
@ -29,7 +29,7 @@ ccflags-y := -shared -fno-common -fno-builtin -nostdlib \
|
|||||||
asflags-y := -D__VDSO32__ -s
|
asflags-y := -D__VDSO32__ -s
|
||||||
|
|
||||||
obj-y += vdso32_wrapper.o
|
obj-y += vdso32_wrapper.o
|
||||||
extra-y += vdso32.lds
|
targets += vdso32.lds
|
||||||
CPPFLAGS_vdso32.lds += -P -C -Upowerpc
|
CPPFLAGS_vdso32.lds += -P -C -Upowerpc
|
||||||
|
|
||||||
# Force dependency (incbin is bad)
|
# Force dependency (incbin is bad)
|
||||||
|
@ -17,7 +17,7 @@ ccflags-y := -shared -fno-common -fno-builtin -nostdlib \
|
|||||||
asflags-y := -D__VDSO64__ -s
|
asflags-y := -D__VDSO64__ -s
|
||||||
|
|
||||||
obj-y += vdso64_wrapper.o
|
obj-y += vdso64_wrapper.o
|
||||||
extra-y += vdso64.lds
|
targets += vdso64.lds
|
||||||
CPPFLAGS_vdso64.lds += -P -C -U$(ARCH)
|
CPPFLAGS_vdso64.lds += -P -C -U$(ARCH)
|
||||||
|
|
||||||
# Force dependency (incbin is bad)
|
# Force dependency (incbin is bad)
|
||||||
|
@ -53,9 +53,6 @@ endif
|
|||||||
ifeq ($(CONFIG_CMODEL_MEDANY),y)
|
ifeq ($(CONFIG_CMODEL_MEDANY),y)
|
||||||
KBUILD_CFLAGS += -mcmodel=medany
|
KBUILD_CFLAGS += -mcmodel=medany
|
||||||
endif
|
endif
|
||||||
ifeq ($(CONFIG_MODULE_SECTIONS),y)
|
|
||||||
KBUILD_LDS_MODULE += $(srctree)/arch/riscv/kernel/module.lds
|
|
||||||
endif
|
|
||||||
ifeq ($(CONFIG_PERF_EVENTS),y)
|
ifeq ($(CONFIG_PERF_EVENTS),y)
|
||||||
KBUILD_CFLAGS += -fno-omit-frame-pointer
|
KBUILD_CFLAGS += -fno-omit-frame-pointer
|
||||||
endif
|
endif
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
/* Copyright (C) 2017 Andes Technology Corporation */
|
/* Copyright (C) 2017 Andes Technology Corporation */
|
||||||
|
#ifdef CONFIG_MODULE_SECTIONS
|
||||||
SECTIONS {
|
SECTIONS {
|
||||||
.plt (NOLOAD) : { BYTE(0) }
|
.plt (NOLOAD) : { BYTE(0) }
|
||||||
.got (NOLOAD) : { BYTE(0) }
|
.got (NOLOAD) : { BYTE(0) }
|
||||||
.got.plt (NOLOAD) : { BYTE(0) }
|
.got.plt (NOLOAD) : { BYTE(0) }
|
||||||
}
|
}
|
||||||
|
#endif
|
@ -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.
|
# 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 \
|
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
|
$(obj)/vdso-dummy.o: $(src)/vdso.lds $(obj)/rt_sigreturn.o FORCE
|
||||||
$(call if_changed,vdsold)
|
$(call if_changed,vdsold)
|
||||||
|
|
||||||
|
@ -25,13 +25,13 @@ KBUILD_AFLAGS_64 += -m64 -s
|
|||||||
KBUILD_CFLAGS_64 := $(filter-out -m64,$(KBUILD_CFLAGS))
|
KBUILD_CFLAGS_64 := $(filter-out -m64,$(KBUILD_CFLAGS))
|
||||||
KBUILD_CFLAGS_64 += -m64 -fPIC -shared -fno-common -fno-builtin
|
KBUILD_CFLAGS_64 += -m64 -fPIC -shared -fno-common -fno-builtin
|
||||||
ldflags-y := -fPIC -shared -nostdlib -soname=linux-vdso64.so.1 \
|
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_CFLAGS = $(KBUILD_CFLAGS_64)
|
||||||
$(targets:%=$(obj)/%.dbg): KBUILD_AFLAGS = $(KBUILD_AFLAGS_64)
|
$(targets:%=$(obj)/%.dbg): KBUILD_AFLAGS = $(KBUILD_AFLAGS_64)
|
||||||
|
|
||||||
obj-y += vdso64_wrapper.o
|
obj-y += vdso64_wrapper.o
|
||||||
extra-y += vdso64.lds
|
targets += vdso64.lds
|
||||||
CPPFLAGS_vdso64.lds += -P -C -U$(ARCH)
|
CPPFLAGS_vdso64.lds += -P -C -U$(ARCH)
|
||||||
|
|
||||||
# Disable gcov profiling, ubsan and kasan for VDSO code
|
# Disable gcov profiling, ubsan and kasan for VDSO code
|
||||||
|
@ -3,8 +3,6 @@
|
|||||||
# Building vDSO images for sparc.
|
# Building vDSO images for sparc.
|
||||||
#
|
#
|
||||||
|
|
||||||
KBUILD_CFLAGS += $(DISABLE_LTO)
|
|
||||||
|
|
||||||
VDSO64-$(CONFIG_SPARC64) := y
|
VDSO64-$(CONFIG_SPARC64) := y
|
||||||
VDSOCOMPAT-$(CONFIG_COMPAT) := y
|
VDSOCOMPAT-$(CONFIG_COMPAT) := y
|
||||||
|
|
||||||
@ -115,7 +113,7 @@ quiet_cmd_vdso = VDSO $@
|
|||||||
-T $(filter %.lds,$^) $(filter %.o,$^) && \
|
-T $(filter %.lds,$^) $(filter %.o,$^) && \
|
||||||
sh $(srctree)/$(src)/checkundef.sh '$(OBJDUMP)' '$@'
|
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
|
GCOV_PROFILE := n
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -16,6 +16,7 @@ generic-y += kdebug.h
|
|||||||
generic-y += mcs_spinlock.h
|
generic-y += mcs_spinlock.h
|
||||||
generic-y += mm-arch-hooks.h
|
generic-y += mm-arch-hooks.h
|
||||||
generic-y += mmiowb.h
|
generic-y += mmiowb.h
|
||||||
|
generic-y += module.lds.h
|
||||||
generic-y += param.h
|
generic-y += param.h
|
||||||
generic-y += pci.h
|
generic-y += pci.h
|
||||||
generic-y += percpu.h
|
generic-y += percpu.h
|
||||||
|
@ -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
|
ARCH_REL_TYPE_ABS += R_386_GLOB_DAT|R_386_JMP_SLOT|R_386_RELATIVE
|
||||||
include $(srctree)/lib/vdso/Makefile
|
include $(srctree)/lib/vdso/Makefile
|
||||||
|
|
||||||
KBUILD_CFLAGS += $(DISABLE_LTO)
|
|
||||||
|
|
||||||
# Sanitizer runtimes are unavailable and cannot be linked here.
|
# Sanitizer runtimes are unavailable and cannot be linked here.
|
||||||
KASAN_SANITIZE := n
|
KASAN_SANITIZE := n
|
||||||
UBSAN_SANITIZE := n
|
UBSAN_SANITIZE := n
|
||||||
@ -176,7 +174,7 @@ quiet_cmd_vdso = VDSO $@
|
|||||||
-T $(filter %.lds,$^) $(filter %.o,$^) && \
|
-T $(filter %.lds,$^) $(filter %.o,$^) && \
|
||||||
sh $(srctree)/$(src)/checkundef.sh '$(NM)' '$@'
|
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
|
$(call ld-option, --eh-frame-hdr) -Bsymbolic
|
||||||
GCOV_PROFILE := n
|
GCOV_PROFILE := n
|
||||||
|
|
||||||
|
@ -39,6 +39,7 @@ mandatory-y += mmiowb.h
|
|||||||
mandatory-y += mmu.h
|
mandatory-y += mmu.h
|
||||||
mandatory-y += mmu_context.h
|
mandatory-y += mmu_context.h
|
||||||
mandatory-y += module.h
|
mandatory-y += module.h
|
||||||
|
mandatory-y += module.lds.h
|
||||||
mandatory-y += msi.h
|
mandatory-y += msi.h
|
||||||
mandatory-y += pci.h
|
mandatory-y += pci.h
|
||||||
mandatory-y += percpu.h
|
mandatory-y += percpu.h
|
||||||
|
10
include/asm-generic/module.lds.h
Normal file
10
include/asm-generic/module.lds.h
Normal file
@ -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 */
|
@ -38,9 +38,6 @@ KASAN_SANITIZE_kcov.o := n
|
|||||||
KCSAN_SANITIZE_kcov.o := n
|
KCSAN_SANITIZE_kcov.o := n
|
||||||
CFLAGS_kcov.o := $(call cc-option, -fno-conserve-stack) -fno-stack-protector
|
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 += sched/
|
||||||
obj-y += locking/
|
obj-y += locking/
|
||||||
obj-y += power/
|
obj-y += power/
|
||||||
|
@ -212,9 +212,10 @@ config DEBUG_INFO
|
|||||||
|
|
||||||
If unsure, say N.
|
If unsure, say N.
|
||||||
|
|
||||||
|
if DEBUG_INFO
|
||||||
|
|
||||||
config DEBUG_INFO_REDUCED
|
config DEBUG_INFO_REDUCED
|
||||||
bool "Reduce debugging information"
|
bool "Reduce debugging information"
|
||||||
depends on DEBUG_INFO
|
|
||||||
help
|
help
|
||||||
If you say Y here gcc is instructed to generate less debugging
|
If you say Y here gcc is instructed to generate less debugging
|
||||||
information for structure types. This means that tools that
|
information for structure types. This means that tools that
|
||||||
@ -227,7 +228,6 @@ config DEBUG_INFO_REDUCED
|
|||||||
|
|
||||||
config DEBUG_INFO_COMPRESSED
|
config DEBUG_INFO_COMPRESSED
|
||||||
bool "Compressed debugging information"
|
bool "Compressed debugging information"
|
||||||
depends on DEBUG_INFO
|
|
||||||
depends on $(cc-option,-gz=zlib)
|
depends on $(cc-option,-gz=zlib)
|
||||||
depends on $(ld-option,--compress-debug-sections=zlib)
|
depends on $(ld-option,--compress-debug-sections=zlib)
|
||||||
help
|
help
|
||||||
@ -243,7 +243,6 @@ config DEBUG_INFO_COMPRESSED
|
|||||||
|
|
||||||
config DEBUG_INFO_SPLIT
|
config DEBUG_INFO_SPLIT
|
||||||
bool "Produce split debuginfo in .dwo files"
|
bool "Produce split debuginfo in .dwo files"
|
||||||
depends on DEBUG_INFO
|
|
||||||
depends on $(cc-option,-gsplit-dwarf)
|
depends on $(cc-option,-gsplit-dwarf)
|
||||||
help
|
help
|
||||||
Generate debug info into separate .dwo files. This significantly
|
Generate debug info into separate .dwo files. This significantly
|
||||||
@ -259,7 +258,6 @@ config DEBUG_INFO_SPLIT
|
|||||||
|
|
||||||
config DEBUG_INFO_DWARF4
|
config DEBUG_INFO_DWARF4
|
||||||
bool "Generate dwarf4 debuginfo"
|
bool "Generate dwarf4 debuginfo"
|
||||||
depends on DEBUG_INFO
|
|
||||||
depends on $(cc-option,-gdwarf-4)
|
depends on $(cc-option,-gdwarf-4)
|
||||||
help
|
help
|
||||||
Generate dwarf4 debug info. This requires recent versions
|
Generate dwarf4 debug info. This requires recent versions
|
||||||
@ -269,7 +267,6 @@ config DEBUG_INFO_DWARF4
|
|||||||
|
|
||||||
config DEBUG_INFO_BTF
|
config DEBUG_INFO_BTF
|
||||||
bool "Generate BTF typeinfo"
|
bool "Generate BTF typeinfo"
|
||||||
depends on DEBUG_INFO
|
|
||||||
depends on !DEBUG_INFO_SPLIT && !DEBUG_INFO_REDUCED
|
depends on !DEBUG_INFO_SPLIT && !DEBUG_INFO_REDUCED
|
||||||
depends on !GCC_PLUGIN_RANDSTRUCT || COMPILE_TEST
|
depends on !GCC_PLUGIN_RANDSTRUCT || COMPILE_TEST
|
||||||
help
|
help
|
||||||
@ -279,7 +276,6 @@ config DEBUG_INFO_BTF
|
|||||||
|
|
||||||
config GDB_SCRIPTS
|
config GDB_SCRIPTS
|
||||||
bool "Provide GDB scripts for kernel debugging"
|
bool "Provide GDB scripts for kernel debugging"
|
||||||
depends on DEBUG_INFO
|
|
||||||
help
|
help
|
||||||
This creates the required links to GDB helper scripts in the
|
This creates the required links to GDB helper scripts in the
|
||||||
build directory. If you load vmlinux into gdb, the helper
|
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
|
instance. See Documentation/dev-tools/gdb-kernel-debugging.rst
|
||||||
for further details.
|
for further details.
|
||||||
|
|
||||||
|
endif # DEBUG_INFO
|
||||||
|
|
||||||
config ENABLE_MUST_CHECK
|
config ENABLE_MUST_CHECK
|
||||||
bool "Enable __must_check logic"
|
bool "Enable __must_check logic"
|
||||||
default y
|
default y
|
||||||
|
1
scripts/.gitignore
vendored
1
scripts/.gitignore
vendored
@ -8,3 +8,4 @@ asn1_compiler
|
|||||||
extract-cert
|
extract-cert
|
||||||
sign-file
|
sign-file
|
||||||
insert-sys-cert
|
insert-sys-cert
|
||||||
|
/module.lds
|
||||||
|
@ -56,8 +56,6 @@ kecho := $($(quiet)kecho)
|
|||||||
# - If no file exist it is created
|
# - If no file exist it is created
|
||||||
# - If the content differ the new file is used
|
# - If the content differ the new file is used
|
||||||
# - If they are equal no change, and no timestamp update
|
# - 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
|
define filechk
|
||||||
$(Q)set -e; \
|
$(Q)set -e; \
|
||||||
mkdir -p $(dir $@); \
|
mkdir -p $(dir $@); \
|
||||||
|
@ -29,6 +29,9 @@ endif
|
|||||||
# The following programs are only built on demand
|
# The following programs are only built on demand
|
||||||
hostprogs += unifdef
|
hostprogs += unifdef
|
||||||
|
|
||||||
|
# The module linker script is preprocessed on demand
|
||||||
|
targets += module.lds
|
||||||
|
|
||||||
subdir-$(CONFIG_GCC_PLUGINS) += gcc-plugins
|
subdir-$(CONFIG_GCC_PLUGINS) += gcc-plugins
|
||||||
subdir-$(CONFIG_MODVERSIONS) += genksyms
|
subdir-$(CONFIG_MODVERSIONS) += genksyms
|
||||||
subdir-$(CONFIG_SECURITY_SELINUX) += selinux
|
subdir-$(CONFIG_SECURITY_SELINUX) += selinux
|
||||||
|
@ -111,7 +111,7 @@ endif
|
|||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
quiet_cmd_cc_s_c = CC $(quiet_modtag) $@
|
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
|
$(obj)/%.s: $(src)/%.c FORCE
|
||||||
$(call if_changed_dep,cc_s_c)
|
$(call if_changed_dep,cc_s_c)
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
ifdef CONFIG_KASAN
|
|
||||||
CFLAGS_KASAN_NOSANITIZE := -fno-builtin
|
CFLAGS_KASAN_NOSANITIZE := -fno-builtin
|
||||||
KASAN_SHADOW_OFFSET ?= $(CONFIG_KASAN_SHADOW_OFFSET)
|
KASAN_SHADOW_OFFSET ?= $(CONFIG_KASAN_SHADOW_OFFSET)
|
||||||
endif
|
|
||||||
|
|
||||||
ifdef CONFIG_KASAN_GENERIC
|
ifdef CONFIG_KASAN_GENERIC
|
||||||
|
|
||||||
@ -49,3 +47,5 @@ CFLAGS_KASAN := -fsanitize=kernel-hwaddress \
|
|||||||
$(instrumentation_flags)
|
$(instrumentation_flags)
|
||||||
|
|
||||||
endif # CONFIG_KASAN_SW_TAGS
|
endif # CONFIG_KASAN_SW_TAGS
|
||||||
|
|
||||||
|
export CFLAGS_KASAN CFLAGS_KASAN_NOSANITIZE
|
||||||
|
@ -9,7 +9,7 @@ endif
|
|||||||
|
|
||||||
# Keep most options here optional, to allow enabling more compilers if absence
|
# Keep most options here optional, to allow enabling more compilers if absence
|
||||||
# of some options does not break KCSAN nor causes false positive reports.
|
# 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-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-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)
|
$(call cc-param,tsan-distinguish-volatile=1)
|
||||||
|
@ -33,11 +33,10 @@ quiet_cmd_ld_ko_o = LD [M] $@
|
|||||||
cmd_ld_ko_o = \
|
cmd_ld_ko_o = \
|
||||||
$(LD) -r $(KBUILD_LDFLAGS) \
|
$(LD) -r $(KBUILD_LDFLAGS) \
|
||||||
$(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \
|
$(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \
|
||||||
$(addprefix -T , $(KBUILD_LDS_MODULE)) \
|
-T scripts/module.lds -o $@ $(filter %.o, $^); \
|
||||||
-o $@ $(filter %.o, $^); \
|
|
||||||
$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
|
$(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)
|
+$(call if_changed,ld_ko_o)
|
||||||
|
|
||||||
targets += $(modules) $(modules:.ko=.mod.o)
|
targets += $(modules) $(modules:.ko=.mod.o)
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
|
export CFLAGS_UBSAN :=
|
||||||
|
|
||||||
ifdef CONFIG_UBSAN_ALIGNMENT
|
ifdef CONFIG_UBSAN_ALIGNMENT
|
||||||
CFLAGS_UBSAN += $(call cc-option, -fsanitize=alignment)
|
CFLAGS_UBSAN += $(call cc-option, -fsanitize=alignment)
|
||||||
endif
|
endif
|
||||||
|
236
scripts/clang-tools/gen_compile_commands.py
Executable file
236
scripts/clang-tools/gen_compile_commands.py
Executable file
@ -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()
|
74
scripts/clang-tools/run-clang-tools.py
Executable file
74
scripts/clang-tools/run-clang-tools.py
Executable file
@ -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()
|
@ -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()
|
|
@ -20,19 +20,19 @@ endif
|
|||||||
unexport CONFIG_
|
unexport CONFIG_
|
||||||
|
|
||||||
xconfig: $(obj)/qconf
|
xconfig: $(obj)/qconf
|
||||||
$< $(silent) $(Kconfig)
|
$(Q)$< $(silent) $(Kconfig)
|
||||||
|
|
||||||
gconfig: $(obj)/gconf
|
gconfig: $(obj)/gconf
|
||||||
$< $(silent) $(Kconfig)
|
$(Q)$< $(silent) $(Kconfig)
|
||||||
|
|
||||||
menuconfig: $(obj)/mconf
|
menuconfig: $(obj)/mconf
|
||||||
$< $(silent) $(Kconfig)
|
$(Q)$< $(silent) $(Kconfig)
|
||||||
|
|
||||||
config: $(obj)/conf
|
config: $(obj)/conf
|
||||||
$< $(silent) --oldaskconfig $(Kconfig)
|
$(Q)$< $(silent) --oldaskconfig $(Kconfig)
|
||||||
|
|
||||||
nconfig: $(obj)/nconf
|
nconfig: $(obj)/nconf
|
||||||
$< $(silent) $(Kconfig)
|
$(Q)$< $(silent) $(Kconfig)
|
||||||
|
|
||||||
build_menuconfig: $(obj)/mconf
|
build_menuconfig: $(obj)/mconf
|
||||||
|
|
||||||
@ -68,12 +68,12 @@ simple-targets := oldconfig allnoconfig allyesconfig allmodconfig \
|
|||||||
PHONY += $(simple-targets)
|
PHONY += $(simple-targets)
|
||||||
|
|
||||||
$(simple-targets): $(obj)/conf
|
$(simple-targets): $(obj)/conf
|
||||||
$< $(silent) --$@ $(Kconfig)
|
$(Q)$< $(silent) --$@ $(Kconfig)
|
||||||
|
|
||||||
PHONY += savedefconfig defconfig
|
PHONY += savedefconfig defconfig
|
||||||
|
|
||||||
savedefconfig: $(obj)/conf
|
savedefconfig: $(obj)/conf
|
||||||
$< $(silent) --$@=defconfig $(Kconfig)
|
$(Q)$< $(silent) --$@=defconfig $(Kconfig)
|
||||||
|
|
||||||
defconfig: $(obj)/conf
|
defconfig: $(obj)/conf
|
||||||
ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)),)
|
ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)),)
|
||||||
@ -111,7 +111,7 @@ tinyconfig:
|
|||||||
# CHECK: -o cache_dir=<path> working?
|
# CHECK: -o cache_dir=<path> working?
|
||||||
PHONY += testconfig
|
PHONY += testconfig
|
||||||
testconfig: $(obj)/conf
|
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) \
|
-o cache_dir=$(abspath $(obj)/tests/.cache) \
|
||||||
$(if $(findstring 1,$(KBUILD_VERBOSE)),--capture=no)
|
$(if $(findstring 1,$(KBUILD_VERBOSE)),--capture=no)
|
||||||
clean-files += tests/.cache
|
clean-files += tests/.cache
|
||||||
|
@ -169,10 +169,9 @@ gen_btf()
|
|||||||
printf '\1' | dd of=${2} conv=notrunc bs=1 seek=16 status=none
|
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()
|
kallsyms()
|
||||||
{
|
{
|
||||||
info KSYM ${2}
|
|
||||||
local kallsymopt;
|
local kallsymopt;
|
||||||
|
|
||||||
if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then
|
if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then
|
||||||
@ -187,13 +186,8 @@ kallsyms()
|
|||||||
kallsymopt="${kallsymopt} --base-relative"
|
kallsymopt="${kallsymopt} --base-relative"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local aflags="${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} \
|
info KSYMS ${2}
|
||||||
${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS}"
|
${NM} -n ${1} | scripts/kallsyms ${kallsymopt} > ${2}
|
||||||
|
|
||||||
local afile="`basename ${2} .o`.S"
|
|
||||||
|
|
||||||
${NM} -n ${1} | scripts/kallsyms ${kallsymopt} > ${afile}
|
|
||||||
${CC} ${aflags} -c -o ${2} ${afile}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Perform one step in kallsyms generation, including temporary linking of
|
# Perform one step in kallsyms generation, including temporary linking of
|
||||||
@ -203,9 +197,15 @@ kallsyms_step()
|
|||||||
kallsymso_prev=${kallsymso}
|
kallsymso_prev=${kallsymso}
|
||||||
kallsyms_vmlinux=.tmp_vmlinux.kallsyms${1}
|
kallsyms_vmlinux=.tmp_vmlinux.kallsyms${1}
|
||||||
kallsymso=${kallsyms_vmlinux}.o
|
kallsymso=${kallsyms_vmlinux}.o
|
||||||
|
kallsyms_S=${kallsyms_vmlinux}.S
|
||||||
|
|
||||||
vmlinux_link ${kallsyms_vmlinux} "${kallsymso_prev}" ${btf_vmlinux_bin_o}
|
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}
|
# Create map file with all symbols from ${1}
|
||||||
|
@ -35,7 +35,7 @@ else
|
|||||||
LINUX_COMPILE_BY=$KBUILD_BUILD_USER
|
LINUX_COMPILE_BY=$KBUILD_BUILD_USER
|
||||||
fi
|
fi
|
||||||
if test -z "$KBUILD_BUILD_HOST"; then
|
if test -z "$KBUILD_BUILD_HOST"; then
|
||||||
LINUX_COMPILE_HOST=`hostname`
|
LINUX_COMPILE_HOST=`uname -n`
|
||||||
else
|
else
|
||||||
LINUX_COMPILE_HOST=$KBUILD_BUILD_HOST
|
LINUX_COMPILE_HOST=$KBUILD_BUILD_HOST
|
||||||
fi
|
fi
|
||||||
|
@ -24,3 +24,6 @@ SECTIONS {
|
|||||||
|
|
||||||
__jump_table 0 : ALIGN(8) { KEEP(*(__jump_table)) }
|
__jump_table 0 : ALIGN(8) { KEEP(*(__jump_table)) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* bring in arch-specific sections */
|
||||||
|
#include <asm/module.lds.h>
|
@ -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";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -26,24 +26,29 @@ if_enabled_echo() {
|
|||||||
|
|
||||||
create_package() {
|
create_package() {
|
||||||
local pname="$1" pdir="$2"
|
local pname="$1" pdir="$2"
|
||||||
|
local dpkg_deb_opts
|
||||||
|
|
||||||
mkdir -m 755 -p "$pdir/DEBIAN"
|
mkdir -m 755 -p "$pdir/DEBIAN"
|
||||||
mkdir -p "$pdir/usr/share/doc/$pname"
|
mkdir -p "$pdir/usr/share/doc/$pname"
|
||||||
cp debian/copyright "$pdir/usr/share/doc/$pname/"
|
cp debian/copyright "$pdir/usr/share/doc/$pname/"
|
||||||
cp debian/changelog "$pdir/usr/share/doc/$pname/changelog.Debian"
|
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' \
|
sh -c "cd '$pdir'; find . -type f ! -path './DEBIAN/*' -printf '%P\0' \
|
||||||
| xargs -r0 md5sum > DEBIAN/md5sums"
|
| xargs -r0 md5sum > DEBIAN/md5sums"
|
||||||
|
|
||||||
# Fix ownership and permissions
|
# 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"
|
chmod -R go-w "$pdir"
|
||||||
# in case we are in a restrictive umask environment like 0077
|
# in case we are in a restrictive umask environment like 0077
|
||||||
chmod -R a+rX "$pdir"
|
chmod -R a+rX "$pdir"
|
||||||
|
|
||||||
# Create the package
|
# Create the package
|
||||||
dpkg-gencontrol -p$pname -P"$pdir"
|
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 () {
|
deploy_kernel_headers () {
|
||||||
@ -55,7 +60,7 @@ deploy_kernel_headers () {
|
|||||||
cd $srctree
|
cd $srctree
|
||||||
find . arch/$SRCARCH -maxdepth 1 -name Makefile\*
|
find . arch/$SRCARCH -maxdepth 1 -name Makefile\*
|
||||||
find include scripts -type f -o -type l
|
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
|
find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f
|
||||||
) > debian/hdrsrcfiles
|
) > debian/hdrsrcfiles
|
||||||
|
|
||||||
@ -202,8 +207,10 @@ EOF
|
|||||||
done
|
done
|
||||||
|
|
||||||
if [ "$ARCH" != "um" ]; then
|
if [ "$ARCH" != "um" ]; then
|
||||||
deploy_kernel_headers debian/linux-headers
|
if is_enabled CONFIG_MODULES; then
|
||||||
create_package linux-headers-$version debian/linux-headers
|
deploy_kernel_headers debian/linux-headers
|
||||||
|
create_package linux-headers-$version debian/linux-headers
|
||||||
|
fi
|
||||||
|
|
||||||
deploy_libc_headers debian/linux-libc-dev
|
deploy_libc_headers debian/linux-libc-dev
|
||||||
create_package linux-libc-dev debian/linux-libc-dev
|
create_package linux-libc-dev debian/linux-libc-dev
|
||||||
|
@ -94,16 +94,16 @@ else
|
|||||||
packageversion=$version-$revision
|
packageversion=$version-$revision
|
||||||
fi
|
fi
|
||||||
sourcename=$KDEB_SOURCENAME
|
sourcename=$KDEB_SOURCENAME
|
||||||
packagename=linux-image-$version
|
|
||||||
kernel_headers_packagename=linux-headers-$version
|
|
||||||
dbg_packagename=$packagename-dbg
|
|
||||||
debarch=
|
|
||||||
set_debarch
|
|
||||||
|
|
||||||
if [ "$ARCH" = "um" ] ; then
|
if [ "$ARCH" = "um" ] ; then
|
||||||
packagename=user-mode-linux-$version
|
packagename=user-mode-linux
|
||||||
|
else
|
||||||
|
packagename=linux-image
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
debarch=
|
||||||
|
set_debarch
|
||||||
|
|
||||||
email=${DEBEMAIL-$EMAIL}
|
email=${DEBEMAIL-$EMAIL}
|
||||||
|
|
||||||
# use email string directly if it contains <email>
|
# use email string directly if it contains <email>
|
||||||
@ -174,22 +174,16 @@ Source: $sourcename
|
|||||||
Section: kernel
|
Section: kernel
|
||||||
Priority: optional
|
Priority: optional
|
||||||
Maintainer: $maintainer
|
Maintainer: $maintainer
|
||||||
|
Rules-Requires-Root: no
|
||||||
Build-Depends: bc, rsync, kmod, cpio, bison, flex | flex:native $extra_build_depends
|
Build-Depends: bc, rsync, kmod, cpio, bison, flex | flex:native $extra_build_depends
|
||||||
Homepage: https://www.kernel.org/
|
Homepage: https://www.kernel.org/
|
||||||
|
|
||||||
Package: $packagename
|
Package: $packagename-$version
|
||||||
Architecture: $debarch
|
Architecture: $debarch
|
||||||
Description: Linux kernel, version $version
|
Description: Linux kernel, version $version
|
||||||
This package contains the Linux kernel, modules and corresponding other
|
This package contains the Linux kernel, modules and corresponding other
|
||||||
files, version: $version.
|
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
|
Package: linux-libc-dev
|
||||||
Section: devel
|
Section: devel
|
||||||
Provides: linux-kernel-headers
|
Provides: linux-kernel-headers
|
||||||
@ -200,10 +194,22 @@ Description: Linux support headers for userspace development
|
|||||||
Multi-Arch: same
|
Multi-Arch: same
|
||||||
EOF
|
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
|
if is_enabled CONFIG_DEBUG_INFO; then
|
||||||
cat <<EOF >> debian/control
|
cat <<EOF >> debian/control
|
||||||
|
|
||||||
Package: $dbg_packagename
|
Package: linux-image-$version-dbg
|
||||||
Section: debug
|
Section: debug
|
||||||
Architecture: $debarch
|
Architecture: $debarch
|
||||||
Description: Linux kernel debugging symbols for $version
|
Description: Linux kernel debugging symbols for $version
|
||||||
@ -217,11 +223,15 @@ cat <<EOF > debian/rules
|
|||||||
|
|
||||||
srctree ?= .
|
srctree ?= .
|
||||||
|
|
||||||
build:
|
build-indep:
|
||||||
|
build-arch:
|
||||||
\$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \
|
\$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \
|
||||||
KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile
|
KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile
|
||||||
|
|
||||||
binary-arch:
|
build: build-arch
|
||||||
|
|
||||||
|
binary-indep:
|
||||||
|
binary-arch: build-arch
|
||||||
\$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \
|
\$(MAKE) KERNELRELEASE=${version} ARCH=${ARCH} \
|
||||||
KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile intdeb-pkg
|
KBUILD_BUILD_VERSION=${revision} -f \$(srctree)/Makefile intdeb-pkg
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ scm_version()
|
|||||||
|
|
||||||
# Check for git and a git repo.
|
# Check for git and a git repo.
|
||||||
if test -z "$(git rev-parse --show-cdup 2>/dev/null)" &&
|
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
|
# 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.
|
# it, because this version is defined in the top level Makefile.
|
||||||
@ -59,11 +59,22 @@ scm_version()
|
|||||||
fi
|
fi
|
||||||
# If we are past a tagged commit (like
|
# If we are past a tagged commit (like
|
||||||
# "v2.6.30-rc5-302-g72357d5"), we pretty print it.
|
# "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))}'
|
# 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}.
|
# If we don't have a tag at all we print -g{commitish},
|
||||||
|
# again using exactly 12 hex chars.
|
||||||
else
|
else
|
||||||
|
head="$(echo $head | cut -c1-12)"
|
||||||
printf '%s%s' -g $head
|
printf '%s%s' -g $head
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
@ -134,7 +134,7 @@ $(OUTPUT)/%:%.c
|
|||||||
|
|
||||||
$(OUTPUT)/urandom_read: urandom_read.c
|
$(OUTPUT)/urandom_read: urandom_read.c
|
||||||
$(call msg,BINARY,,$@)
|
$(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)
|
$(OUTPUT)/test_stub.o: test_stub.c $(BPFOBJ)
|
||||||
$(call msg,CC,,$@)
|
$(call msg,CC,,$@)
|
||||||
|
Loading…
Reference in New Issue
Block a user