forked from Minki/linux
Kbuild updates for v5.19
- Add HOSTPKG_CONFIG env variable to allow users to override pkg-config - Support W=e as a shorthand for KCFLAGS=-Werror - Fix CONFIG_IKHEADERS build to support toybox cpio - Add scripts/dummy-tools/pahole to ease distro packagers' life - Suppress false-positive warnings from checksyscalls.sh for W=2 build - Factor out the common code of arch/*/boot/install.sh into scripts/install.sh - Support 'kernel-install' tool in scripts/prune-kernel - Refactor module-versioning to link the symbol versions at the final link of vmlinux and modules - Remove CONFIG_MODULE_REL_CRCS because module-versioning now works in an arch-agnostic way - Refactor modpost, Makefiles -----BEGIN PGP SIGNATURE----- iQJJBAABCgAzFiEEbmPs18K1szRHjPqEPYsBB53g2wYFAmKOO2oVHG1hc2FoaXJv eUBrZXJuZWwub3JnAAoJED2LAQed4NsGG54P/3/U5FIP5EoPAVu9HqSUKeeUiBYc z1B8d7Wt1xU0xHImPWNjoacfye4MrDMUv8mEWKgHCVusJxbUoS+3Z/kd64NU75Fg Cpj+9fP1N8m02IJzraxn6fw0bmfx4zp9Zsa9l2fjwL0emq4qhB7BA9/Nl6Png1IW p0TPR6gV0Wgp6ikf/eJ3b1decFSqM7QzDlbo860nPMG164gNpDZmFVf2G4HCRQoY GtgoQLEy2pBeOdU7+nJTKl2f5JOhDjRKX8equ7BHW9l7nbUvHd6ys3DGqYO3nvwV hZZdHwDtxxO6bJtzClKPREyfL2H9R2AGxq94HzSwdvwdLLoFxrTN+mg88xBg17Rm tKHy8jpZT36qh218h5lX5n9ZWcovTA38giZ+S/tkwOvvYGivKHDS23QwzB0HrG8/ VRd+0rhfIvuIpu0OQaTpTkZr2QVci2Zn6PPnxpyPEsGvWVFRjyx0WyZh4fFXnkQT n+GS7j5g1LVMra0qu0y+yp4zy/DVFKIcfry0xU8S5SaSEBBcWUxLS2nnoBVB4vb2 RpiVD2vaOlvu/Zs2SOgtuMOnTw+Qqrvh7OYm/WyxWrB3JQGa/r+vipMKiFEDi2NN pwR8wJT/CW1ycte93m3oO83jiitFqzXtAqo24wKlp4SOqnR/TQ/dx743ku2xvONe uynJVW/gZVm4KEUl =Y2TB -----END PGP SIGNATURE----- Merge tag 'kbuild-v5.19' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild Pull Kbuild updates from Masahiro Yamada: - Add HOSTPKG_CONFIG env variable to allow users to override pkg-config - Support W=e as a shorthand for KCFLAGS=-Werror - Fix CONFIG_IKHEADERS build to support toybox cpio - Add scripts/dummy-tools/pahole to ease distro packagers' life - Suppress false-positive warnings from checksyscalls.sh for W=2 build - Factor out the common code of arch/*/boot/install.sh into scripts/install.sh - Support 'kernel-install' tool in scripts/prune-kernel - Refactor module-versioning to link the symbol versions at the final link of vmlinux and modules - Remove CONFIG_MODULE_REL_CRCS because module-versioning now works in an arch-agnostic way - Refactor modpost, Makefiles * tag 'kbuild-v5.19' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild: (56 commits) genksyms: adjust the output format to modpost kbuild: stop merging *.symversions kbuild: link symbol CRCs at final link, removing CONFIG_MODULE_REL_CRCS modpost: extract symbol versions from *.cmd files modpost: add sym_find_with_module() helper modpost: change the license of EXPORT_SYMBOL to bool type modpost: remove left-over cross_compile declaration kbuild: record symbol versions in *.cmd files kbuild: generate a list of objects in vmlinux modpost: move *.mod.c generation to write_mod_c_files() modpost: merge add_{intree_flag,retpoline,staging_flag} to add_header scripts/prune-kernel: Use kernel-install if available kbuild: factor out the common installation code into scripts/install.sh modpost: split new_symbol() to symbol allocation and hash table addition modpost: make sym_add_exported() always allocate a new symbol modpost: make multiple export error modpost: dump Module.symvers in the same order of modules.order modpost: traverse the namespace_list in order modpost: use doubly linked list for dump_lists modpost: traverse unresolved symbols in order ...
This commit is contained in:
commit
df202b452f
1
.gitignore
vendored
1
.gitignore
vendored
@ -45,6 +45,7 @@
|
||||
*.symversions
|
||||
*.tab.[ch]
|
||||
*.tar
|
||||
*.usyms
|
||||
*.xz
|
||||
*.zst
|
||||
Module.symvers
|
||||
|
@ -693,6 +693,8 @@ in documenting basic Kconfig syntax a more precise definition of Kconfig
|
||||
semantics is welcomed. One project deduced Kconfig semantics through
|
||||
the use of the xconfig configurator [1]_. Work should be done to confirm if
|
||||
the deduced semantics matches our intended Kconfig design goals.
|
||||
Another project formalized a denotational semantics of a core subset of
|
||||
the Kconfig language [10]_.
|
||||
|
||||
Having well defined semantics can be useful for tools for practical
|
||||
evaluation of dependencies, for instance one such case was work to
|
||||
@ -700,6 +702,8 @@ express in boolean abstraction of the inferred semantics of Kconfig to
|
||||
translate Kconfig logic into boolean formulas and run a SAT solver on this to
|
||||
find dead code / features (always inactive), 114 dead features were found in
|
||||
Linux using this methodology [1]_ (Section 8: Threats to validity).
|
||||
The kismet tool, based on the semantics in [10]_, finds abuses of reverse
|
||||
dependencies and has led to dozens of committed fixes to Linux Kconfig files [11]_.
|
||||
|
||||
Confirming this could prove useful as Kconfig stands as one of the leading
|
||||
industrial variability modeling languages [1]_ [2]_. Its study would help
|
||||
@ -738,3 +742,5 @@ https://kernelnewbies.org/KernelProjects/kconfig-sat
|
||||
.. [7] https://vamos.cs.fau.de
|
||||
.. [8] https://undertaker.cs.fau.de
|
||||
.. [9] https://www4.cs.fau.de/Publications/2011/tartler_11_eurosys.pdf
|
||||
.. [10] https://paulgazzillo.com/papers/esecfse21.pdf
|
||||
.. [11] https://github.com/paulgazz/kmax
|
||||
|
16
Makefile
16
Makefile
@ -436,6 +436,7 @@ else
|
||||
HOSTCC = gcc
|
||||
HOSTCXX = g++
|
||||
endif
|
||||
HOSTPKG_CONFIG = pkg-config
|
||||
|
||||
KBUILD_USERHOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes \
|
||||
-O2 -fomit-frame-pointer -std=gnu11 \
|
||||
@ -533,7 +534,7 @@ KBUILD_LDFLAGS_MODULE :=
|
||||
KBUILD_LDFLAGS :=
|
||||
CLANG_FLAGS :=
|
||||
|
||||
export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC
|
||||
export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC HOSTPKG_CONFIG
|
||||
export CPP AR NM STRIP OBJCOPY OBJDUMP READELF PAHOLE RESOLVE_BTFIDS LEX YACC AWK INSTALLKERNEL
|
||||
export PERL PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX
|
||||
export KGZIP KBZIP2 KLZOP LZMA LZ4 XZ ZSTD
|
||||
@ -1294,11 +1295,12 @@ scripts_unifdef: scripts_basic
|
||||
# Install
|
||||
|
||||
# Many distributions have the custom install script, /sbin/installkernel.
|
||||
# If DKMS is installed, 'make install' will eventually recuses back
|
||||
# to the this Makefile to build and install external modules.
|
||||
# If DKMS is installed, 'make install' will eventually recurse back
|
||||
# to this Makefile to build and install external modules.
|
||||
# Cancel sub_make_done so that options such as M=, V=, etc. are parsed.
|
||||
|
||||
install: sub_make_done :=
|
||||
quiet_cmd_install = INSTALL $(INSTALL_PATH)
|
||||
cmd_install = unset sub_make_done; $(srctree)/scripts/install.sh
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Tools
|
||||
@ -1650,6 +1652,7 @@ help:
|
||||
@echo ' 1: warnings which may be relevant and do not occur too often'
|
||||
@echo ' 2: warnings which occur quite often but may still be relevant'
|
||||
@echo ' 3: more obscure warnings, can most likely be ignored'
|
||||
@echo ' e: warnings are being treated as errors'
|
||||
@echo ' Multiple levels can be combined with W=12 or W=123'
|
||||
@echo ''
|
||||
@echo 'Execute "make" or "make all" to build all targets marked with [*] '
|
||||
@ -1792,7 +1795,8 @@ ifdef single-build
|
||||
|
||||
# .ko is special because modpost is needed
|
||||
single-ko := $(sort $(filter %.ko, $(MAKECMDGOALS)))
|
||||
single-no-ko := $(sort $(patsubst %.ko,%.mod, $(MAKECMDGOALS)))
|
||||
single-no-ko := $(filter-out $(single-ko), $(MAKECMDGOALS)) \
|
||||
$(foreach x, o mod, $(patsubst %.ko, %.$x, $(single-ko)))
|
||||
|
||||
$(single-ko): single_modpost
|
||||
@:
|
||||
@ -1848,7 +1852,7 @@ clean: $(clean-dirs)
|
||||
-o -name '*.ko.*' \
|
||||
-o -name '*.dtb' -o -name '*.dtbo' -o -name '*.dtb.S' -o -name '*.dt.yaml' \
|
||||
-o -name '*.dwo' -o -name '*.lst' \
|
||||
-o -name '*.su' -o -name '*.mod' \
|
||||
-o -name '*.su' -o -name '*.mod' -o -name '*.usyms' \
|
||||
-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
|
||||
-o -name '*.lex.c' -o -name '*.tab.[ch]' \
|
||||
-o -name '*.asn1.[ch]' \
|
||||
|
@ -312,9 +312,9 @@ $(BOOT_TARGETS): vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
|
||||
@$(kecho) ' Kernel: $(boot)/$@ is ready'
|
||||
|
||||
$(INSTALL_TARGETS): KBUILD_IMAGE = $(boot)/$(patsubst %install,%Image,$@)
|
||||
$(INSTALL_TARGETS):
|
||||
$(CONFIG_SHELL) $(srctree)/$(boot)/install.sh "$(KERNELRELEASE)" \
|
||||
$(boot)/$(patsubst %install,%Image,$@) System.map "$(INSTALL_PATH)"
|
||||
$(call cmd,install)
|
||||
|
||||
PHONY += vdso_install
|
||||
vdso_install:
|
||||
|
21
arch/arm/boot/install.sh
Normal file → Executable file
21
arch/arm/boot/install.sh
Normal file → Executable file
@ -1,7 +1,5 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# arch/arm/boot/install.sh
|
||||
#
|
||||
# This file is subject to the terms and conditions of the GNU General Public
|
||||
# License. See the file "COPYING" in the main directory of this archive
|
||||
# for more details.
|
||||
@ -18,25 +16,6 @@
|
||||
# $2 - kernel image file
|
||||
# $3 - kernel map file
|
||||
# $4 - default install path (blank if root directory)
|
||||
#
|
||||
|
||||
verify () {
|
||||
if [ ! -f "$1" ]; then
|
||||
echo "" 1>&2
|
||||
echo " *** Missing file: $1" 1>&2
|
||||
echo ' *** You need to run "make" before "make install".' 1>&2
|
||||
echo "" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Make sure the files actually exist
|
||||
verify "$2"
|
||||
verify "$3"
|
||||
|
||||
# User may have a custom install script
|
||||
if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi
|
||||
if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi
|
||||
|
||||
if [ "$(basename $2)" = "zImage" ]; then
|
||||
# Compressed install
|
||||
|
@ -162,11 +162,9 @@ Image: vmlinux
|
||||
Image.%: Image
|
||||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||
|
||||
install: install-image := Image
|
||||
zinstall: install-image := Image.gz
|
||||
install: KBUILD_IMAGE := $(boot)/Image
|
||||
install zinstall:
|
||||
$(CONFIG_SHELL) $(srctree)/$(boot)/install.sh $(KERNELRELEASE) \
|
||||
$(boot)/$(install-image) System.map "$(INSTALL_PATH)"
|
||||
$(call cmd,install)
|
||||
|
||||
PHONY += vdso_install
|
||||
vdso_install:
|
||||
|
21
arch/arm64/boot/install.sh
Normal file → Executable file
21
arch/arm64/boot/install.sh
Normal file → Executable file
@ -1,7 +1,5 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# arch/arm64/boot/install.sh
|
||||
#
|
||||
# This file is subject to the terms and conditions of the GNU General Public
|
||||
# License. See the file "COPYING" in the main directory of this archive
|
||||
# for more details.
|
||||
@ -18,25 +16,6 @@
|
||||
# $2 - kernel image file
|
||||
# $3 - kernel map file
|
||||
# $4 - default install path (blank if root directory)
|
||||
#
|
||||
|
||||
verify () {
|
||||
if [ ! -f "$1" ]; then
|
||||
echo "" 1>&2
|
||||
echo " *** Missing file: $1" 1>&2
|
||||
echo ' *** You need to run "make" before "make install".' 1>&2
|
||||
echo "" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Make sure the files actually exist
|
||||
verify "$2"
|
||||
verify "$3"
|
||||
|
||||
# User may have a custom install script
|
||||
if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi
|
||||
if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi
|
||||
|
||||
if [ "$(basename $2)" = "Image.gz" ]; then
|
||||
# Compressed install
|
||||
|
@ -72,8 +72,9 @@ archheaders:
|
||||
|
||||
CLEAN_FILES += vmlinux.gz
|
||||
|
||||
install: vmlinux.gz
|
||||
sh $(srctree)/arch/ia64/install.sh $(KERNELRELEASE) $< System.map "$(INSTALL_PATH)"
|
||||
install: KBUILD_IMAGE := vmlinux.gz
|
||||
install:
|
||||
$(call cmd,install)
|
||||
|
||||
define archhelp
|
||||
echo '* compressed - Build compressed kernel image'
|
||||
|
10
arch/ia64/install.sh
Normal file → Executable file
10
arch/ia64/install.sh
Normal file → Executable file
@ -1,7 +1,5 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# arch/ia64/install.sh
|
||||
#
|
||||
# This file is subject to the terms and conditions of the GNU General Public
|
||||
# License. See the file "COPYING" in the main directory of this archive
|
||||
# for more details.
|
||||
@ -17,14 +15,6 @@
|
||||
# $2 - kernel image file
|
||||
# $3 - kernel map file
|
||||
# $4 - default install path (blank if root directory)
|
||||
#
|
||||
|
||||
# User may have a custom install script
|
||||
|
||||
if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi
|
||||
if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi
|
||||
|
||||
# Default install - same as make zlilo
|
||||
|
||||
if [ -f $4/vmlinuz ]; then
|
||||
mv $4/vmlinuz $4/vmlinuz.old
|
||||
|
@ -138,5 +138,6 @@ CLEAN_FILES += vmlinux.gz vmlinux.bz2
|
||||
archheaders:
|
||||
$(Q)$(MAKE) $(build)=arch/m68k/kernel/syscalls all
|
||||
|
||||
install: KBUILD_IMAGE := vmlinux.gz
|
||||
install:
|
||||
sh $(srctree)/arch/m68k/install.sh $(KERNELRELEASE) vmlinux.gz System.map "$(INSTALL_PATH)"
|
||||
$(call cmd,install)
|
||||
|
@ -1,5 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
generated-y += syscall_table.h
|
||||
generic-y += export.h
|
||||
generic-y += extable.h
|
||||
generic-y += kvm_para.h
|
||||
generic-y += mcs_spinlock.h
|
||||
|
@ -1,2 +0,0 @@
|
||||
#define KCRC_ALIGN 2
|
||||
#include <asm-generic/export.h>
|
22
arch/m68k/install.sh
Normal file → Executable file
22
arch/m68k/install.sh
Normal file → Executable file
@ -15,28 +15,6 @@
|
||||
# $2 - kernel image file
|
||||
# $3 - kernel map file
|
||||
# $4 - default install path (blank if root directory)
|
||||
#
|
||||
|
||||
verify () {
|
||||
if [ ! -f "$1" ]; then
|
||||
echo "" 1>&2
|
||||
echo " *** Missing file: $1" 1>&2
|
||||
echo ' *** You need to run "make" before "make install".' 1>&2
|
||||
echo "" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Make sure the files actually exist
|
||||
verify "$2"
|
||||
verify "$3"
|
||||
|
||||
# User may have a custom install script
|
||||
|
||||
if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi
|
||||
if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi
|
||||
|
||||
# Default install - same as make zlilo
|
||||
|
||||
if [ -f $4/vmlinuz ]; then
|
||||
mv $4/vmlinuz $4/vmlinuz.old
|
||||
|
@ -56,8 +56,7 @@ $(BOOT_TARGETS): vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(nios2-boot) $(nios2-boot)/$@
|
||||
|
||||
install:
|
||||
sh $(srctree)/$(nios2-boot)/install.sh $(KERNELRELEASE) \
|
||||
$(KBUILD_IMAGE) System.map "$(INSTALL_PATH)"
|
||||
$(call cmd,install)
|
||||
|
||||
define archhelp
|
||||
echo '* vmImage - Kernel-only image for U-Boot ($(KBUILD_IMAGE))'
|
||||
|
22
arch/nios2/boot/install.sh
Normal file → Executable file
22
arch/nios2/boot/install.sh
Normal file → Executable file
@ -15,28 +15,6 @@
|
||||
# $2 - kernel image file
|
||||
# $3 - kernel map file
|
||||
# $4 - default install path (blank if root directory)
|
||||
#
|
||||
|
||||
verify () {
|
||||
if [ ! -f "$1" ]; then
|
||||
echo "" 1>&2
|
||||
echo " *** Missing file: $1" 1>&2
|
||||
echo ' *** You need to run "make" before "make install".' 1>&2
|
||||
echo "" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Make sure the files actually exist
|
||||
verify "$2"
|
||||
verify "$3"
|
||||
|
||||
# User may have a custom install script
|
||||
|
||||
if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi
|
||||
if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi
|
||||
|
||||
# Default install - same as make zlilo
|
||||
|
||||
if [ -f $4/vmlinuz ]; then
|
||||
mv $4/vmlinuz $4/vmlinuz.old
|
||||
|
@ -184,12 +184,11 @@ vdso_install:
|
||||
$(Q)$(MAKE) $(build)=arch/parisc/kernel/vdso $@
|
||||
$(if $(CONFIG_COMPAT_VDSO), \
|
||||
$(Q)$(MAKE) $(build)=arch/parisc/kernel/vdso32 $@)
|
||||
install:
|
||||
$(CONFIG_SHELL) $(srctree)/arch/parisc/install.sh \
|
||||
$(KERNELRELEASE) vmlinux System.map "$(INSTALL_PATH)"
|
||||
zinstall:
|
||||
$(CONFIG_SHELL) $(srctree)/arch/parisc/install.sh \
|
||||
$(KERNELRELEASE) vmlinuz System.map "$(INSTALL_PATH)"
|
||||
|
||||
install: KBUILD_IMAGE := vmlinux
|
||||
zinstall: KBUILD_IMAGE := vmlinuz
|
||||
install zinstall:
|
||||
$(call cmd,install)
|
||||
|
||||
CLEAN_FILES += lifimage
|
||||
MRPROPER_FILES += palo.conf
|
||||
|
28
arch/parisc/install.sh
Normal file → Executable file
28
arch/parisc/install.sh
Normal file → Executable file
@ -1,7 +1,5 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# arch/parisc/install.sh, derived from arch/i386/boot/install.sh
|
||||
#
|
||||
# This file is subject to the terms and conditions of the GNU General Public
|
||||
# License. See the file "COPYING" in the main directory of this archive
|
||||
# for more details.
|
||||
@ -17,32 +15,6 @@
|
||||
# $2 - kernel image file
|
||||
# $3 - kernel map file
|
||||
# $4 - default install path (blank if root directory)
|
||||
#
|
||||
|
||||
verify () {
|
||||
if [ ! -f "$1" ]; then
|
||||
echo "" 1>&2
|
||||
echo " *** Missing file: $1" 1>&2
|
||||
echo ' *** You need to run "make" before "make install".' 1>&2
|
||||
echo "" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Make sure the files actually exist
|
||||
|
||||
verify "$2"
|
||||
verify "$3"
|
||||
|
||||
# User may have a custom install script
|
||||
|
||||
if [ -n "${INSTALLKERNEL}" ]; then
|
||||
if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi
|
||||
if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi
|
||||
if [ -x /usr/sbin/${INSTALLKERNEL} ]; then exec /usr/sbin/${INSTALLKERNEL} "$@"; fi
|
||||
fi
|
||||
|
||||
# Default install
|
||||
|
||||
if [ "$(basename $2)" = "vmlinuz" ]; then
|
||||
# Compressed install
|
||||
|
@ -566,7 +566,6 @@ config RELOCATABLE
|
||||
bool "Build a relocatable kernel"
|
||||
depends on PPC64 || (FLATMEM && (44x || FSL_BOOKE))
|
||||
select NONSTATIC_KERNEL
|
||||
select MODULE_REL_CRCS if MODVERSIONS
|
||||
help
|
||||
This builds a kernel image that is capable of running at the
|
||||
location the kernel is loaded at. For ppc32, there is no any
|
||||
|
@ -408,8 +408,7 @@ endef
|
||||
|
||||
PHONY += install
|
||||
install:
|
||||
sh -x $(srctree)/$(boot)/install.sh "$(KERNELRELEASE)" vmlinux \
|
||||
System.map "$(INSTALL_PATH)"
|
||||
$(call cmd,install)
|
||||
|
||||
ifeq ($(KBUILD_EXTMOD),)
|
||||
# We need to generate vdso-offsets.h before compiling certain files in kernel/.
|
||||
|
@ -453,8 +453,8 @@ clean-files += $(image-) $(initrd-) cuImage.* dtbImage.* treeImage.* \
|
||||
clean-kernel-base := vmlinux.strip vmlinux.bin
|
||||
clean-kernel := $(addsuffix .gz,$(clean-kernel-base))
|
||||
clean-kernel += $(addsuffix .xz,$(clean-kernel-base))
|
||||
# If not absolute clean-files are relative to $(obj).
|
||||
clean-files += $(addprefix $(objtree)/, $(clean-kernel))
|
||||
# clean-files are relative to $(obj).
|
||||
clean-files += $(addprefix ../../../, $(clean-kernel))
|
||||
|
||||
WRAPPER_OBJDIR := /usr/lib/kernel-wrapper
|
||||
WRAPPER_DTSDIR := /usr/lib/kernel-wrapper/dts
|
||||
|
23
arch/powerpc/boot/install.sh
Normal file → Executable file
23
arch/powerpc/boot/install.sh
Normal file → Executable file
@ -15,32 +15,9 @@
|
||||
# $2 - kernel image file
|
||||
# $3 - kernel map file
|
||||
# $4 - default install path (blank if root directory)
|
||||
#
|
||||
|
||||
# Bail with error code if anything goes wrong
|
||||
set -e
|
||||
|
||||
verify () {
|
||||
if [ ! -f "$1" ]; then
|
||||
echo "" 1>&2
|
||||
echo " *** Missing file: $1" 1>&2
|
||||
echo ' *** You need to run "make" before "make install".' 1>&2
|
||||
echo "" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Make sure the files actually exist
|
||||
verify "$2"
|
||||
verify "$3"
|
||||
|
||||
# User may have a custom install script
|
||||
|
||||
if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi
|
||||
if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi
|
||||
|
||||
# Default install
|
||||
|
||||
# this should work for both the pSeries zImage and the iSeries vmlinux.sm
|
||||
image_name=`basename $2`
|
||||
|
||||
|
@ -139,11 +139,10 @@ $(BOOT_TARGETS): vmlinux
|
||||
Image.%: Image
|
||||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||
|
||||
install: install-image = Image
|
||||
zinstall: install-image = Image.gz
|
||||
install: KBUILD_IMAGE := $(boot)/Image
|
||||
zinstall: KBUILD_IMAGE := $(boot)/Image.gz
|
||||
install zinstall:
|
||||
$(CONFIG_SHELL) $(srctree)/$(boot)/install.sh $(KERNELRELEASE) \
|
||||
$(boot)/$(install-image) System.map "$(INSTALL_PATH)"
|
||||
$(call cmd,install)
|
||||
|
||||
PHONY += rv32_randconfig
|
||||
rv32_randconfig:
|
||||
|
21
arch/riscv/boot/install.sh
Normal file → Executable file
21
arch/riscv/boot/install.sh
Normal file → Executable file
@ -1,7 +1,5 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# arch/riscv/boot/install.sh
|
||||
#
|
||||
# This file is subject to the terms and conditions of the GNU General Public
|
||||
# License. See the file "COPYING" in the main directory of this archive
|
||||
# for more details.
|
||||
@ -18,25 +16,6 @@
|
||||
# $2 - kernel image file
|
||||
# $3 - kernel map file
|
||||
# $4 - default install path (blank if root directory)
|
||||
#
|
||||
|
||||
verify () {
|
||||
if [ ! -f "$1" ]; then
|
||||
echo "" 1>&2
|
||||
echo " *** Missing file: $1" 1>&2
|
||||
echo ' *** You need to run "make" before "make install".' 1>&2
|
||||
echo "" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Make sure the files actually exist
|
||||
verify "$2"
|
||||
verify "$3"
|
||||
|
||||
# User may have a custom install script
|
||||
if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi
|
||||
if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi
|
||||
|
||||
if [ "$(basename $2)" = "Image.gz" ]; then
|
||||
# Compressed install
|
||||
|
@ -586,7 +586,6 @@ endchoice
|
||||
|
||||
config RELOCATABLE
|
||||
bool "Build a relocatable kernel"
|
||||
select MODULE_REL_CRCS if MODVERSIONS
|
||||
default y
|
||||
help
|
||||
This builds a kernel image that retains relocation information
|
||||
|
@ -142,8 +142,7 @@ all: bzImage
|
||||
KBUILD_IMAGE := $(boot)/bzImage
|
||||
|
||||
install:
|
||||
sh -x $(srctree)/$(boot)/install.sh $(KERNELRELEASE) $(KBUILD_IMAGE) \
|
||||
System.map "$(INSTALL_PATH)"
|
||||
$(call cmd,install)
|
||||
|
||||
bzImage: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||
|
6
arch/s390/boot/install.sh
Normal file → Executable file
6
arch/s390/boot/install.sh
Normal file → Executable file
@ -14,12 +14,6 @@
|
||||
# $2 - kernel image file
|
||||
# $3 - kernel map file
|
||||
# $4 - default install path (blank if root directory)
|
||||
#
|
||||
|
||||
# User may have a custom install script
|
||||
|
||||
if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi
|
||||
if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi
|
||||
|
||||
echo "Warning: '${INSTALLKERNEL}' command not available - additional " \
|
||||
"bootloader config required" >&2
|
||||
|
@ -72,8 +72,7 @@ image zImage uImage tftpboot.img vmlinux.aout: vmlinux
|
||||
$(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
|
||||
|
||||
install:
|
||||
sh $(srctree)/$(boot)/install.sh $(KERNELRELEASE) $(KBUILD_IMAGE) \
|
||||
System.map "$(INSTALL_PATH)"
|
||||
$(call cmd,install)
|
||||
|
||||
archheaders:
|
||||
$(Q)$(MAKE) $(build)=arch/sparc/kernel/syscalls all
|
||||
|
22
arch/sparc/boot/install.sh
Normal file → Executable file
22
arch/sparc/boot/install.sh
Normal file → Executable file
@ -15,28 +15,6 @@
|
||||
# $2 - kernel image file
|
||||
# $3 - kernel map file
|
||||
# $4 - default install path (blank if root directory)
|
||||
#
|
||||
|
||||
verify () {
|
||||
if [ ! -f "$1" ]; then
|
||||
echo "" 1>&2
|
||||
echo " *** Missing file: $1" 1>&2
|
||||
echo ' *** You need to run "make" before "make install".' 1>&2
|
||||
echo "" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Make sure the files actually exist
|
||||
verify "$2"
|
||||
verify "$3"
|
||||
|
||||
# User may have a custom install script
|
||||
|
||||
if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi
|
||||
if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi
|
||||
|
||||
# Default install - same as make zlilo
|
||||
|
||||
if [ -f $4/vmlinuz ]; then
|
||||
mv $4/vmlinuz $4/vmlinuz.old
|
||||
|
@ -106,7 +106,6 @@ config LD_SCRIPT_DYN
|
||||
bool
|
||||
default y
|
||||
depends on !LD_SCRIPT_STATIC
|
||||
select MODULE_REL_CRCS if MODVERSIONS
|
||||
|
||||
config LD_SCRIPT_DYN_RPATH
|
||||
bool "set rpath in the binary" if EXPERT
|
||||
|
@ -271,8 +271,7 @@ $(BOOT_TARGETS): vmlinux
|
||||
|
||||
PHONY += install
|
||||
install:
|
||||
$(CONFIG_SHELL) $(srctree)/$(boot)/install.sh $(KERNELRELEASE) \
|
||||
$(KBUILD_IMAGE) System.map "$(INSTALL_PATH)"
|
||||
$(call cmd,install)
|
||||
|
||||
PHONY += vdso_install
|
||||
vdso_install:
|
||||
|
22
arch/x86/boot/install.sh
Normal file → Executable file
22
arch/x86/boot/install.sh
Normal file → Executable file
@ -15,28 +15,6 @@
|
||||
# $2 - kernel image file
|
||||
# $3 - kernel map file
|
||||
# $4 - default install path (blank if root directory)
|
||||
#
|
||||
|
||||
verify () {
|
||||
if [ ! -f "$1" ]; then
|
||||
echo "" 1>&2
|
||||
echo " *** Missing file: $1" 1>&2
|
||||
echo ' *** You need to run "make" before "make install".' 1>&2
|
||||
echo "" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Make sure the files actually exist
|
||||
verify "$2"
|
||||
verify "$3"
|
||||
|
||||
# User may have a custom install script
|
||||
|
||||
if [ -x ~/bin/${INSTALLKERNEL} ]; then exec ~/bin/${INSTALLKERNEL} "$@"; fi
|
||||
if [ -x /sbin/${INSTALLKERNEL} ]; then exec /sbin/${INSTALLKERNEL} "$@"; fi
|
||||
|
||||
# Default install - same as make zlilo
|
||||
|
||||
if [ -f $4/vmlinuz ]; then
|
||||
mv $4/vmlinuz $4/vmlinuz.old
|
||||
|
@ -86,5 +86,5 @@ targets += x509_revocation_list
|
||||
|
||||
hostprogs := extract-cert
|
||||
|
||||
HOSTCFLAGS_extract-cert.o = $(shell pkg-config --cflags libcrypto 2> /dev/null)
|
||||
HOSTLDLIBS_extract-cert = $(shell pkg-config --libs libcrypto 2> /dev/null || echo -lcrypto)
|
||||
HOSTCFLAGS_extract-cert.o = $(shell $(HOSTPKG_CONFIG) --cflags libcrypto 2> /dev/null)
|
||||
HOSTLDLIBS_extract-cert = $(shell $(HOSTPKG_CONFIG) --libs libcrypto 2> /dev/null || echo -lcrypto)
|
||||
|
@ -2,6 +2,14 @@
|
||||
#ifndef __ASM_GENERIC_EXPORT_H
|
||||
#define __ASM_GENERIC_EXPORT_H
|
||||
|
||||
/*
|
||||
* This comment block is used by fixdep. Please do not remove.
|
||||
*
|
||||
* When CONFIG_MODVERSIONS is changed from n to y, all source files having
|
||||
* EXPORT_SYMBOL variants must be re-compiled because genksyms is run as a
|
||||
* side effect of the *.o build rule.
|
||||
*/
|
||||
|
||||
#ifndef KSYM_FUNC
|
||||
#define KSYM_FUNC(x) x
|
||||
#endif
|
||||
@ -12,9 +20,6 @@
|
||||
#else
|
||||
#define KSYM_ALIGN 4
|
||||
#endif
|
||||
#ifndef KCRC_ALIGN
|
||||
#define KCRC_ALIGN 4
|
||||
#endif
|
||||
|
||||
.macro __put, val, name
|
||||
#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
|
||||
@ -43,17 +48,6 @@ __ksymtab_\name:
|
||||
__kstrtab_\name:
|
||||
.asciz "\name"
|
||||
.previous
|
||||
#ifdef CONFIG_MODVERSIONS
|
||||
.section ___kcrctab\sec+\name,"a"
|
||||
.balign KCRC_ALIGN
|
||||
#if defined(CONFIG_MODULE_REL_CRCS)
|
||||
.long __crc_\name - .
|
||||
#else
|
||||
.long __crc_\name
|
||||
#endif
|
||||
.weak __crc_\name
|
||||
.previous
|
||||
#endif
|
||||
#endif
|
||||
.endm
|
||||
|
||||
|
17
include/linux/export-internal.h
Normal file
17
include/linux/export-internal.h
Normal file
@ -0,0 +1,17 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Please do not include this explicitly.
|
||||
* This is used by C files generated by modpost.
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_EXPORT_INTERNAL_H__
|
||||
#define __LINUX_EXPORT_INTERNAL_H__
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
/* __used is needed to keep __crc_* for LTO */
|
||||
#define SYMBOL_CRC(sym, crc, sec) \
|
||||
u32 __section("___kcrctab" sec "+" #sym) __used __crc_##sym = crc
|
||||
|
||||
#endif /* __LINUX_EXPORT_INTERNAL_H__ */
|
@ -11,6 +11,14 @@
|
||||
* hackers place grumpy comments in header files.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This comment block is used by fixdep. Please do not remove.
|
||||
*
|
||||
* When CONFIG_MODVERSIONS is changed from n to y, all source files having
|
||||
* EXPORT_SYMBOL variants must be re-compiled because genksyms is run as a
|
||||
* side effect of the *.o build rule.
|
||||
*/
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifdef MODULE
|
||||
extern struct module __this_module;
|
||||
@ -19,26 +27,6 @@ extern struct module __this_module;
|
||||
#define THIS_MODULE ((struct module *)0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MODVERSIONS
|
||||
/* Mark the CRC weak since genksyms apparently decides not to
|
||||
* generate a checksums for some symbols */
|
||||
#if defined(CONFIG_MODULE_REL_CRCS)
|
||||
#define __CRC_SYMBOL(sym, sec) \
|
||||
asm(" .section \"___kcrctab" sec "+" #sym "\", \"a\" \n" \
|
||||
" .weak __crc_" #sym " \n" \
|
||||
" .long __crc_" #sym " - . \n" \
|
||||
" .previous \n")
|
||||
#else
|
||||
#define __CRC_SYMBOL(sym, sec) \
|
||||
asm(" .section \"___kcrctab" sec "+" #sym "\", \"a\" \n" \
|
||||
" .weak __crc_" #sym " \n" \
|
||||
" .long __crc_" #sym " \n" \
|
||||
" .previous \n")
|
||||
#endif
|
||||
#else
|
||||
#define __CRC_SYMBOL(sym, sec)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
|
||||
#include <linux/compiler.h>
|
||||
/*
|
||||
@ -85,7 +73,6 @@ struct kernel_symbol {
|
||||
/*
|
||||
* For every exported symbol, do the following:
|
||||
*
|
||||
* - If applicable, place a CRC entry in the __kcrctab section.
|
||||
* - Put the name of the symbol and namespace (empty string "" for none) in
|
||||
* __ksymtab_strings.
|
||||
* - Place a struct kernel_symbol entry in the __ksymtab section.
|
||||
@ -98,7 +85,6 @@ struct kernel_symbol {
|
||||
extern typeof(sym) sym; \
|
||||
extern const char __kstrtab_##sym[]; \
|
||||
extern const char __kstrtabns_##sym[]; \
|
||||
__CRC_SYMBOL(sym, sec); \
|
||||
asm(" .section \"__ksymtab_strings\",\"aMS\",%progbits,1 \n" \
|
||||
"__kstrtab_" #sym ": \n" \
|
||||
" .asciz \"" #sym "\" \n" \
|
||||
|
@ -2136,10 +2136,6 @@ config ASM_MODVERSIONS
|
||||
assembly. This can be enabled only when the target architecture
|
||||
supports it.
|
||||
|
||||
config MODULE_REL_CRCS
|
||||
bool
|
||||
depends on MODVERSIONS
|
||||
|
||||
config MODULE_SRCVERSION_ALL
|
||||
bool "Source checksum for all modules"
|
||||
help
|
||||
|
@ -74,7 +74,7 @@ fi
|
||||
# of tree builds having stale headers in srctree. Just silence CPIO for now.
|
||||
for f in $dir_list;
|
||||
do find "$f" -name "*.h";
|
||||
done | cpio --quiet -pd $cpio_dir >/dev/null 2>&1
|
||||
done | cpio --quiet -pdu $cpio_dir >/dev/null 2>&1
|
||||
|
||||
# Remove comments except SDPX lines
|
||||
find $cpio_dir -type f -print0 |
|
||||
|
@ -1231,11 +1231,6 @@ static int try_to_force_load(struct module *mod, const char *reason)
|
||||
|
||||
#ifdef CONFIG_MODVERSIONS
|
||||
|
||||
static u32 resolve_rel_crc(const s32 *crc)
|
||||
{
|
||||
return *(u32 *)((void *)crc + *crc);
|
||||
}
|
||||
|
||||
static int check_version(const struct load_info *info,
|
||||
const char *symname,
|
||||
struct module *mod,
|
||||
@ -1264,10 +1259,7 @@ static int check_version(const struct load_info *info,
|
||||
if (strcmp(versions[i].name, symname) != 0)
|
||||
continue;
|
||||
|
||||
if (IS_ENABLED(CONFIG_MODULE_REL_CRCS))
|
||||
crcval = resolve_rel_crc(crc);
|
||||
else
|
||||
crcval = *crc;
|
||||
crcval = *crc;
|
||||
if (versions[i].crc == crcval)
|
||||
return 1;
|
||||
pr_debug("Found checksum %X vs module %lX\n",
|
||||
|
@ -14,8 +14,8 @@ hostprogs-always-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE) += insert-sys-cert
|
||||
HOSTCFLAGS_sorttable.o = -I$(srctree)/tools/include
|
||||
HOSTLDLIBS_sorttable = -lpthread
|
||||
HOSTCFLAGS_asn1_compiler.o = -I$(srctree)/include
|
||||
HOSTCFLAGS_sign-file.o = $(shell pkg-config --cflags libcrypto 2> /dev/null)
|
||||
HOSTLDLIBS_sign-file = $(shell pkg-config --libs libcrypto 2> /dev/null || echo -lcrypto)
|
||||
HOSTCFLAGS_sign-file.o = $(shell $(HOSTPKG_CONFIG) --cflags libcrypto 2> /dev/null)
|
||||
HOSTLDLIBS_sign-file = $(shell $(HOSTPKG_CONFIG) --libs libcrypto 2> /dev/null || echo -lcrypto)
|
||||
|
||||
ifdef CONFIG_UNWINDER_ORC
|
||||
ifeq ($(ARCH),x86_64)
|
||||
|
@ -85,7 +85,8 @@ ifdef need-builtin
|
||||
targets-for-builtin += $(obj)/built-in.a
|
||||
endif
|
||||
|
||||
targets-for-modules := $(patsubst %.o, %.mod, $(filter %.o, $(obj-m)))
|
||||
targets-for-modules := $(foreach x, o mod $(if $(CONFIG_TRIM_UNUSED_KSYMS), usyms), \
|
||||
$(patsubst %.o, %.$x, $(filter %.o, $(obj-m))))
|
||||
|
||||
ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),)
|
||||
targets-for-modules += $(patsubst %.o, %.prelink.o, $(filter %.o, $(obj-m)))
|
||||
@ -125,18 +126,16 @@ cmd_cpp_i_c = $(CPP) $(c_flags) -o $@ $<
|
||||
$(obj)/%.i: $(src)/%.c FORCE
|
||||
$(call if_changed_dep,cpp_i_c)
|
||||
|
||||
genksyms = scripts/genksyms/genksyms \
|
||||
$(if $(1), -T $(2)) \
|
||||
$(if $(KBUILD_PRESERVE), -p) \
|
||||
-r $(or $(wildcard $(2:.symtypes=.symref)), /dev/null)
|
||||
|
||||
# These mirror gensymtypes_S and co below, keep them in synch.
|
||||
cmd_gensymtypes_c = \
|
||||
$(CPP) -D__GENKSYMS__ $(c_flags) $< | \
|
||||
scripts/genksyms/genksyms $(if $(1), -T $(2)) \
|
||||
$(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS)) \
|
||||
$(if $(KBUILD_PRESERVE),-p) \
|
||||
-r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
|
||||
cmd_gensymtypes_c = $(CPP) -D__GENKSYMS__ $(c_flags) $< | $(genksyms)
|
||||
|
||||
quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
|
||||
cmd_cc_symtypes_c = \
|
||||
$(call cmd_gensymtypes_c,true,$@) >/dev/null; \
|
||||
test -s $@ || rm -f $@
|
||||
cmd_cc_symtypes_c = $(call cmd_gensymtypes_c,true,$@) >/dev/null
|
||||
|
||||
$(obj)/%.symtypes : $(src)/%.c FORCE
|
||||
$(call cmd,cc_symtypes_c)
|
||||
@ -162,35 +161,18 @@ ifdef CONFIG_MODVERSIONS
|
||||
# o if <file>.o doesn't contain a __ksymtab version, i.e. does
|
||||
# not export symbols, it's done.
|
||||
# o otherwise, we calculate symbol versions using the good old
|
||||
# genksyms on the preprocessed source and postprocess them in a way
|
||||
# that they are usable as a linker script
|
||||
# o generate .tmp_<file>.o from <file>.o using the linker to
|
||||
# replace the unresolved symbols __crc_exported_symbol with
|
||||
# the actual value of the checksum generated by genksyms
|
||||
# o remove .tmp_<file>.o to <file>.o
|
||||
# genksyms on the preprocessed source and dump them into the .cmd file.
|
||||
# o modpost will extract versions from that file and create *.c files that will
|
||||
# be compiled and linked to the kernel and/or modules.
|
||||
|
||||
ifdef CONFIG_LTO_CLANG
|
||||
# Generate .o.symversions files for each .o with exported symbols, and link these
|
||||
# to the kernel and/or modules at the end.
|
||||
cmd_modversions_c = \
|
||||
gen_symversions = \
|
||||
if $(NM) $@ 2>/dev/null | grep -q __ksymtab; then \
|
||||
$(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
|
||||
> $@.symversions; \
|
||||
else \
|
||||
rm -f $@.symversions; \
|
||||
fi;
|
||||
else
|
||||
cmd_modversions_c = \
|
||||
if $(OBJDUMP) -h $@ | grep -q __ksymtab; then \
|
||||
$(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
|
||||
> $(@D)/.tmp_$(@F:.o=.ver); \
|
||||
\
|
||||
$(LD) $(KBUILD_LDFLAGS) -r -o $(@D)/.tmp_$(@F) $@ \
|
||||
-T $(@D)/.tmp_$(@F:.o=.ver); \
|
||||
mv -f $(@D)/.tmp_$(@F) $@; \
|
||||
rm -f $(@D)/.tmp_$(@F:.o=.ver); \
|
||||
$(call cmd_gensymtypes_$(1),$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
|
||||
>> $(dot-target).cmd; \
|
||||
fi
|
||||
endif
|
||||
|
||||
cmd_gen_symversions_c = $(call gen_symversions,c)
|
||||
|
||||
endif
|
||||
|
||||
ifdef CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT
|
||||
@ -265,9 +247,6 @@ endif
|
||||
ifdef CONFIG_TRIM_UNUSED_KSYMS
|
||||
cmd_gen_ksymdeps = \
|
||||
$(CONFIG_SHELL) $(srctree)/scripts/gen_ksymdeps.sh $@ >> $(dot-target).cmd
|
||||
|
||||
# List module undefined symbols
|
||||
undefined_syms = $(NM) $< | $(AWK) '$$1 == "U" { printf("%s%s", x++ ? " " : "", $$2) }';
|
||||
endif
|
||||
|
||||
define rule_cc_o_c
|
||||
@ -276,7 +255,7 @@ define rule_cc_o_c
|
||||
$(call cmd,checksrc)
|
||||
$(call cmd,checkdoc)
|
||||
$(call cmd,gen_objtooldep)
|
||||
$(call cmd,modversions_c)
|
||||
$(call cmd,gen_symversions_c)
|
||||
$(call cmd,record_mcount)
|
||||
endef
|
||||
|
||||
@ -284,7 +263,7 @@ define rule_as_o_S
|
||||
$(call cmd_and_fixdep,as_o_S)
|
||||
$(call cmd,gen_ksymdeps)
|
||||
$(call cmd,gen_objtooldep)
|
||||
$(call cmd,modversions_S)
|
||||
$(call cmd,gen_symversions_S)
|
||||
endef
|
||||
|
||||
# Built-in and composite module parts
|
||||
@ -298,8 +277,6 @@ ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),)
|
||||
quiet_cmd_cc_prelink_modules = LD [M] $@
|
||||
cmd_cc_prelink_modules = \
|
||||
$(LD) $(ld_flags) -r -o $@ \
|
||||
$(shell [ -s $(@:.prelink.o=.o.symversions) ] && \
|
||||
echo -T $(@:.prelink.o=.o.symversions)) \
|
||||
--whole-archive $(filter-out FORCE,$^) \
|
||||
$(cmd_objtool)
|
||||
|
||||
@ -313,14 +290,18 @@ $(obj)/%.prelink.o: $(obj)/%.o FORCE
|
||||
$(call if_changed,cc_prelink_modules)
|
||||
endif
|
||||
|
||||
cmd_mod = { \
|
||||
echo $(if $($*-objs)$($*-y)$($*-m), $(addprefix $(obj)/, $($*-objs) $($*-y) $($*-m)), $(@:.mod=.o)); \
|
||||
$(undefined_syms) echo; \
|
||||
} > $@
|
||||
cmd_mod = echo $(addprefix $(obj)/, $(call real-search, $*.o, .o, -objs -y -m)) | \
|
||||
$(AWK) -v RS='( |\n)' '!x[$$0]++' > $@
|
||||
|
||||
$(obj)/%.mod: $(obj)/%$(mod-prelink-ext).o FORCE
|
||||
$(obj)/%.mod: FORCE
|
||||
$(call if_changed,mod)
|
||||
|
||||
# List module undefined symbols
|
||||
cmd_undefined_syms = $(NM) $< | sed -n 's/^ *U //p' > $@
|
||||
|
||||
$(obj)/%.usyms: $(obj)/%$(mod-prelink-ext).o FORCE
|
||||
$(call if_changed,undefined_syms)
|
||||
|
||||
quiet_cmd_cc_lst_c = MKLST $@
|
||||
cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \
|
||||
$(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \
|
||||
@ -349,16 +330,10 @@ cmd_gensymtypes_S = \
|
||||
$(CPP) $(a_flags) $< | \
|
||||
grep "\<___EXPORT_SYMBOL\>" | \
|
||||
sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ; } | \
|
||||
$(CPP) -D__GENKSYMS__ $(c_flags) -xc - | \
|
||||
scripts/genksyms/genksyms $(if $(1), -T $(2)) \
|
||||
$(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS)) \
|
||||
$(if $(KBUILD_PRESERVE),-p) \
|
||||
-r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
|
||||
$(CPP) -D__GENKSYMS__ $(c_flags) -xc - | $(genksyms)
|
||||
|
||||
quiet_cmd_cc_symtypes_S = SYM $(quiet_modtag) $@
|
||||
cmd_cc_symtypes_S = \
|
||||
$(call cmd_gensymtypes_S,true,$@) >/dev/null; \
|
||||
test -s $@ || rm -f $@
|
||||
cmd_cc_symtypes_S = $(call cmd_gensymtypes_S,true,$@) >/dev/null
|
||||
|
||||
$(obj)/%.symtypes : $(src)/%.S FORCE
|
||||
$(call cmd,cc_symtypes_S)
|
||||
@ -378,16 +353,8 @@ ifdef CONFIG_ASM_MODVERSIONS
|
||||
# versioning matches the C process described above, with difference that
|
||||
# we parse asm-prototypes.h C header to get function definitions.
|
||||
|
||||
cmd_modversions_S = \
|
||||
if $(OBJDUMP) -h $@ | grep -q __ksymtab; then \
|
||||
$(call cmd_gensymtypes_S,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
|
||||
> $(@D)/.tmp_$(@F:.o=.ver); \
|
||||
\
|
||||
$(LD) $(KBUILD_LDFLAGS) -r -o $(@D)/.tmp_$(@F) $@ \
|
||||
-T $(@D)/.tmp_$(@F:.o=.ver); \
|
||||
mv -f $(@D)/.tmp_$(@F) $@; \
|
||||
rm -f $(@D)/.tmp_$(@F:.o=.ver); \
|
||||
fi
|
||||
cmd_gen_symversions_S = $(call gen_symversions,S)
|
||||
|
||||
endif
|
||||
|
||||
$(obj)/%.o: $(src)/%.S FORCE
|
||||
@ -422,17 +389,6 @@ $(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler
|
||||
$(subdir-builtin): $(obj)/%/built-in.a: $(obj)/% ;
|
||||
$(subdir-modorder): $(obj)/%/modules.order: $(obj)/% ;
|
||||
|
||||
# combine symversions for later processing
|
||||
ifeq ($(CONFIG_LTO_CLANG) $(CONFIG_MODVERSIONS),y y)
|
||||
cmd_update_lto_symversions = \
|
||||
rm -f $@.symversions \
|
||||
$(foreach n, $(filter-out FORCE,$^), \
|
||||
$(if $(shell test -s $(n).symversions && echo y), \
|
||||
; cat $(n).symversions >> $@.symversions))
|
||||
else
|
||||
cmd_update_lto_symversions = echo >/dev/null
|
||||
endif
|
||||
|
||||
#
|
||||
# Rule to compile a set of .o files into one .a file (without symbol table)
|
||||
#
|
||||
@ -440,11 +396,8 @@ endif
|
||||
quiet_cmd_ar_builtin = AR $@
|
||||
cmd_ar_builtin = rm -f $@; $(AR) cDPrST $@ $(real-prereqs)
|
||||
|
||||
quiet_cmd_ar_and_symver = AR $@
|
||||
cmd_ar_and_symver = $(cmd_update_lto_symversions); $(cmd_ar_builtin)
|
||||
|
||||
$(obj)/built-in.a: $(real-obj-y) FORCE
|
||||
$(call if_changed,ar_and_symver)
|
||||
$(call if_changed,ar_builtin)
|
||||
|
||||
#
|
||||
# Rule to create modules.order file
|
||||
@ -464,32 +417,24 @@ $(obj)/modules.order: $(obj-m) FORCE
|
||||
#
|
||||
# Rule to compile a set of .o files into one .a file (with symbol table)
|
||||
#
|
||||
quiet_cmd_ar_lib = AR $@
|
||||
cmd_ar_lib = $(cmd_update_lto_symversions); $(cmd_ar)
|
||||
|
||||
$(obj)/lib.a: $(lib-y) FORCE
|
||||
$(call if_changed,ar_lib)
|
||||
$(call if_changed,ar)
|
||||
|
||||
# NOTE:
|
||||
# Do not replace $(filter %.o,^) with $(real-prereqs). When a single object
|
||||
# module is turned into a multi object module, $^ will contain header file
|
||||
# dependencies recorded in the .*.cmd file.
|
||||
ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),)
|
||||
quiet_cmd_link_multi-m = AR [M] $@
|
||||
cmd_link_multi-m = \
|
||||
$(cmd_update_lto_symversions); \
|
||||
rm -f $@; \
|
||||
$(AR) cDPrsT $@ $(filter %.o,$^)
|
||||
$(AR) cDPrsT $@ @$(patsubst %.o,%.mod,$@)
|
||||
else
|
||||
quiet_cmd_link_multi-m = LD [M] $@
|
||||
cmd_link_multi-m = $(LD) $(ld_flags) -r -o $@ $(filter %.o,$^)
|
||||
cmd_link_multi-m = $(LD) $(ld_flags) -r -o $@ @$(patsubst %.o,%.mod,$@)
|
||||
endif
|
||||
|
||||
$(multi-obj-m): FORCE
|
||||
$(multi-obj-m): %.o: %.mod FORCE
|
||||
$(call if_changed,link_multi-m)
|
||||
$(call multi_depend, $(multi-obj-m), .o, -objs -y -m)
|
||||
|
||||
targets += $(multi-obj-m)
|
||||
targets := $(filter-out $(PHONY), $(targets))
|
||||
|
||||
# Add intermediate targets:
|
||||
|
@ -36,13 +36,7 @@ __clean-files := \
|
||||
|
||||
__clean-files := $(filter-out $(no-clean-files), $(__clean-files))
|
||||
|
||||
# clean-files is given relative to the current directory, unless it
|
||||
# starts with $(objtree)/ (which means "./", so do not add "./" unless
|
||||
# you want to delete a file from the toplevel object directory).
|
||||
|
||||
__clean-files := $(wildcard \
|
||||
$(addprefix $(obj)/, $(filter-out $(objtree)/%, $(__clean-files))) \
|
||||
$(filter $(objtree)/%, $(__clean-files)))
|
||||
__clean-files := $(wildcard $(addprefix $(obj)/, $(__clean-files)))
|
||||
|
||||
# ==========================================================================
|
||||
|
||||
|
@ -2,8 +2,8 @@
|
||||
# ==========================================================================
|
||||
# make W=... settings
|
||||
#
|
||||
# There are three warning groups enabled by W=1, W=2, W=3.
|
||||
# They are independent, and can be combined like W=12 or W=123.
|
||||
# There are four warning groups enabled by W=1, W=2, W=3, and W=e
|
||||
# They are independent, and can be combined like W=12 or W=123e.
|
||||
# ==========================================================================
|
||||
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, packed-not-aligned)
|
||||
@ -94,3 +94,12 @@ KBUILD_CFLAGS += $(call cc-option, -Wpacked-bitfield-compat)
|
||||
KBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN3
|
||||
|
||||
endif
|
||||
|
||||
#
|
||||
# W=e - error out on warnings
|
||||
#
|
||||
ifneq ($(findstring e, $(KBUILD_EXTRA_WARN)),)
|
||||
|
||||
KBUILD_CFLAGS += -Werror
|
||||
|
||||
endif
|
||||
|
@ -236,9 +236,9 @@ endif
|
||||
# Usage:
|
||||
# $(call multi_depend, multi_used_targets, suffix_to_remove, suffix_to_add)
|
||||
define multi_depend
|
||||
$(foreach m, $(notdir $1), \
|
||||
$(eval $(obj)/$m: \
|
||||
$(addprefix $(obj)/, $(foreach s, $3, $($(m:%$(strip $2)=%$(s)))))))
|
||||
$(foreach m, $1, \
|
||||
$(eval $m: \
|
||||
$(addprefix $(obj)/, $(call suffix-search, $(patsubst $(obj)/%,%,$m), $2, $3))))
|
||||
endef
|
||||
|
||||
# Copy a file
|
||||
|
32
scripts/Makefile.vmlinux
Normal file
32
scripts/Makefile.vmlinux
Normal file
@ -0,0 +1,32 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
include include/config/auto.conf
|
||||
include $(srctree)/scripts/Kbuild.include
|
||||
|
||||
# for c_flags
|
||||
include $(srctree)/scripts/Makefile.lib
|
||||
|
||||
quiet_cmd_cc_o_c = CC $@
|
||||
cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
|
||||
|
||||
%.o: %.c FORCE
|
||||
$(call if_changed_dep,cc_o_c)
|
||||
|
||||
targets := $(MAKECMDGOALS)
|
||||
|
||||
# Add FORCE to the prequisites of a target to force it to be always rebuilt.
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
PHONY += FORCE
|
||||
FORCE:
|
||||
|
||||
# Read all saved command lines and dependencies for the $(targets) we
|
||||
# may be building above, using $(if_changed{,_dep}). As an
|
||||
# optimization, we don't need to read them if the target does not
|
||||
# exist, we will rebuild anyway in that case.
|
||||
|
||||
existing-targets := $(wildcard $(sort $(targets)))
|
||||
|
||||
-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)
|
||||
|
||||
.PHONY: $(PHONY)
|
@ -35,7 +35,7 @@ case "$KBUILD_VERBOSE" in
|
||||
esac
|
||||
|
||||
# Generate a new symbol list file
|
||||
$CONFIG_SHELL $srctree/scripts/gen_autoksyms.sh "$new_ksyms_file"
|
||||
$CONFIG_SHELL $srctree/scripts/gen_autoksyms.sh --modorder "$new_ksyms_file"
|
||||
|
||||
# Extract changes between old and new list and touch corresponding
|
||||
# dependency files.
|
||||
|
@ -268,4 +268,4 @@ syscall_list() {
|
||||
}
|
||||
|
||||
(ignore_list && syscall_list $(dirname $0)/../arch/x86/entry/syscalls/syscall_32.tbl) | \
|
||||
$* -Wno-error -E -x c - > /dev/null
|
||||
$* -Wno-error -Wno-unused-macros -E -x c - > /dev/null
|
||||
|
4
scripts/dummy-tools/pahole
Executable file
4
scripts/dummy-tools/pahole
Executable file
@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
echo v99.99
|
@ -2,13 +2,10 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
# Create an autoksyms.h header file from the list of all module's needed symbols
|
||||
# as recorded on the second line of *.mod files and the user-provided symbol
|
||||
# whitelist.
|
||||
# as recorded in *.usyms files and the user-provided symbol whitelist.
|
||||
|
||||
set -e
|
||||
|
||||
output_file="$1"
|
||||
|
||||
# Use "make V=1" to debug this script.
|
||||
case "$KBUILD_VERBOSE" in
|
||||
*1*)
|
||||
@ -16,6 +13,15 @@ case "$KBUILD_VERBOSE" in
|
||||
;;
|
||||
esac
|
||||
|
||||
read_modorder=
|
||||
|
||||
if [ "$1" = --modorder ]; then
|
||||
shift
|
||||
read_modorder=1
|
||||
fi
|
||||
|
||||
output_file="$1"
|
||||
|
||||
needed_symbols=
|
||||
|
||||
# Special case for modversions (see modpost.c)
|
||||
@ -41,10 +47,8 @@ cat > "$output_file" << EOT
|
||||
|
||||
EOT
|
||||
|
||||
[ -f modules.order ] && modlist=modules.order || modlist=/dev/null
|
||||
|
||||
{
|
||||
sed 's/ko$/mod/' $modlist | xargs -n1 sed -n -e '2p'
|
||||
[ -n "${read_modorder}" ] && sed 's/ko$/usyms/' modules.order | xargs cat
|
||||
echo "$needed_symbols"
|
||||
[ -n "$ksym_wl" ] && cat "$ksym_wl"
|
||||
} | sed -e 's/ /\n/g' | sed -n -e '/^$/!p' |
|
||||
|
@ -33,7 +33,7 @@ char *cur_filename;
|
||||
int in_source_file;
|
||||
|
||||
static int flag_debug, flag_dump_defs, flag_reference, flag_dump_types,
|
||||
flag_preserve, flag_warnings, flag_rel_crcs;
|
||||
flag_preserve, flag_warnings;
|
||||
|
||||
static int errors;
|
||||
static int nsyms;
|
||||
@ -680,11 +680,7 @@ void export_symbol(const char *name)
|
||||
if (flag_dump_defs)
|
||||
fputs(">\n", debugfile);
|
||||
|
||||
/* Used as a linker script. */
|
||||
printf(!flag_rel_crcs ? "__crc_%s = 0x%08lx;\n" :
|
||||
"SECTIONS { .rodata : ALIGN(4) { "
|
||||
"__crc_%s = .; LONG(0x%08lx); } }\n",
|
||||
name, crc);
|
||||
printf("#SYMVER %s 0x%08lx\n", name, crc);
|
||||
}
|
||||
}
|
||||
|
||||
@ -733,7 +729,6 @@ static void genksyms_usage(void)
|
||||
" -q, --quiet Disable warnings (default)\n"
|
||||
" -h, --help Print this message\n"
|
||||
" -V, --version Print the release version\n"
|
||||
" -R, --relative-crc Emit section relative symbol CRCs\n"
|
||||
#else /* __GNU_LIBRARY__ */
|
||||
" -s Select symbol prefix\n"
|
||||
" -d Increment the debug level (repeatable)\n"
|
||||
@ -745,7 +740,6 @@ static void genksyms_usage(void)
|
||||
" -q Disable warnings (default)\n"
|
||||
" -h Print this message\n"
|
||||
" -V Print the release version\n"
|
||||
" -R Emit section relative symbol CRCs\n"
|
||||
#endif /* __GNU_LIBRARY__ */
|
||||
, stderr);
|
||||
}
|
||||
@ -766,14 +760,13 @@ int main(int argc, char **argv)
|
||||
{"preserve", 0, 0, 'p'},
|
||||
{"version", 0, 0, 'V'},
|
||||
{"help", 0, 0, 'h'},
|
||||
{"relative-crc", 0, 0, 'R'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
while ((o = getopt_long(argc, argv, "s:dwqVDr:T:phR",
|
||||
while ((o = getopt_long(argc, argv, "s:dwqVDr:T:ph",
|
||||
&long_opts[0], NULL)) != EOF)
|
||||
#else /* __GNU_LIBRARY__ */
|
||||
while ((o = getopt(argc, argv, "s:dwqVDr:T:phR")) != EOF)
|
||||
while ((o = getopt(argc, argv, "s:dwqVDr:T:ph")) != EOF)
|
||||
#endif /* __GNU_LIBRARY__ */
|
||||
switch (o) {
|
||||
case 'd':
|
||||
@ -813,9 +806,6 @@ int main(int argc, char **argv)
|
||||
case 'h':
|
||||
genksyms_usage();
|
||||
return 0;
|
||||
case 'R':
|
||||
flag_rel_crcs = 1;
|
||||
break;
|
||||
default:
|
||||
genksyms_usage();
|
||||
return 1;
|
||||
|
40
scripts/install.sh
Executable file
40
scripts/install.sh
Executable file
@ -0,0 +1,40 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
#
|
||||
# Copyright (C) 1995 by Linus Torvalds
|
||||
#
|
||||
# Adapted from code in arch/i386/boot/Makefile by H. Peter Anvin
|
||||
# Common code factored out by Masahiro Yamada
|
||||
|
||||
set -e
|
||||
|
||||
# Make sure the files actually exist
|
||||
for file in "${KBUILD_IMAGE}" System.map
|
||||
do
|
||||
if [ ! -f "${file}" ]; then
|
||||
echo >&2
|
||||
echo >&2 " *** Missing file: ${file}"
|
||||
echo >&2 ' *** You need to run "make" before "make install".'
|
||||
echo >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
# User/arch may have a custom install script
|
||||
for file in "${HOME}/bin/${INSTALLKERNEL}" \
|
||||
"/sbin/${INSTALLKERNEL}" \
|
||||
"${srctree}/arch/${SRCARCH}/install.sh" \
|
||||
"${srctree}/arch/${SRCARCH}/boot/install.sh"
|
||||
do
|
||||
if [ ! -x "${file}" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
# installkernel(8) says the parameters are like follows:
|
||||
#
|
||||
# installkernel version zImage System.map [directory]
|
||||
exec "${file}" "${KERNELRELEASE}" "${KBUILD_IMAGE}" System.map "${INSTALL_PATH}"
|
||||
done
|
||||
|
||||
echo "No install script found" >&2
|
||||
exit 1
|
@ -3,14 +3,14 @@
|
||||
|
||||
PKG="gtk+-2.0 gmodule-2.0 libglade-2.0"
|
||||
|
||||
if [ -z "$(command -v pkg-config)" ]; then
|
||||
if [ -z "$(command -v ${HOSTPKG_CONFIG})" ]; then
|
||||
echo >&2 "*"
|
||||
echo >&2 "* 'make gconfig' requires 'pkg-config'. Please install it."
|
||||
echo >&2 "* 'make gconfig' requires '${HOSTPKG_CONFIG}'. Please install it."
|
||||
echo >&2 "*"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! pkg-config --exists $PKG; then
|
||||
if ! ${HOSTPKG_CONFIG} --exists $PKG; then
|
||||
echo >&2 "*"
|
||||
echo >&2 "* Unable to find the GTK+ installation. Please make sure that"
|
||||
echo >&2 "* the GTK+ 2.0 development package is correctly installed."
|
||||
@ -19,12 +19,12 @@ if ! pkg-config --exists $PKG; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! pkg-config --atleast-version=2.0.0 gtk+-2.0; then
|
||||
if ! ${HOSTPKG_CONFIG} --atleast-version=2.0.0 gtk+-2.0; then
|
||||
echo >&2 "*"
|
||||
echo >&2 "* GTK+ is present but version >= 2.0.0 is required."
|
||||
echo >&2 "*"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo cflags=\"$(pkg-config --cflags $PKG)\"
|
||||
echo libs=\"$(pkg-config --libs $PKG)\"
|
||||
echo cflags=\"$(${HOSTPKG_CONFIG} --cflags $PKG)\"
|
||||
echo libs=\"$(${HOSTPKG_CONFIG} --libs $PKG)\"
|
||||
|
@ -4,16 +4,16 @@
|
||||
PKG="ncursesw"
|
||||
PKG2="ncurses"
|
||||
|
||||
if [ -n "$(command -v pkg-config)" ]; then
|
||||
if pkg-config --exists $PKG; then
|
||||
echo cflags=\"$(pkg-config --cflags $PKG)\"
|
||||
echo libs=\"$(pkg-config --libs $PKG)\"
|
||||
if [ -n "$(command -v ${HOSTPKG_CONFIG})" ]; then
|
||||
if ${HOSTPKG_CONFIG} --exists $PKG; then
|
||||
echo cflags=\"$(${HOSTPKG_CONFIG} --cflags $PKG)\"
|
||||
echo libs=\"$(${HOSTPKG_CONFIG} --libs $PKG)\"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if pkg-config --exists $PKG2; then
|
||||
echo cflags=\"$(pkg-config --cflags $PKG2)\"
|
||||
echo libs=\"$(pkg-config --libs $PKG2)\"
|
||||
if ${HOSTPKG_CONFIG} --exists $PKG2; then
|
||||
echo cflags=\"$(${HOSTPKG_CONFIG} --cflags $PKG2)\"
|
||||
echo libs=\"$(${HOSTPKG_CONFIG} --libs $PKG2)\"
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
@ -46,7 +46,7 @@ echo >&2 "* Unable to find the ncurses package."
|
||||
echo >&2 "* Install ncurses (ncurses-devel or libncurses-dev"
|
||||
echo >&2 "* depending on your distribution)."
|
||||
echo >&2 "*"
|
||||
echo >&2 "* You may also need to install pkg-config to find the"
|
||||
echo >&2 "* You may also need to install ${HOSTPKG_CONFIG} to find the"
|
||||
echo >&2 "* ncurses installed in a non-default location."
|
||||
echo >&2 "*"
|
||||
exit 1
|
||||
|
@ -4,16 +4,16 @@
|
||||
PKG="ncursesw menuw panelw"
|
||||
PKG2="ncurses menu panel"
|
||||
|
||||
if [ -n "$(command -v pkg-config)" ]; then
|
||||
if pkg-config --exists $PKG; then
|
||||
echo cflags=\"$(pkg-config --cflags $PKG)\"
|
||||
echo libs=\"$(pkg-config --libs $PKG)\"
|
||||
if [ -n "$(command -v ${HOSTPKG_CONFIG})" ]; then
|
||||
if ${HOSTPKG_CONFIG} --exists $PKG; then
|
||||
echo cflags=\"$(${HOSTPKG_CONFIG} --cflags $PKG)\"
|
||||
echo libs=\"$(${HOSTPKG_CONFIG} --libs $PKG)\"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if pkg-config --exists $PKG2; then
|
||||
echo cflags=\"$(pkg-config --cflags $PKG2)\"
|
||||
echo libs=\"$(pkg-config --libs $PKG2)\"
|
||||
if ${HOSTPKG_CONFIG} --exists $PKG2; then
|
||||
echo cflags=\"$(${HOSTPKG_CONFIG} --cflags $PKG2)\"
|
||||
echo libs=\"$(${HOSTPKG_CONFIG} --libs $PKG2)\"
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
@ -44,7 +44,7 @@ echo >&2 "* Unable to find the ncurses package."
|
||||
echo >&2 "* Install ncurses (ncurses-devel or libncurses-dev"
|
||||
echo >&2 "* depending on your distribution)."
|
||||
echo >&2 "*"
|
||||
echo >&2 "* You may also need to install pkg-config to find the"
|
||||
echo >&2 "* You may also need to install ${HOSTPKG_CONFIG} to find the"
|
||||
echo >&2 "* ncurses installed in a non-default location."
|
||||
echo >&2 "*"
|
||||
exit 1
|
||||
|
@ -3,22 +3,22 @@
|
||||
|
||||
PKG="Qt5Core Qt5Gui Qt5Widgets"
|
||||
|
||||
if [ -z "$(command -v pkg-config)" ]; then
|
||||
if [ -z "$(command -v ${HOSTPKG_CONFIG})" ]; then
|
||||
echo >&2 "*"
|
||||
echo >&2 "* 'make xconfig' requires 'pkg-config'. Please install it."
|
||||
echo >&2 "* 'make xconfig' requires '${HOSTPKG_CONFIG}'. Please install it."
|
||||
echo >&2 "*"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if pkg-config --exists $PKG; then
|
||||
echo cflags=\"-std=c++11 -fPIC $(pkg-config --cflags $PKG)\"
|
||||
echo libs=\"$(pkg-config --libs $PKG)\"
|
||||
echo moc=\"$(pkg-config --variable=host_bins Qt5Core)/moc\"
|
||||
if ${HOSTPKG_CONFIG} --exists $PKG; then
|
||||
echo cflags=\"-std=c++11 -fPIC $(${HOSTPKG_CONFIG} --cflags $PKG)\"
|
||||
echo libs=\"$(${HOSTPKG_CONFIG} --libs $PKG)\"
|
||||
echo moc=\"$(${HOSTPKG_CONFIG} --variable=host_bins Qt5Core)/moc\"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo >&2 "*"
|
||||
echo >&2 "* Could not find Qt5 via pkg-config."
|
||||
echo >&2 "* Could not find Qt5 via ${HOSTPKG_CONFIG}."
|
||||
echo >&2 "* Please install Qt5 and make sure it's in PKG_CONFIG_PATH"
|
||||
echo >&2 "*"
|
||||
exit 1
|
||||
|
@ -56,20 +56,6 @@ gen_initcalls()
|
||||
> .tmp_initcalls.lds
|
||||
}
|
||||
|
||||
# If CONFIG_LTO_CLANG is selected, collect generated symbol versions into
|
||||
# .tmp_symversions.lds
|
||||
gen_symversions()
|
||||
{
|
||||
info GEN .tmp_symversions.lds
|
||||
rm -f .tmp_symversions.lds
|
||||
|
||||
for o in ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS}; do
|
||||
if [ -f ${o}.symversions ]; then
|
||||
cat ${o}.symversions >> .tmp_symversions.lds
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Link of vmlinux.o used for section mismatch analysis
|
||||
# ${1} output file
|
||||
modpost_link()
|
||||
@ -88,11 +74,6 @@ modpost_link()
|
||||
gen_initcalls
|
||||
lds="-T .tmp_initcalls.lds"
|
||||
|
||||
if is_enabled CONFIG_MODVERSIONS; then
|
||||
gen_symversions
|
||||
lds="${lds} -T .tmp_symversions.lds"
|
||||
fi
|
||||
|
||||
# This might take a while, so indicate that we're doing
|
||||
# an LTO link
|
||||
info LTO ${1}
|
||||
@ -199,6 +180,10 @@ vmlinux_link()
|
||||
libs="${KBUILD_VMLINUX_LIBS}"
|
||||
fi
|
||||
|
||||
if is_enabled CONFIG_MODULES; then
|
||||
objs="${objs} .vmlinux.export.o"
|
||||
fi
|
||||
|
||||
if [ "${SRCARCH}" = "um" ]; then
|
||||
wl=-Wl,
|
||||
ld="${CC}"
|
||||
@ -320,13 +305,14 @@ cleanup()
|
||||
rm -f .btf.*
|
||||
rm -f .tmp_System.map
|
||||
rm -f .tmp_initcalls.lds
|
||||
rm -f .tmp_symversions.lds
|
||||
rm -f .tmp_vmlinux*
|
||||
rm -f System.map
|
||||
rm -f vmlinux
|
||||
rm -f vmlinux.map
|
||||
rm -f vmlinux.o
|
||||
rm -f .vmlinux.d
|
||||
rm -f .vmlinux.objs
|
||||
rm -f .vmlinux.export.c
|
||||
}
|
||||
|
||||
# Use "make V=1" to debug this script
|
||||
@ -358,6 +344,16 @@ ${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init need-builtin=1
|
||||
modpost_link vmlinux.o
|
||||
objtool_link vmlinux.o
|
||||
|
||||
# Generate the list of objects in vmlinux
|
||||
for f in ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS}; do
|
||||
case ${f} in
|
||||
*.a)
|
||||
${AR} t ${f} ;;
|
||||
*)
|
||||
echo ${f} ;;
|
||||
esac
|
||||
done > .vmlinux.objs
|
||||
|
||||
# modpost vmlinux.o to check for section mismatches
|
||||
${MAKE} -f "${srctree}/scripts/Makefile.modpost" MODPOST_VMLINUX=1
|
||||
|
||||
@ -368,6 +364,10 @@ info GEN modules.builtin
|
||||
tr '\0' '\n' < modules.builtin.modinfo | sed -n 's/^[[:alnum:]:_]*\.file=//p' |
|
||||
tr ' ' '\n' | uniq | sed -e 's:^:kernel/:' -e 's/$/.ko/' > modules.builtin
|
||||
|
||||
if is_enabled CONFIG_MODULES; then
|
||||
${MAKE} -f "${srctree}/scripts/Makefile.vmlinux" .vmlinux.export.o
|
||||
fi
|
||||
|
||||
btf_vmlinux_bin_o=""
|
||||
if is_enabled CONFIG_DEBUG_INFO_BTF; then
|
||||
btf_vmlinux_bin_o=.btf.vmlinux.bin.o
|
||||
|
213
scripts/mod/list.h
Normal file
213
scripts/mod/list.h
Normal file
@ -0,0 +1,213 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef LIST_H
|
||||
#define LIST_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
|
||||
/* Are two types/vars the same type (ignoring qualifiers)? */
|
||||
#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
|
||||
|
||||
/**
|
||||
* container_of - cast a member of a structure out to the containing structure
|
||||
* @ptr: the pointer to the member.
|
||||
* @type: the type of the container struct this is embedded in.
|
||||
* @member: the name of the member within the struct.
|
||||
*
|
||||
*/
|
||||
#define container_of(ptr, type, member) ({ \
|
||||
void *__mptr = (void *)(ptr); \
|
||||
_Static_assert(__same_type(*(ptr), ((type *)0)->member) || \
|
||||
__same_type(*(ptr), void), \
|
||||
"pointer type mismatch in container_of()"); \
|
||||
((type *)(__mptr - offsetof(type, member))); })
|
||||
|
||||
#define LIST_POISON1 ((void *) 0x100)
|
||||
#define LIST_POISON2 ((void *) 0x122)
|
||||
|
||||
/*
|
||||
* Circular doubly linked list implementation.
|
||||
*
|
||||
* Some of the internal functions ("__xxx") are useful when
|
||||
* manipulating whole lists rather than single entries, as
|
||||
* sometimes we already know the next/prev entries and we can
|
||||
* generate better code by using them directly rather than
|
||||
* using the generic single-entry routines.
|
||||
*/
|
||||
|
||||
struct list_head {
|
||||
struct list_head *next, *prev;
|
||||
};
|
||||
|
||||
#define LIST_HEAD_INIT(name) { &(name), &(name) }
|
||||
|
||||
#define LIST_HEAD(name) \
|
||||
struct list_head name = LIST_HEAD_INIT(name)
|
||||
|
||||
/**
|
||||
* INIT_LIST_HEAD - Initialize a list_head structure
|
||||
* @list: list_head structure to be initialized.
|
||||
*
|
||||
* Initializes the list_head to point to itself. If it is a list header,
|
||||
* the result is an empty list.
|
||||
*/
|
||||
static inline void INIT_LIST_HEAD(struct list_head *list)
|
||||
{
|
||||
list->next = list;
|
||||
list->prev = list;
|
||||
}
|
||||
|
||||
/*
|
||||
* Insert a new entry between two known consecutive entries.
|
||||
*
|
||||
* This is only for internal list manipulation where we know
|
||||
* the prev/next entries already!
|
||||
*/
|
||||
static inline void __list_add(struct list_head *new,
|
||||
struct list_head *prev,
|
||||
struct list_head *next)
|
||||
{
|
||||
next->prev = new;
|
||||
new->next = next;
|
||||
new->prev = prev;
|
||||
prev->next = new;
|
||||
}
|
||||
|
||||
/**
|
||||
* list_add - add a new entry
|
||||
* @new: new entry to be added
|
||||
* @head: list head to add it after
|
||||
*
|
||||
* Insert a new entry after the specified head.
|
||||
* This is good for implementing stacks.
|
||||
*/
|
||||
static inline void list_add(struct list_head *new, struct list_head *head)
|
||||
{
|
||||
__list_add(new, head, head->next);
|
||||
}
|
||||
|
||||
/**
|
||||
* list_add_tail - add a new entry
|
||||
* @new: new entry to be added
|
||||
* @head: list head to add it before
|
||||
*
|
||||
* Insert a new entry before the specified head.
|
||||
* This is useful for implementing queues.
|
||||
*/
|
||||
static inline void list_add_tail(struct list_head *new, struct list_head *head)
|
||||
{
|
||||
__list_add(new, head->prev, head);
|
||||
}
|
||||
|
||||
/*
|
||||
* Delete a list entry by making the prev/next entries
|
||||
* point to each other.
|
||||
*
|
||||
* This is only for internal list manipulation where we know
|
||||
* the prev/next entries already!
|
||||
*/
|
||||
static inline void __list_del(struct list_head *prev, struct list_head *next)
|
||||
{
|
||||
next->prev = prev;
|
||||
prev->next = next;
|
||||
}
|
||||
|
||||
static inline void __list_del_entry(struct list_head *entry)
|
||||
{
|
||||
__list_del(entry->prev, entry->next);
|
||||
}
|
||||
|
||||
/**
|
||||
* list_del - deletes entry from list.
|
||||
* @entry: the element to delete from the list.
|
||||
* Note: list_empty() on entry does not return true after this, the entry is
|
||||
* in an undefined state.
|
||||
*/
|
||||
static inline void list_del(struct list_head *entry)
|
||||
{
|
||||
__list_del_entry(entry);
|
||||
entry->next = LIST_POISON1;
|
||||
entry->prev = LIST_POISON2;
|
||||
}
|
||||
|
||||
/**
|
||||
* list_is_head - tests whether @list is the list @head
|
||||
* @list: the entry to test
|
||||
* @head: the head of the list
|
||||
*/
|
||||
static inline int list_is_head(const struct list_head *list, const struct list_head *head)
|
||||
{
|
||||
return list == head;
|
||||
}
|
||||
|
||||
/**
|
||||
* list_empty - tests whether a list is empty
|
||||
* @head: the list to test.
|
||||
*/
|
||||
static inline int list_empty(const struct list_head *head)
|
||||
{
|
||||
return head->next == head;
|
||||
}
|
||||
|
||||
/**
|
||||
* list_entry - get the struct for this entry
|
||||
* @ptr: the &struct list_head pointer.
|
||||
* @type: the type of the struct this is embedded in.
|
||||
* @member: the name of the list_head within the struct.
|
||||
*/
|
||||
#define list_entry(ptr, type, member) \
|
||||
container_of(ptr, type, member)
|
||||
|
||||
/**
|
||||
* list_first_entry - get the first element from a list
|
||||
* @ptr: the list head to take the element from.
|
||||
* @type: the type of the struct this is embedded in.
|
||||
* @member: the name of the list_head within the struct.
|
||||
*
|
||||
* Note, that list is expected to be not empty.
|
||||
*/
|
||||
#define list_first_entry(ptr, type, member) \
|
||||
list_entry((ptr)->next, type, member)
|
||||
|
||||
/**
|
||||
* list_next_entry - get the next element in list
|
||||
* @pos: the type * to cursor
|
||||
* @member: the name of the list_head within the struct.
|
||||
*/
|
||||
#define list_next_entry(pos, member) \
|
||||
list_entry((pos)->member.next, typeof(*(pos)), member)
|
||||
|
||||
/**
|
||||
* list_entry_is_head - test if the entry points to the head of the list
|
||||
* @pos: the type * to cursor
|
||||
* @head: the head for your list.
|
||||
* @member: the name of the list_head within the struct.
|
||||
*/
|
||||
#define list_entry_is_head(pos, head, member) \
|
||||
(&pos->member == (head))
|
||||
|
||||
/**
|
||||
* list_for_each_entry - iterate over list of given type
|
||||
* @pos: the type * to use as a loop cursor.
|
||||
* @head: the head for your list.
|
||||
* @member: the name of the list_head within the struct.
|
||||
*/
|
||||
#define list_for_each_entry(pos, head, member) \
|
||||
for (pos = list_first_entry(head, typeof(*pos), member); \
|
||||
!list_entry_is_head(pos, head, member); \
|
||||
pos = list_next_entry(pos, member))
|
||||
|
||||
/**
|
||||
* list_for_each_entry_safe - iterate over list of given type. Safe against removal of list entry
|
||||
* @pos: the type * to use as a loop cursor.
|
||||
* @n: another type * to use as temporary storage
|
||||
* @head: the head for your list.
|
||||
* @member: the name of the list_head within the struct.
|
||||
*/
|
||||
#define list_for_each_entry_safe(pos, n, head, member) \
|
||||
for (pos = list_first_entry(head, typeof(*pos), member), \
|
||||
n = list_next_entry(pos, member); \
|
||||
!list_entry_is_head(pos, head, member); \
|
||||
pos = n, n = list_next_entry(n, member))
|
||||
|
||||
#endif /* LIST_H */
|
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,5 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
@ -10,6 +11,7 @@
|
||||
#include <unistd.h>
|
||||
#include <elf.h>
|
||||
|
||||
#include "list.h"
|
||||
#include "elfconfig.h"
|
||||
|
||||
/* On BSD-alike OSes elf.h defines these according to host's word size */
|
||||
@ -109,26 +111,22 @@ buf_printf(struct buffer *buf, const char *fmt, ...);
|
||||
void
|
||||
buf_write(struct buffer *buf, const char *s, int len);
|
||||
|
||||
struct namespace_list {
|
||||
struct namespace_list *next;
|
||||
char namespace[];
|
||||
};
|
||||
|
||||
struct module {
|
||||
struct module *next;
|
||||
int gpl_compatible;
|
||||
struct symbol *unres;
|
||||
int from_dump; /* 1 if module was loaded from *.symvers */
|
||||
int is_vmlinux;
|
||||
int seen;
|
||||
int has_init;
|
||||
int has_cleanup;
|
||||
struct list_head list;
|
||||
struct list_head exported_symbols;
|
||||
struct list_head unresolved_symbols;
|
||||
bool is_gpl_compatible;
|
||||
bool from_dump; /* true if module was loaded from *.symvers */
|
||||
bool is_vmlinux;
|
||||
bool seen;
|
||||
bool has_init;
|
||||
bool has_cleanup;
|
||||
struct buffer dev_table_buf;
|
||||
char srcversion[25];
|
||||
// Missing namespace dependencies
|
||||
struct namespace_list *missing_namespaces;
|
||||
struct list_head missing_namespaces;
|
||||
// Actual imported namespaces
|
||||
struct namespace_list *imported_namespaces;
|
||||
struct list_head imported_namespaces;
|
||||
char name[];
|
||||
};
|
||||
|
||||
@ -138,8 +136,6 @@ struct elf_info {
|
||||
Elf_Shdr *sechdrs;
|
||||
Elf_Sym *symtab_start;
|
||||
Elf_Sym *symtab_stop;
|
||||
Elf_Section export_sec;
|
||||
Elf_Section export_gpl_sec;
|
||||
char *strtab;
|
||||
char *modinfo;
|
||||
unsigned int modinfo_len;
|
||||
@ -178,7 +174,6 @@ static inline unsigned int get_secindex(const struct elf_info *info,
|
||||
}
|
||||
|
||||
/* file2alias.c */
|
||||
extern unsigned int cross_build;
|
||||
void handle_moddevtable(struct module *mod, struct elf_info *info,
|
||||
Elf_Sym *sym, const char *symname);
|
||||
void add_moddevtable(struct buffer *buf, struct module *mod);
|
||||
|
@ -290,13 +290,11 @@ static int parse_file(const char *fname, struct md4_ctx *md)
|
||||
return 1;
|
||||
}
|
||||
/* Check whether the file is a static library or not */
|
||||
static int is_static_library(const char *objfile)
|
||||
static bool is_static_library(const char *objfile)
|
||||
{
|
||||
int len = strlen(objfile);
|
||||
if (objfile[len - 2] == '.' && objfile[len - 1] == 'a')
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
|
||||
return objfile[len - 2] == '.' && objfile[len - 1] == 'a';
|
||||
}
|
||||
|
||||
/* We have dir/file.o. Open dir/.file.o.cmd, look for source_ and deps_ line
|
||||
@ -387,7 +385,7 @@ out_file:
|
||||
/* Calc and record src checksum. */
|
||||
void get_src_version(const char *modname, char sum[], unsigned sumlen)
|
||||
{
|
||||
char *buf, *pos, *firstline;
|
||||
char *buf;
|
||||
struct md4_ctx md;
|
||||
char *fname;
|
||||
char filelist[PATH_MAX + 1];
|
||||
@ -397,15 +395,8 @@ void get_src_version(const char *modname, char sum[], unsigned sumlen)
|
||||
|
||||
buf = read_text_file(filelist);
|
||||
|
||||
pos = buf;
|
||||
firstline = get_line(&pos);
|
||||
if (!firstline) {
|
||||
warn("bad ending versions file for %s\n", modname);
|
||||
goto free;
|
||||
}
|
||||
|
||||
md4_init(&md);
|
||||
while ((fname = strsep(&firstline, " "))) {
|
||||
while ((fname = strsep(&buf, "\n"))) {
|
||||
if (!*fname)
|
||||
continue;
|
||||
if (!(is_static_library(fname)) &&
|
||||
|
@ -16,6 +16,10 @@ do
|
||||
rm -f "/boot/initramfs-$f.img" "/boot/System.map-$f"
|
||||
rm -f "/boot/vmlinuz-$f" "/boot/config-$f"
|
||||
rm -rf "/lib/modules/$f"
|
||||
new-kernel-pkg --remove $f
|
||||
if [ -x "$(command -v new-kernel-pkg)" ]; then
|
||||
new-kernel-pkg --remove $f
|
||||
elif [ -x "$(command -v kernel-install)" ]; then
|
||||
kernel-install remove $f
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
@ -19,8 +19,8 @@ LIBSUBCMD = $(LIBSUBCMD_OUTPUT)libsubcmd.a
|
||||
OBJTOOL := $(OUTPUT)objtool
|
||||
OBJTOOL_IN := $(OBJTOOL)-in.o
|
||||
|
||||
LIBELF_FLAGS := $(shell pkg-config libelf --cflags 2>/dev/null)
|
||||
LIBELF_LIBS := $(shell pkg-config libelf --libs 2>/dev/null || echo -lelf)
|
||||
LIBELF_FLAGS := $(shell $(HOSTPKG_CONFIG) libelf --cflags 2>/dev/null)
|
||||
LIBELF_LIBS := $(shell $(HOSTPKG_CONFIG) libelf --libs 2>/dev/null || echo -lelf)
|
||||
|
||||
all: $(OBJTOOL)
|
||||
|
||||
|
@ -82,7 +82,7 @@ always-y := $(patsubst $(obj)/%.h,%.hdrtest, $(shell find $(obj) -name '*.h' 2>/
|
||||
# Include the header twice to detect missing include guard.
|
||||
quiet_cmd_hdrtest = HDRTEST $<
|
||||
cmd_hdrtest = \
|
||||
$(CC) $(c_flags) -S -o /dev/null -x c /dev/null \
|
||||
$(CC) $(c_flags) -fsyntax-only -x c /dev/null \
|
||||
$(if $(filter-out $(no-header-test), $*.h), -include $< -include $<); \
|
||||
$(PERL) $(srctree)/$(src)/headers_check.pl $(obj) $(SRCARCH) $<; \
|
||||
touch $@
|
||||
|
Loading…
Reference in New Issue
Block a user