forked from Minki/linux
Kbuild updates for v5.8
- fix warnings in 'make clean' for ARCH=um, hexagon, h8300, unicore32 - ensure to rebuild all objects when the compiler is upgraded - exclude system headers from dependency tracking and fixdep processing - fix potential bit-size mismatch between the kernel and BPF user-mode helper - add the new syntax 'userprogs' to build user-space programs for the target architecture (the same arch as the kernel) - compile user-space sample code under samples/ for the target arch instead of the host arch - make headers_install fail if a CONFIG option is leaked to user-space - sanitize the output format of scripts/checkstack.pl - handle ARM 'push' instruction in scripts/checkstack.pl - error out before modpost if a module name conflict is found - error out when multiple directories are passed to M= because this feature is broken for a long time - add CONFIG_DEBUG_INFO_COMPRESSED to support compressed debug info - a lot of cleanups of modpost - dump vmlinux symbols out into vmlinux.symvers, and reuse it in the second pass of modpost - do not run the second pass of modpost if nothing in modules is updated - install modules.builtin(.modinfo) by 'make install' as well as by 'make modules_install' because it is useful even when CONFIG_MODULES=n - add new command line variables, GZIP, BZIP2, LZOP, LZMA, LZ4, and XZ to allow users to use alternatives such as pigz, pbzip2, etc. -----BEGIN PGP SIGNATURE----- iQJJBAABCgAzFiEEbmPs18K1szRHjPqEPYsBB53g2wYFAl7brm0VHG1hc2FoaXJv eUBrZXJuZWwub3JnAAoJED2LAQed4NsGjeEP/Rrf8H9cp/Tq+ALQCBycI3W5ZEHg n2EqprZkVP2MlOV0d+8b9t4PdZf6E5Wmfv26sMaBAhl6X1KQI/0NgPMnTINvy5jJ Q2SMhj9y8Gwr3XKFu9Hd/0U+Sax5rz+LmY84tdF95dXzPIUWjAEVnbmN+ofY6T++ sNf2YGNFSR6iiqr3uCYA0hHZmpKlfhVgDPAdncWa5aadSsuQb79nZQWefGeVEsuD HrISpwnkhBc0qY1xyWry6agE92xWmkNkdjKq6A7peguZL02XySWLRWjyHoiiaPOB 6U4urKs/NSXqPgxGxwZthhwERHryC3+g4s8wRBDKE6ISRWKBBA2ruHpgdF5h/utu re1ZP2qRcAt8NBFynr4MEb2AU0mYkv7iEgfLJ7NUCRlMOtqrn5RFwnS4r8ReyQp5 1UM11RbPhYgYjM5g9hBHJ7nK944/kfvy1/4jF4I1+M5O7QL6f00pu3r2bBIa/65g DWrNOpIliKG27GgnRlxi7HgLfxs9etFcXTpHO0ymgnMmlz+7FQsdceR9qqybGU9o yBWw6zculMQjb3E+k0DTnE5kLWsycbua921wxM9ABSxRmJi7WciNF73RdLUIBoAY VUbwrP2aIpdL+2uyX6RqdTaWzEBpW8omszr46aQ96pX+RiqMrPvJRLaA/tr3ZH8g tdHenJPWdHSaOcO4 =GKe5 -----END PGP SIGNATURE----- Merge tag 'kbuild-v5.8' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild Pull Kbuild updates from Masahiro Yamada: - fix warnings in 'make clean' for ARCH=um, hexagon, h8300, unicore32 - ensure to rebuild all objects when the compiler is upgraded - exclude system headers from dependency tracking and fixdep processing - fix potential bit-size mismatch between the kernel and BPF user-mode helper - add the new syntax 'userprogs' to build user-space programs for the target architecture (the same arch as the kernel) - compile user-space sample code under samples/ for the target arch instead of the host arch - make headers_install fail if a CONFIG option is leaked to user-space - sanitize the output format of scripts/checkstack.pl - handle ARM 'push' instruction in scripts/checkstack.pl - error out before modpost if a module name conflict is found - error out when multiple directories are passed to M= because this feature is broken for a long time - add CONFIG_DEBUG_INFO_COMPRESSED to support compressed debug info - a lot of cleanups of modpost - dump vmlinux symbols out into vmlinux.symvers, and reuse it in the second pass of modpost - do not run the second pass of modpost if nothing in modules is updated - install modules.builtin(.modinfo) by 'make install' as well as by 'make modules_install' because it is useful even when CONFIG_MODULES=n - add new command line variables, GZIP, BZIP2, LZOP, LZMA, LZ4, and XZ to allow users to use alternatives such as pigz, pbzip2, etc. * tag 'kbuild-v5.8' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild: (96 commits) kbuild: add variables for compression tools Makefile: install modules.builtin even if CONFIG_MODULES=n mksysmap: Fix the mismatch of '.L' symbols in System.map kbuild: doc: rename LDFLAGS to KBUILD_LDFLAGS modpost: change elf_info->size to size_t modpost: remove is_vmlinux() helper modpost: strip .o from modname before calling new_module() modpost: set have_vmlinux in new_module() modpost: remove mod->skip struct member modpost: add mod->is_vmlinux struct member modpost: remove is_vmlinux() call in check_for_{gpl_usage,unused}() modpost: remove mod->is_dot_o struct member modpost: move -d option in scripts/Makefile.modpost modpost: remove -s option modpost: remove get_next_text() and make {grab,release_}file static modpost: use read_text_file() and get_line() for reading text files modpost: avoid false-positive file open error modpost: fix potential mmap'ed file overrun in get_src_version() modpost: add read_text_file() and get_line() helpers modpost: do not call get_modinfo() for vmlinux(.o) ...
This commit is contained in:
commit
cff11abeca
1
.gitignore
vendored
1
.gitignore
vendored
@ -56,6 +56,7 @@ modules.order
|
||||
/linux
|
||||
/vmlinux
|
||||
/vmlinux.32
|
||||
/vmlinux.symvers
|
||||
/vmlinux-gdb.py
|
||||
/vmlinuz
|
||||
/System.map
|
||||
|
@ -251,6 +251,7 @@ vmlinux-*
|
||||
vmlinux.aout
|
||||
vmlinux.bin.all
|
||||
vmlinux.lds
|
||||
vmlinux.symvers
|
||||
vmlinuz
|
||||
voffset.h
|
||||
vsyscall.lds
|
||||
|
@ -29,31 +29,37 @@ This document describes the Linux kernel Makefiles.
|
||||
--- 4.4 Controlling compiler options for host programs
|
||||
--- 4.5 When host programs are actually built
|
||||
|
||||
=== 5 Kbuild clean infrastructure
|
||||
=== 5 Userspace Program support
|
||||
--- 5.1 Simple Userspace Program
|
||||
--- 5.2 Composite Userspace Programs
|
||||
--- 5.3 Controlling compiler options for userspace programs
|
||||
--- 5.4 When userspace programs are actually built
|
||||
|
||||
=== 6 Architecture Makefiles
|
||||
--- 6.1 Set variables to tweak the build to the architecture
|
||||
--- 6.2 Add prerequisites to archheaders:
|
||||
--- 6.3 Add prerequisites to archprepare:
|
||||
--- 6.4 List directories to visit when descending
|
||||
--- 6.5 Architecture-specific boot images
|
||||
--- 6.6 Building non-kbuild targets
|
||||
--- 6.7 Commands useful for building a boot image
|
||||
--- 6.8 Custom kbuild commands
|
||||
--- 6.9 Preprocessing linker scripts
|
||||
--- 6.10 Generic header files
|
||||
--- 6.11 Post-link pass
|
||||
=== 6 Kbuild clean infrastructure
|
||||
|
||||
=== 7 Kbuild syntax for exported headers
|
||||
--- 7.1 no-export-headers
|
||||
--- 7.2 generic-y
|
||||
--- 7.3 generated-y
|
||||
--- 7.4 mandatory-y
|
||||
=== 7 Architecture Makefiles
|
||||
--- 7.1 Set variables to tweak the build to the architecture
|
||||
--- 7.2 Add prerequisites to archheaders:
|
||||
--- 7.3 Add prerequisites to archprepare:
|
||||
--- 7.4 List directories to visit when descending
|
||||
--- 7.5 Architecture-specific boot images
|
||||
--- 7.6 Building non-kbuild targets
|
||||
--- 7.7 Commands useful for building a boot image
|
||||
--- 7.8 Custom kbuild commands
|
||||
--- 7.9 Preprocessing linker scripts
|
||||
--- 7.10 Generic header files
|
||||
--- 7.11 Post-link pass
|
||||
|
||||
=== 8 Kbuild Variables
|
||||
=== 9 Makefile language
|
||||
=== 10 Credits
|
||||
=== 11 TODO
|
||||
=== 8 Kbuild syntax for exported headers
|
||||
--- 8.1 no-export-headers
|
||||
--- 8.2 generic-y
|
||||
--- 8.3 generated-y
|
||||
--- 8.4 mandatory-y
|
||||
|
||||
=== 9 Kbuild Variables
|
||||
=== 10 Makefile language
|
||||
=== 11 Credits
|
||||
=== 12 TODO
|
||||
|
||||
1 Overview
|
||||
==========
|
||||
@ -732,7 +738,88 @@ Both possibilities are described in the following.
|
||||
This will tell kbuild to build lxdialog even if not referenced in
|
||||
any rule.
|
||||
|
||||
5 Kbuild clean infrastructure
|
||||
5 Userspace Program support
|
||||
===========================
|
||||
|
||||
Just like host programs, Kbuild also supports building userspace executables
|
||||
for the target architecture (i.e. the same architecture as you are building
|
||||
the kernel for).
|
||||
|
||||
The syntax is quite similar. The difference is to use "userprogs" instead of
|
||||
"hostprogs".
|
||||
|
||||
5.1 Simple Userspace Program
|
||||
----------------------------
|
||||
|
||||
The following line tells kbuild that the program bpf-direct shall be
|
||||
built for the target architecture.
|
||||
|
||||
Example::
|
||||
|
||||
userprogs := bpf-direct
|
||||
|
||||
Kbuild assumes in the above example that bpf-direct is made from a
|
||||
single C source file named bpf-direct.c located in the same directory
|
||||
as the Makefile.
|
||||
|
||||
5.2 Composite Userspace Programs
|
||||
--------------------------------
|
||||
|
||||
Userspace programs can be made up based on composite objects.
|
||||
The syntax used to define composite objects for userspace programs is
|
||||
similar to the syntax used for kernel objects.
|
||||
$(<executable>-objs) lists all objects used to link the final
|
||||
executable.
|
||||
|
||||
Example::
|
||||
|
||||
#samples/seccomp/Makefile
|
||||
userprogs := bpf-fancy
|
||||
bpf-fancy-objs := bpf-fancy.o bpf-helper.o
|
||||
|
||||
Objects with extension .o are compiled from the corresponding .c
|
||||
files. In the above example, bpf-fancy.c is compiled to bpf-fancy.o
|
||||
and bpf-helper.c is compiled to bpf-helper.o.
|
||||
|
||||
Finally, the two .o files are linked to the executable, bpf-fancy.
|
||||
Note: The syntax <executable>-y is not permitted for userspace programs.
|
||||
|
||||
5.3 Controlling compiler options for userspace programs
|
||||
-------------------------------------------------------
|
||||
|
||||
When compiling userspace programs, it is possible to set specific flags.
|
||||
The programs will always be compiled utilising $(CC) passed
|
||||
the options specified in $(KBUILD_USERCFLAGS).
|
||||
To set flags that will take effect for all userspace programs created
|
||||
in that Makefile, use the variable userccflags.
|
||||
|
||||
Example::
|
||||
|
||||
# samples/seccomp/Makefile
|
||||
userccflags += -I usr/include
|
||||
|
||||
To set specific flags for a single file the following construction
|
||||
is used:
|
||||
|
||||
Example::
|
||||
|
||||
bpf-helper-userccflags += -I user/include
|
||||
|
||||
It is also possible to specify additional options to the linker.
|
||||
|
||||
Example::
|
||||
|
||||
# net/bpfilter/Makefile
|
||||
bpfilter_umh-userldflags += -static
|
||||
|
||||
When linking bpfilter_umh, it will be passed the extra option -static.
|
||||
|
||||
5.4 When userspace programs are actually built
|
||||
----------------------------------------------
|
||||
|
||||
Same as "When host programs are actually built".
|
||||
|
||||
6 Kbuild clean infrastructure
|
||||
=============================
|
||||
|
||||
"make clean" deletes most generated files in the obj tree where the kernel
|
||||
@ -790,7 +877,7 @@ is not operational at that point.
|
||||
Note 2: All directories listed in core-y, libs-y, drivers-y and net-y will
|
||||
be visited during "make clean".
|
||||
|
||||
6 Architecture Makefiles
|
||||
7 Architecture Makefiles
|
||||
========================
|
||||
|
||||
The top level Makefile sets up the environment and does the preparation,
|
||||
@ -820,10 +907,10 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
- Preparing initrd images and the like
|
||||
|
||||
|
||||
6.1 Set variables to tweak the build to the architecture
|
||||
7.1 Set variables to tweak the build to the architecture
|
||||
--------------------------------------------------------
|
||||
|
||||
LDFLAGS
|
||||
KBUILD_LDFLAGS
|
||||
Generic $(LD) options
|
||||
|
||||
Flags used for all invocations of the linker.
|
||||
@ -832,7 +919,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
Example::
|
||||
|
||||
#arch/s390/Makefile
|
||||
LDFLAGS := -m elf_s390
|
||||
KBUILD_LDFLAGS := -m elf_s390
|
||||
|
||||
Note: ldflags-y can be used to further customise
|
||||
the flags used. See chapter 3.7.
|
||||
@ -967,7 +1054,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
KBUILD_VMLINUX_LIBS together specify all the object files used to
|
||||
link vmlinux.
|
||||
|
||||
6.2 Add prerequisites to archheaders
|
||||
7.2 Add prerequisites to archheaders
|
||||
------------------------------------
|
||||
|
||||
The archheaders: rule is used to generate header files that
|
||||
@ -977,7 +1064,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
architecture itself.
|
||||
|
||||
|
||||
6.3 Add prerequisites to archprepare
|
||||
7.3 Add prerequisites to archprepare
|
||||
------------------------------------
|
||||
|
||||
The archprepare: rule is used to list prerequisites that need to be
|
||||
@ -995,7 +1082,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
generating offset header files.
|
||||
|
||||
|
||||
6.4 List directories to visit when descending
|
||||
7.4 List directories to visit when descending
|
||||
---------------------------------------------
|
||||
|
||||
An arch Makefile cooperates with the top Makefile to define variables
|
||||
@ -1030,7 +1117,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
drivers-$(CONFIG_OPROFILE) += arch/sparc64/oprofile/
|
||||
|
||||
|
||||
6.5 Architecture-specific boot images
|
||||
7.5 Architecture-specific boot images
|
||||
-------------------------------------
|
||||
|
||||
An arch Makefile specifies goals that take the vmlinux file, compress
|
||||
@ -1085,7 +1172,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
|
||||
When "make" is executed without arguments, bzImage will be built.
|
||||
|
||||
6.6 Building non-kbuild targets
|
||||
7.6 Building non-kbuild targets
|
||||
-------------------------------
|
||||
|
||||
extra-y
|
||||
@ -1108,7 +1195,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
In this example, extra-y is used to list object files that
|
||||
shall be built, but shall not be linked as part of built-in.a.
|
||||
|
||||
6.7 Commands useful for building a boot image
|
||||
7.7 Commands useful for building a boot image
|
||||
---------------------------------------------
|
||||
|
||||
Kbuild provides a few macros that are useful when building a
|
||||
@ -1211,7 +1298,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
targets += $(dtb-y)
|
||||
DTC_FLAGS ?= -p 1024
|
||||
|
||||
6.8 Custom kbuild commands
|
||||
7.8 Custom kbuild commands
|
||||
--------------------------
|
||||
|
||||
When kbuild is executing with KBUILD_VERBOSE=0, then only a shorthand
|
||||
@ -1241,7 +1328,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
will be displayed with "make KBUILD_VERBOSE=0".
|
||||
|
||||
|
||||
6.9 Preprocessing linker scripts
|
||||
7.9 Preprocessing linker scripts
|
||||
--------------------------------
|
||||
|
||||
When the vmlinux image is built, the linker script
|
||||
@ -1274,7 +1361,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
The kbuild infrastructure for `*lds` files is used in several
|
||||
architecture-specific files.
|
||||
|
||||
6.10 Generic header files
|
||||
7.10 Generic header files
|
||||
-------------------------
|
||||
|
||||
The directory include/asm-generic contains the header files
|
||||
@ -1283,7 +1370,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
to list the file in the Kbuild file.
|
||||
See "7.2 generic-y" for further info on syntax etc.
|
||||
|
||||
6.11 Post-link pass
|
||||
7.11 Post-link pass
|
||||
-------------------
|
||||
|
||||
If the file arch/xxx/Makefile.postlink exists, this makefile
|
||||
@ -1299,7 +1386,7 @@ When kbuild executes, the following steps are followed (roughly):
|
||||
For example, powerpc uses this to check relocation sanity of
|
||||
the linked vmlinux file.
|
||||
|
||||
7 Kbuild syntax for exported headers
|
||||
8 Kbuild syntax for exported headers
|
||||
------------------------------------
|
||||
|
||||
The kernel includes a set of headers that is exported to userspace.
|
||||
@ -1319,14 +1406,14 @@ A Kbuild file may be defined under arch/<arch>/include/uapi/asm/ and
|
||||
arch/<arch>/include/asm/ to list asm files coming from asm-generic.
|
||||
See subsequent chapter for the syntax of the Kbuild file.
|
||||
|
||||
7.1 no-export-headers
|
||||
8.1 no-export-headers
|
||||
---------------------
|
||||
|
||||
no-export-headers is essentially used by include/uapi/linux/Kbuild to
|
||||
avoid exporting specific headers (e.g. kvm.h) on architectures that do
|
||||
not support it. It should be avoided as much as possible.
|
||||
|
||||
7.2 generic-y
|
||||
8.2 generic-y
|
||||
-------------
|
||||
|
||||
If an architecture uses a verbatim copy of a header from
|
||||
@ -1356,7 +1443,7 @@ See subsequent chapter for the syntax of the Kbuild file.
|
||||
|
||||
#include <asm-generic/termios.h>
|
||||
|
||||
7.3 generated-y
|
||||
8.3 generated-y
|
||||
---------------
|
||||
|
||||
If an architecture generates other header files alongside generic-y
|
||||
@ -1370,7 +1457,7 @@ See subsequent chapter for the syntax of the Kbuild file.
|
||||
#arch/x86/include/asm/Kbuild
|
||||
generated-y += syscalls_32.h
|
||||
|
||||
7.4 mandatory-y
|
||||
8.4 mandatory-y
|
||||
---------------
|
||||
|
||||
mandatory-y is essentially used by include/(uapi/)asm-generic/Kbuild
|
||||
@ -1380,7 +1467,7 @@ See subsequent chapter for the syntax of the Kbuild file.
|
||||
in arch/$(ARCH)/include/(uapi/)/asm, Kbuild will automatically generate
|
||||
a wrapper of the asm-generic one.
|
||||
|
||||
8 Kbuild Variables
|
||||
9 Kbuild Variables
|
||||
==================
|
||||
|
||||
The top Makefile exports the following variables:
|
||||
@ -1438,8 +1525,8 @@ The top Makefile exports the following variables:
|
||||
command.
|
||||
|
||||
|
||||
9 Makefile language
|
||||
===================
|
||||
10 Makefile language
|
||||
====================
|
||||
|
||||
The kernel Makefiles are designed to be run with GNU Make. The Makefiles
|
||||
use only the documented features of GNU Make, but they do use many
|
||||
@ -1458,7 +1545,7 @@ time the left-hand side is used.
|
||||
There are some cases where "=" is appropriate. Usually, though, ":="
|
||||
is the right choice.
|
||||
|
||||
10 Credits
|
||||
11 Credits
|
||||
==========
|
||||
|
||||
- Original version made by Michael Elizabeth Chastain, <mailto:mec@shout.net>
|
||||
@ -1466,7 +1553,7 @@ is the right choice.
|
||||
- Updates by Sam Ravnborg <sam@ravnborg.org>
|
||||
- Language QA by Jan Engelhardt <jengelh@gmx.de>
|
||||
|
||||
11 TODO
|
||||
12 TODO
|
||||
=======
|
||||
|
||||
- Describe how kbuild supports shipped files with _shipped.
|
||||
|
@ -528,18 +528,6 @@ build.
|
||||
will then do the expected and compile both modules with
|
||||
full knowledge of symbols from either module.
|
||||
|
||||
Use an extra Module.symvers file
|
||||
When an external module is built, a Module.symvers file
|
||||
is generated containing all exported symbols which are
|
||||
not defined in the kernel. To get access to symbols
|
||||
from bar.ko, copy the Module.symvers file from the
|
||||
compilation of bar.ko to the directory where foo.ko is
|
||||
built. During the module build, kbuild will read the
|
||||
Module.symvers file in the directory of the external
|
||||
module, and when the build is finished, a new
|
||||
Module.symvers file is created containing the sum of
|
||||
all symbols defined and not part of the kernel.
|
||||
|
||||
Use "make" variable KBUILD_EXTRA_SYMBOLS
|
||||
If it is impractical to add a top-level kbuild file,
|
||||
you can assign a space separated list
|
||||
|
2
Kconfig
2
Kconfig
@ -5,8 +5,6 @@
|
||||
#
|
||||
mainmenu "Linux/$(ARCH) $(KERNELVERSION) Kernel Configuration"
|
||||
|
||||
comment "Compiler: $(CC_VERSION_TEXT)"
|
||||
|
||||
source "scripts/Kconfig.include"
|
||||
|
||||
source "init/Kconfig"
|
||||
|
223
Makefile
223
Makefile
@ -11,9 +11,12 @@ NAME = Kleptomaniac Octopus
|
||||
# Comments in this file are targeted only to the developer, do not
|
||||
# expect to learn how to build the kernel reading this file.
|
||||
|
||||
$(if $(filter __%, $(MAKECMDGOALS)), \
|
||||
$(error targets prefixed with '__' are only for internal use))
|
||||
|
||||
# That's our default target when none is given on the command line
|
||||
PHONY := _all
|
||||
_all:
|
||||
PHONY := __all
|
||||
__all:
|
||||
|
||||
# We are using a recursive build, so we need to do a little thinking
|
||||
# to get the ordering right.
|
||||
@ -157,12 +160,14 @@ MAKEFLAGS += --include-dir=$(abs_srctree)
|
||||
need-sub-make := 1
|
||||
endif
|
||||
|
||||
this-makefile := $(lastword $(MAKEFILE_LIST))
|
||||
|
||||
ifneq ($(filter 3.%,$(MAKE_VERSION)),)
|
||||
# 'MAKEFLAGS += -rR' does not immediately become effective for GNU Make 3.x
|
||||
# We need to invoke sub-make to avoid implicit rules in the top Makefile.
|
||||
need-sub-make := 1
|
||||
# Cancel implicit rules for this Makefile.
|
||||
$(lastword $(MAKEFILE_LIST)): ;
|
||||
$(this-makefile): ;
|
||||
endif
|
||||
|
||||
export abs_srctree abs_objtree
|
||||
@ -170,13 +175,13 @@ export sub_make_done := 1
|
||||
|
||||
ifeq ($(need-sub-make),1)
|
||||
|
||||
PHONY += $(MAKECMDGOALS) sub-make
|
||||
PHONY += $(MAKECMDGOALS) __sub-make
|
||||
|
||||
$(filter-out _all sub-make $(lastword $(MAKEFILE_LIST)), $(MAKECMDGOALS)) _all: sub-make
|
||||
$(filter-out $(this-makefile), $(MAKECMDGOALS)) __all: __sub-make
|
||||
@:
|
||||
|
||||
# Invoke a second make in the output directory, passing relevant variables
|
||||
sub-make:
|
||||
__sub-make:
|
||||
$(Q)$(MAKE) -C $(abs_objtree) -f $(abs_srctree)/Makefile $(MAKECMDGOALS)
|
||||
|
||||
endif # need-sub-make
|
||||
@ -213,6 +218,9 @@ ifeq ("$(origin M)", "command line")
|
||||
KBUILD_EXTMOD := $(M)
|
||||
endif
|
||||
|
||||
$(if $(word 2, $(KBUILD_EXTMOD)), \
|
||||
$(error building multiple external modules is not supported))
|
||||
|
||||
export KBUILD_CHECKSRC KBUILD_EXTMOD
|
||||
|
||||
extmod-prefix = $(if $(KBUILD_EXTMOD),$(KBUILD_EXTMOD)/)
|
||||
@ -321,7 +329,7 @@ ifdef mixed-build
|
||||
|
||||
PHONY += $(MAKECMDGOALS) __build_one_by_one
|
||||
|
||||
$(filter-out __build_one_by_one, $(MAKECMDGOALS)): __build_one_by_one
|
||||
$(MAKECMDGOALS): __build_one_by_one
|
||||
@:
|
||||
|
||||
__build_one_by_one:
|
||||
@ -406,9 +414,12 @@ else
|
||||
HOSTCC = gcc
|
||||
HOSTCXX = g++
|
||||
endif
|
||||
KBUILD_HOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 \
|
||||
-fomit-frame-pointer -std=gnu89 $(HOST_LFS_CFLAGS) \
|
||||
$(HOSTCFLAGS)
|
||||
|
||||
export KBUILD_USERCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes \
|
||||
-O2 -fomit-frame-pointer -std=gnu89
|
||||
export KBUILD_USERLDFLAGS :=
|
||||
|
||||
KBUILD_HOSTCFLAGS := $(KBUILD_USERCFLAGS) $(HOST_LFS_CFLAGS) $(HOSTCFLAGS)
|
||||
KBUILD_HOSTCXXFLAGS := -Wall -O2 $(HOST_LFS_CFLAGS) $(HOSTCXXFLAGS)
|
||||
KBUILD_HOSTLDFLAGS := $(HOST_LFS_LDFLAGS) $(HOSTLDFLAGS)
|
||||
KBUILD_HOSTLDLIBS := $(HOST_LFS_LIBS) $(HOSTLDLIBS)
|
||||
@ -447,6 +458,26 @@ PYTHON = python
|
||||
PYTHON3 = python3
|
||||
CHECK = sparse
|
||||
BASH = bash
|
||||
GZIP = gzip
|
||||
BZIP2 = bzip2
|
||||
LZOP = lzop
|
||||
LZMA = lzma
|
||||
LZ4 = lz4c
|
||||
XZ = xz
|
||||
|
||||
# GZIP, BZIP2, LZOP env vars are used by the tools. Support them as the command
|
||||
# line interface, but use _GZIP, _BZIP2, _LZOP internally.
|
||||
_GZIP := $(GZIP)
|
||||
_BZIP2 := $(BZIP2)
|
||||
_LZOP := $(LZOP)
|
||||
|
||||
# Reset GZIP, BZIP2, LZOP in this Makefile
|
||||
override GZIP=
|
||||
override BZIP2=
|
||||
override LZOP=
|
||||
|
||||
# Reset GZIP, BZIP2, LZOP in recursive invocations
|
||||
MAKEOVERRIDES += GZIP= BZIP2= LZOP=
|
||||
|
||||
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
|
||||
-Wbitwise -Wno-return-void -Wno-unknown-attribute $(CF)
|
||||
@ -495,6 +526,7 @@ CLANG_FLAGS :=
|
||||
export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE LD CC
|
||||
export CPP AR NM STRIP OBJCOPY OBJDUMP OBJSIZE READELF PAHOLE LEX YACC AWK INSTALLKERNEL
|
||||
export PERL PYTHON PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX
|
||||
export _GZIP _BZIP2 _LZOP LZMA LZ4 XZ
|
||||
export KBUILD_HOSTCXXFLAGS KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS LDFLAGS_MODULE
|
||||
|
||||
export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS KBUILD_LDFLAGS
|
||||
@ -593,12 +625,12 @@ else #!config-build
|
||||
# targets and others. In general all targets except *config targets.
|
||||
|
||||
# If building an external module we do not care about the all: rule
|
||||
# but instead _all depend on modules
|
||||
# but instead __all depend on modules
|
||||
PHONY += all
|
||||
ifeq ($(KBUILD_EXTMOD),)
|
||||
_all: all
|
||||
__all: all
|
||||
else
|
||||
_all: modules
|
||||
__all: modules
|
||||
endif
|
||||
|
||||
# Decide whether to build built-in, modular, or both.
|
||||
@ -608,19 +640,15 @@ KBUILD_MODULES :=
|
||||
KBUILD_BUILTIN := 1
|
||||
|
||||
# If we have only "make modules", don't compile built-in objects.
|
||||
# When we're building modules with modversions, we need to consider
|
||||
# the built-in objects during the descend as well, in order to
|
||||
# make sure the checksums are up to date before we record them.
|
||||
|
||||
ifeq ($(MAKECMDGOALS),modules)
|
||||
KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1)
|
||||
KBUILD_BUILTIN :=
|
||||
endif
|
||||
|
||||
# If we have "make <whatever> modules", compile modules
|
||||
# in addition to whatever we do anyway.
|
||||
# Just "make" or "make all" shall build modules as well
|
||||
|
||||
ifneq ($(filter all _all modules nsdeps,$(MAKECMDGOALS)),)
|
||||
ifneq ($(filter all modules nsdeps,$(MAKECMDGOALS)),)
|
||||
KBUILD_MODULES := 1
|
||||
endif
|
||||
|
||||
@ -636,13 +664,11 @@ endif
|
||||
|
||||
ifeq ($(KBUILD_EXTMOD),)
|
||||
# Objects we will link into vmlinux / subdirs we need to visit
|
||||
init-y := init/
|
||||
core-y := init/ usr/
|
||||
drivers-y := drivers/ sound/
|
||||
drivers-$(CONFIG_SAMPLES) += samples/
|
||||
net-y := net/
|
||||
drivers-y += net/ virt/
|
||||
libs-y := lib/
|
||||
core-y := usr/
|
||||
virt-y := virt/
|
||||
endif # KBUILD_EXTMOD
|
||||
|
||||
# The all: target is the default when no target is given on the
|
||||
@ -695,7 +721,7 @@ $(KCONFIG_CONFIG):
|
||||
# This exploits the 'multi-target pattern rule' trick.
|
||||
# The syncconfig should be executed only once to make all the targets.
|
||||
# (Note: use the grouped target '&:' when we bump to GNU Make 4.3)
|
||||
%/auto.conf %/auto.conf.cmd: $(KCONFIG_CONFIG)
|
||||
%/config/auto.conf %/config/auto.conf.cmd %/generated/autoconf.h: $(KCONFIG_CONFIG)
|
||||
$(Q)$(MAKE) -f $(srctree)/Makefile syncconfig
|
||||
else # !may-sync-config
|
||||
# External modules and some install targets need include/generated/autoconf.h
|
||||
@ -814,6 +840,12 @@ DEBUG_CFLAGS += $(call cc-option, -femit-struct-debug-baseonly) \
|
||||
$(call cc-option,-fno-var-tracking)
|
||||
endif
|
||||
|
||||
ifdef CONFIG_DEBUG_INFO_COMPRESSED
|
||||
DEBUG_CFLAGS += -gz=zlib
|
||||
KBUILD_AFLAGS += -Wa,--compress-debug-sections=zlib
|
||||
KBUILD_LDFLAGS += --compress-debug-sections=zlib
|
||||
endif
|
||||
|
||||
KBUILD_CFLAGS += $(DEBUG_CFLAGS)
|
||||
export DEBUG_CFLAGS
|
||||
|
||||
@ -950,6 +982,10 @@ ifeq ($(CONFIG_RELR),y)
|
||||
LDFLAGS_vmlinux += --pack-dyn-relocs=relr
|
||||
endif
|
||||
|
||||
# Align the bit size of userspace programs with the kernel
|
||||
KBUILD_USERCFLAGS += $(filter -m32 -m64, $(KBUILD_CFLAGS))
|
||||
KBUILD_USERLDFLAGS += $(filter -m32 -m64, $(KBUILD_CFLAGS))
|
||||
|
||||
# make the checker run with the right architecture
|
||||
CHECKFLAGS += --arch=$(ARCH)
|
||||
|
||||
@ -1011,10 +1047,10 @@ export mod_strip_cmd
|
||||
mod_compress_cmd = true
|
||||
ifdef CONFIG_MODULE_COMPRESS
|
||||
ifdef CONFIG_MODULE_COMPRESS_GZIP
|
||||
mod_compress_cmd = gzip -n -f
|
||||
mod_compress_cmd = $(_GZIP) -n -f
|
||||
endif # CONFIG_MODULE_COMPRESS_GZIP
|
||||
ifdef CONFIG_MODULE_COMPRESS_XZ
|
||||
mod_compress_cmd = xz -f
|
||||
mod_compress_cmd = $(XZ) -f
|
||||
endif # CONFIG_MODULE_COMPRESS_XZ
|
||||
endif # CONFIG_MODULE_COMPRESS
|
||||
export mod_compress_cmd
|
||||
@ -1049,34 +1085,33 @@ export MODULES_NSDEPS := $(extmod-prefix)modules.nsdeps
|
||||
ifeq ($(KBUILD_EXTMOD),)
|
||||
core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/
|
||||
|
||||
vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
|
||||
vmlinux-dirs := $(patsubst %/,%,$(filter %/, \
|
||||
$(core-y) $(core-m) $(drivers-y) $(drivers-m) \
|
||||
$(net-y) $(net-m) $(libs-y) $(libs-m) $(virt-y)))
|
||||
$(libs-y) $(libs-m)))
|
||||
|
||||
vmlinux-alldirs := $(sort $(vmlinux-dirs) Documentation \
|
||||
$(patsubst %/,%,$(filter %/, $(init-) $(core-) \
|
||||
$(drivers-) $(net-) $(libs-) $(virt-))))
|
||||
$(patsubst %/,%,$(filter %/, $(core-) \
|
||||
$(drivers-) $(libs-))))
|
||||
|
||||
subdir-modorder := $(addsuffix modules.order,$(filter %/, \
|
||||
$(core-y) $(core-m) $(libs-y) $(libs-m) \
|
||||
$(drivers-y) $(drivers-m)))
|
||||
|
||||
build-dirs := $(vmlinux-dirs)
|
||||
clean-dirs := $(vmlinux-alldirs)
|
||||
|
||||
init-y := $(patsubst %/, %/built-in.a, $(init-y))
|
||||
core-y := $(patsubst %/, %/built-in.a, $(core-y))
|
||||
drivers-y := $(patsubst %/, %/built-in.a, $(drivers-y))
|
||||
net-y := $(patsubst %/, %/built-in.a, $(net-y))
|
||||
libs-y2 := $(patsubst %/, %/built-in.a, $(filter %/, $(libs-y)))
|
||||
ifdef CONFIG_MODULES
|
||||
libs-y1 := $(filter-out %/, $(libs-y))
|
||||
libs-y2 += $(patsubst %/, %/lib.a, $(filter %/, $(libs-y)))
|
||||
else
|
||||
libs-y1 := $(patsubst %/, %/lib.a, $(libs-y))
|
||||
endif
|
||||
virt-y := $(patsubst %/, %/built-in.a, $(virt-y))
|
||||
|
||||
# Externally visible symbols (used by link-vmlinux.sh)
|
||||
export KBUILD_VMLINUX_OBJS := $(head-y) $(init-y) $(core-y) $(libs-y2) \
|
||||
$(drivers-y) $(net-y) $(virt-y)
|
||||
export KBUILD_VMLINUX_LIBS := $(libs-y1)
|
||||
KBUILD_VMLINUX_OBJS := $(head-y) $(patsubst %/,%/built-in.a, $(core-y))
|
||||
KBUILD_VMLINUX_OBJS += $(addsuffix built-in.a, $(filter %/, $(libs-y)))
|
||||
ifdef CONFIG_MODULES
|
||||
KBUILD_VMLINUX_OBJS += $(patsubst %/, %/lib.a, $(filter %/, $(libs-y)))
|
||||
KBUILD_VMLINUX_LIBS := $(filter-out %/, $(libs-y))
|
||||
else
|
||||
KBUILD_VMLINUX_LIBS := $(patsubst %/,%/lib.a, $(libs-y))
|
||||
endif
|
||||
KBUILD_VMLINUX_OBJS += $(patsubst %/,%/built-in.a, $(drivers-y))
|
||||
|
||||
export KBUILD_VMLINUX_OBJS KBUILD_VMLINUX_LIBS
|
||||
export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds
|
||||
export LDFLAGS_vmlinux
|
||||
# used by scripts/Makefile.package
|
||||
@ -1087,16 +1122,14 @@ vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS)
|
||||
# Recurse until adjust_autoksyms.sh is satisfied
|
||||
PHONY += autoksyms_recursive
|
||||
ifdef CONFIG_TRIM_UNUSED_KSYMS
|
||||
autoksyms_recursive: descend modules.order
|
||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh \
|
||||
"$(MAKE) -f $(srctree)/Makefile vmlinux"
|
||||
endif
|
||||
|
||||
# For the kernel to actually contain only the needed exported symbols,
|
||||
# we have to build modules as well to determine what those symbols are.
|
||||
# (this can be evaluated only once include/config/auto.conf has been included)
|
||||
ifdef CONFIG_TRIM_UNUSED_KSYMS
|
||||
KBUILD_MODULES := 1
|
||||
KBUILD_MODULES := 1
|
||||
|
||||
autoksyms_recursive: descend modules.order
|
||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh \
|
||||
"$(MAKE) -f $(srctree)/Makefile vmlinux"
|
||||
endif
|
||||
|
||||
autoksyms_h := $(if $(CONFIG_TRIM_UNUSED_KSYMS), include/generated/autoksyms.h)
|
||||
@ -1122,7 +1155,7 @@ targets := vmlinux
|
||||
|
||||
# The actual objects are generated when descending,
|
||||
# make sure no implicit rule kicks in
|
||||
$(sort $(vmlinux-deps)): descend ;
|
||||
$(sort $(vmlinux-deps) $(subdir-modorder)): descend ;
|
||||
|
||||
filechk_kernel.release = \
|
||||
echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
|
||||
@ -1147,7 +1180,8 @@ scripts: scripts_basic scripts_dtc
|
||||
PHONY += prepare archprepare
|
||||
|
||||
archprepare: outputmakefile archheaders archscripts scripts include/config/kernel.release \
|
||||
asm-generic $(version_h) $(autoksyms_h) include/generated/utsrelease.h
|
||||
asm-generic $(version_h) $(autoksyms_h) include/generated/utsrelease.h \
|
||||
include/generated/autoconf.h
|
||||
|
||||
prepare0: archprepare
|
||||
$(Q)$(MAKE) $(build)=scripts/mod
|
||||
@ -1315,12 +1349,29 @@ dt_binding_check: scripts_dtc
|
||||
# ---------------------------------------------------------------------------
|
||||
# Modules
|
||||
|
||||
# install modules.builtin regardless of CONFIG_MODULES
|
||||
PHONY += _builtin_inst_
|
||||
_builtin_inst_:
|
||||
@mkdir -p $(MODLIB)/
|
||||
@cp -f modules.builtin $(MODLIB)/
|
||||
@cp -f $(objtree)/modules.builtin.modinfo $(MODLIB)/
|
||||
|
||||
PHONY += install
|
||||
install: _builtin_inst_
|
||||
|
||||
ifdef CONFIG_MODULES
|
||||
|
||||
# By default, build modules as well
|
||||
|
||||
all: modules
|
||||
|
||||
# When we're building modules with modversions, we need to consider
|
||||
# the built-in objects during the descend as well, in order to
|
||||
# make sure the checksums are up to date before we record them.
|
||||
ifdef CONFIG_MODVERSIONS
|
||||
KBUILD_BUILTIN := 1
|
||||
endif
|
||||
|
||||
# Build modules
|
||||
#
|
||||
# A module can be listed more than once in obj-m resulting in
|
||||
@ -1328,12 +1379,19 @@ all: modules
|
||||
# using awk while concatenating to the final file.
|
||||
|
||||
PHONY += modules
|
||||
modules: $(if $(KBUILD_BUILTIN),vmlinux) modules.order
|
||||
modules: $(if $(KBUILD_BUILTIN),vmlinux) modules_check
|
||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/modules-check.sh
|
||||
|
||||
modules.order: descend
|
||||
$(Q)$(AWK) '!x[$$0]++' $(addsuffix /$@, $(build-dirs)) > $@
|
||||
PHONY += modules_check
|
||||
modules_check: modules.order
|
||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/modules-check.sh $<
|
||||
|
||||
cmd_modules_order = $(AWK) '!x[$$0]++' $(real-prereqs) > $@
|
||||
|
||||
modules.order: $(subdir-modorder) FORCE
|
||||
$(call if_changed,modules_order)
|
||||
|
||||
targets += modules.order
|
||||
|
||||
# Target to prepare building external modules
|
||||
PHONY += modules_prepare
|
||||
@ -1344,7 +1402,7 @@ PHONY += modules_install
|
||||
modules_install: _modinst_ _modinst_post
|
||||
|
||||
PHONY += _modinst_
|
||||
_modinst_:
|
||||
_modinst_: _builtin_inst_
|
||||
@rm -rf $(MODLIB)/kernel
|
||||
@rm -f $(MODLIB)/source
|
||||
@mkdir -p $(MODLIB)/kernel
|
||||
@ -1354,8 +1412,6 @@ _modinst_:
|
||||
ln -s $(CURDIR) $(MODLIB)/build ; \
|
||||
fi
|
||||
@sed 's:^:kernel/:' modules.order > $(MODLIB)/modules.order
|
||||
@cp -f modules.builtin $(MODLIB)/
|
||||
@cp -f $(objtree)/modules.builtin.modinfo $(MODLIB)/
|
||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
|
||||
|
||||
# This depmod is only for convenience to give the initial
|
||||
@ -1395,14 +1451,14 @@ endif # CONFIG_MODULES
|
||||
# make distclean Remove editor backup files, patch leftover files and the like
|
||||
|
||||
# Directories & files removed with 'make clean'
|
||||
CLEAN_DIRS += include/ksym
|
||||
CLEAN_FILES += modules.builtin modules.builtin.modinfo modules.nsdeps
|
||||
CLEAN_FILES += include/ksym vmlinux.symvers \
|
||||
modules.builtin modules.builtin.modinfo modules.nsdeps
|
||||
|
||||
# Directories & files removed with 'make mrproper'
|
||||
MRPROPER_DIRS += include/config include/generated \
|
||||
MRPROPER_FILES += include/config include/generated \
|
||||
arch/$(SRCARCH)/include/generated .tmp_objdiff \
|
||||
debian/ snap/ tar-install/
|
||||
MRPROPER_FILES += .config .config.old .version \
|
||||
debian snap tar-install \
|
||||
.config .config.old .version \
|
||||
Module.symvers \
|
||||
signing_key.pem signing_key.priv signing_key.x509 \
|
||||
x509.genkey extra_certificates signing_key.x509.keyid \
|
||||
@ -1410,12 +1466,10 @@ MRPROPER_FILES += .config .config.old .version \
|
||||
*.spec
|
||||
|
||||
# Directories & files removed with 'make distclean'
|
||||
DISTCLEAN_DIRS +=
|
||||
DISTCLEAN_FILES += tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS
|
||||
|
||||
# clean - Delete most, but leave enough to build external modules
|
||||
#
|
||||
clean: rm-dirs := $(CLEAN_DIRS)
|
||||
clean: rm-files := $(CLEAN_FILES)
|
||||
|
||||
PHONY += archclean vmlinuxclean
|
||||
@ -1428,7 +1482,6 @@ clean: archclean vmlinuxclean
|
||||
|
||||
# mrproper - Delete all generated files, including .config
|
||||
#
|
||||
mrproper: rm-dirs := $(wildcard $(MRPROPER_DIRS))
|
||||
mrproper: rm-files := $(wildcard $(MRPROPER_FILES))
|
||||
mrproper-dirs := $(addprefix _mrproper_,scripts)
|
||||
|
||||
@ -1437,18 +1490,15 @@ $(mrproper-dirs):
|
||||
$(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)
|
||||
|
||||
mrproper: clean $(mrproper-dirs)
|
||||
$(call cmd,rmdirs)
|
||||
$(call cmd,rmfiles)
|
||||
|
||||
# distclean
|
||||
#
|
||||
distclean: rm-dirs := $(wildcard $(DISTCLEAN_DIRS))
|
||||
distclean: rm-files := $(wildcard $(DISTCLEAN_FILES))
|
||||
|
||||
PHONY += distclean
|
||||
|
||||
distclean: mrproper
|
||||
$(call cmd,rmdirs)
|
||||
$(call cmd,rmfiles)
|
||||
@find $(srctree) $(RCS_FIND_IGNORE) \
|
||||
\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
|
||||
@ -1634,17 +1684,9 @@ else # KBUILD_EXTMOD
|
||||
# We are always building modules
|
||||
KBUILD_MODULES := 1
|
||||
|
||||
PHONY += $(objtree)/Module.symvers
|
||||
$(objtree)/Module.symvers:
|
||||
@test -e $(objtree)/Module.symvers || ( \
|
||||
echo; \
|
||||
echo " WARNING: Symbol version dump $(objtree)/Module.symvers"; \
|
||||
echo " is missing; modules will have no dependencies and modversions."; \
|
||||
echo )
|
||||
|
||||
build-dirs := $(KBUILD_EXTMOD)
|
||||
PHONY += modules
|
||||
modules: descend $(objtree)/Module.symvers
|
||||
modules: descend
|
||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
||||
|
||||
PHONY += modules_install
|
||||
@ -1663,10 +1705,6 @@ _emodinst_post: _emodinst_
|
||||
clean-dirs := $(KBUILD_EXTMOD)
|
||||
clean: rm-files := $(KBUILD_EXTMOD)/Module.symvers $(KBUILD_EXTMOD)/modules.nsdeps
|
||||
|
||||
PHONY += /
|
||||
/:
|
||||
@echo >&2 '"$(MAKE) /" is no longer supported. Please use "$(MAKE) ./" instead.'
|
||||
|
||||
PHONY += help
|
||||
help:
|
||||
@echo ' Building external modules.'
|
||||
@ -1724,6 +1762,10 @@ build-dirs := $(foreach d, $(build-dirs), \
|
||||
|
||||
endif
|
||||
|
||||
ifndef CONFIG_MODULES
|
||||
KBUILD_MODULES :=
|
||||
endif
|
||||
|
||||
# Handle descending into subdirectories listed in $(build-dirs)
|
||||
# Preset locale variables to speed up the build process. Limit locale
|
||||
# tweaks to this spot to avoid wrong language settings when running
|
||||
@ -1742,7 +1784,6 @@ $(clean-dirs):
|
||||
$(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)
|
||||
|
||||
clean: $(clean-dirs)
|
||||
$(call cmd,rmdirs)
|
||||
$(call cmd,rmfiles)
|
||||
@find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
|
||||
\( -name '*.[aios]' -o -name '*.ko' -o -name '.*.cmd' \
|
||||
@ -1837,14 +1878,8 @@ tools/%: FORCE
|
||||
$(Q)mkdir -p $(objtree)/tools
|
||||
$(Q)$(MAKE) LDFLAGS= MAKEFLAGS="$(tools_silent) $(filter --j% -j,$(MAKEFLAGS))" O=$(abspath $(objtree)) subdir=tools -C $(srctree)/tools/ $*
|
||||
|
||||
# FIXME Should go into a make.lib or something
|
||||
# ===========================================================================
|
||||
|
||||
quiet_cmd_rmdirs = $(if $(wildcard $(rm-dirs)),CLEAN $(wildcard $(rm-dirs)))
|
||||
cmd_rmdirs = rm -rf $(rm-dirs)
|
||||
|
||||
quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN $(wildcard $(rm-files)))
|
||||
cmd_rmfiles = rm -f $(rm-files)
|
||||
cmd_rmfiles = rm -rf $(rm-files)
|
||||
|
||||
# Run depmod only if we have System.map and depmod is executable
|
||||
quiet_cmd_depmod = DEPMOD $(KERNELRELEASE)
|
||||
|
@ -45,12 +45,10 @@ endif
|
||||
ifeq ($(CONFIG_CPU_BIG_ENDIAN),y)
|
||||
KBUILD_CPPFLAGS += -mbig-endian
|
||||
CHECKFLAGS += -D__ARMEB__
|
||||
AS += -EB
|
||||
KBUILD_LDFLAGS += -EB
|
||||
else
|
||||
KBUILD_CPPFLAGS += -mlittle-endian
|
||||
CHECKFLAGS += -D__ARMEL__
|
||||
AS += -EL
|
||||
KBUILD_LDFLAGS += -EL
|
||||
endif
|
||||
|
||||
|
@ -56,7 +56,7 @@ trap 'rm -f "$XIPIMAGE.tmp"; exit 1' 1 2 3
|
||||
# substitute the data section by a compressed version
|
||||
$DD if="$XIPIMAGE" count=$data_start iflag=count_bytes of="$XIPIMAGE.tmp"
|
||||
$DD if="$XIPIMAGE" skip=$data_start iflag=skip_bytes |
|
||||
gzip -9 >> "$XIPIMAGE.tmp"
|
||||
$_GZIP -9 >> "$XIPIMAGE.tmp"
|
||||
|
||||
# replace kernel binary
|
||||
mv -f "$XIPIMAGE.tmp" "$XIPIMAGE"
|
||||
|
@ -94,7 +94,6 @@ endif
|
||||
ifeq ($(CONFIG_CPU_BIG_ENDIAN), y)
|
||||
KBUILD_CPPFLAGS += -mbig-endian
|
||||
CHECKFLAGS += -D__AARCH64EB__
|
||||
AS += -EB
|
||||
# Prefer the baremetal ELF build target, but not all toolchains include
|
||||
# it so fall back to the standard linux version if needed.
|
||||
KBUILD_LDFLAGS += -EB $(call ld-option, -maarch64elfb, -maarch64linuxb)
|
||||
@ -102,7 +101,6 @@ UTS_MACHINE := aarch64_be
|
||||
else
|
||||
KBUILD_CPPFLAGS += -mlittle-endian
|
||||
CHECKFLAGS += -D__AARCH64EL__
|
||||
AS += -EL
|
||||
# Same as above, prefer ELF but fall back to linux target if needed.
|
||||
KBUILD_LDFLAGS += -EL $(call ld-option, -maarch64elf, -maarch64linux)
|
||||
UTS_MACHINE := aarch64
|
||||
|
@ -18,7 +18,7 @@ CONFIG_MEMORY_START ?= 0x00400000
|
||||
CONFIG_BOOT_LINK_OFFSET ?= 0x00280000
|
||||
IMAGE_OFFSET := $(shell printf "0x%08x" $$(($(CONFIG_MEMORY_START)+$(CONFIG_BOOT_LINK_OFFSET))))
|
||||
|
||||
LIBGCC := $(shell $(CROSS-COMPILE)$(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name)
|
||||
LIBGCC := $(shell $(CROSS-COMPILE)$(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name 2>/dev/null)
|
||||
LDFLAGS_vmlinux := -Ttext $(IMAGE_OFFSET) -estartup -T $(obj)/vmlinux.lds \
|
||||
--defsym output=$(CONFIG_MEMORY_START)
|
||||
|
||||
|
@ -30,7 +30,7 @@ TIR_NAME := r19
|
||||
KBUILD_CFLAGS += -ffixed-$(TIR_NAME) -DTHREADINFO_REG=$(TIR_NAME) -D__linux__
|
||||
KBUILD_AFLAGS += -DTHREADINFO_REG=$(TIR_NAME)
|
||||
|
||||
LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name)
|
||||
LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name 2>/dev/null)
|
||||
libs-y += $(LIBGCC)
|
||||
|
||||
head-y := arch/hexagon/kernel/head.o
|
||||
|
@ -40,7 +40,7 @@ $(error Sorry, you need a newer version of the assember, one that is built from
|
||||
endif
|
||||
|
||||
quiet_cmd_gzip = GZIP $@
|
||||
cmd_gzip = cat $(real-prereqs) | gzip -n -f -9 > $@
|
||||
cmd_gzip = cat $(real-prereqs) | $(_GZIP) -n -f -9 > $@
|
||||
|
||||
quiet_cmd_objcopy = OBJCOPY $@
|
||||
cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@
|
||||
|
@ -135,10 +135,10 @@ vmlinux.gz: vmlinux
|
||||
ifndef CONFIG_KGDB
|
||||
cp vmlinux vmlinux.tmp
|
||||
$(STRIP) vmlinux.tmp
|
||||
gzip -9c vmlinux.tmp >vmlinux.gz
|
||||
$(_GZIP) -9c vmlinux.tmp >vmlinux.gz
|
||||
rm vmlinux.tmp
|
||||
else
|
||||
gzip -9c vmlinux >vmlinux.gz
|
||||
$(_GZIP) -9c vmlinux >vmlinux.gz
|
||||
endif
|
||||
|
||||
bzImage: vmlinux.bz2
|
||||
@ -148,10 +148,10 @@ vmlinux.bz2: vmlinux
|
||||
ifndef CONFIG_KGDB
|
||||
cp vmlinux vmlinux.tmp
|
||||
$(STRIP) vmlinux.tmp
|
||||
bzip2 -1c vmlinux.tmp >vmlinux.bz2
|
||||
$(_BZIP2) -1c vmlinux.tmp >vmlinux.bz2
|
||||
rm vmlinux.tmp
|
||||
else
|
||||
bzip2 -1c vmlinux >vmlinux.bz2
|
||||
$(_BZIP2) -1c vmlinux >vmlinux.bz2
|
||||
endif
|
||||
|
||||
archclean:
|
||||
|
@ -162,7 +162,7 @@ vmlinuz: bzImage
|
||||
$(OBJCOPY) $(boot)/bzImage $@
|
||||
else
|
||||
vmlinuz: vmlinux
|
||||
@gzip -cf -9 $< > $@
|
||||
@$(_GZIP) -cf -9 $< > $@
|
||||
endif
|
||||
|
||||
install:
|
||||
|
@ -140,7 +140,7 @@ export CFLAGS_vmlinux := $(LINK-y) $(LINK_WRAPS) $(LD_FLAGS_CMDLINE)
|
||||
# When cleaning we don't include .config, so we don't include
|
||||
# TT or skas makefiles and don't clean skas_ptregs.h.
|
||||
CLEAN_FILES += linux x.i gmon.out
|
||||
MRPROPER_DIRS += arch/$(SUBARCH)/include/generated
|
||||
MRPROPER_FILES += arch/$(SUBARCH)/include/generated
|
||||
|
||||
archclean:
|
||||
@find . \( -name '*.bb' -o -name '*.bbg' -o -name '*.da' \
|
||||
|
@ -18,9 +18,9 @@ ubd-objs := ubd_kern.o ubd_user.o
|
||||
port-objs := port_kern.o port_user.o
|
||||
harddog-objs := harddog_kern.o harddog_user.o
|
||||
|
||||
LDFLAGS_pcap.o := -r $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libpcap.a)
|
||||
LDFLAGS_pcap.o = $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libpcap.a)
|
||||
|
||||
LDFLAGS_vde.o := -r $(shell $(CC) $(CFLAGS) -print-file-name=libvdeplug.a)
|
||||
LDFLAGS_vde.o = $(shell $(CC) $(CFLAGS) -print-file-name=libvdeplug.a)
|
||||
|
||||
targets := pcap_kern.o pcap_user.o vde_kern.o vde_user.o
|
||||
|
||||
|
@ -10,12 +10,12 @@ lib-y += strncpy_from_user.o strnlen_user.o
|
||||
lib-y += clear_user.o copy_page.o
|
||||
lib-y += copy_from_user.o copy_to_user.o
|
||||
|
||||
GNU_LIBC_A := $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libc.a)
|
||||
GNU_LIBC_A = $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libc.a)
|
||||
GNU_LIBC_A_OBJS := memchr.o memcpy.o memmove.o memset.o
|
||||
GNU_LIBC_A_OBJS += strchr.o strrchr.o
|
||||
GNU_LIBC_A_OBJS += rawmemchr.o # needed by strrchr.o
|
||||
|
||||
GNU_LIBGCC_A := $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libgcc.a)
|
||||
GNU_LIBGCC_A = $(shell $(CC) $(KBUILD_CFLAGS) -print-file-name=libgcc.a)
|
||||
GNU_LIBGCC_A_OBJS := _ashldi3.o _ashrdi3.o _lshrdi3.o
|
||||
GNU_LIBGCC_A_OBJS += _divsi3.o _modsi3.o _ucmpdi2.o _umodsi3.o _udivsi3.o
|
||||
|
||||
|
@ -2,6 +2,8 @@
|
||||
#ifndef __LINUX_KCONFIG_H
|
||||
#define __LINUX_KCONFIG_H
|
||||
|
||||
/* CONFIG_CC_VERSION_TEXT (Do not delete this comment. See help in Kconfig) */
|
||||
|
||||
#include <generated/autoconf.h>
|
||||
|
||||
#ifdef CONFIG_CPU_BIG_ENDIAN
|
||||
|
30
init/Kconfig
30
init/Kconfig
@ -8,8 +8,25 @@ config DEFCONFIG_LIST
|
||||
default "/boot/config-$(shell,uname -r)"
|
||||
default "arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)"
|
||||
|
||||
config CC_VERSION_TEXT
|
||||
string
|
||||
default "$(CC_VERSION_TEXT)"
|
||||
help
|
||||
This is used in unclear ways:
|
||||
|
||||
- Re-run Kconfig when the compiler is updated
|
||||
The 'default' property references the environment variable,
|
||||
CC_VERSION_TEXT so it is recorded in include/config/auto.conf.cmd.
|
||||
When the compiler is updated, Kconfig will be invoked.
|
||||
|
||||
- Ensure full rebuild when the compier is updated
|
||||
include/linux/kconfig.h contains this option in the comment line so
|
||||
fixdep adds include/config/cc/version/text.h into the auto-generated
|
||||
dependency. When the compiler is updated, syncconfig will touch it
|
||||
and then every file will be rebuilt.
|
||||
|
||||
config CC_IS_GCC
|
||||
def_bool $(success,$(CC) --version | head -n 1 | grep -q gcc)
|
||||
def_bool $(success,echo "$(CC_VERSION_TEXT)" | grep -q gcc)
|
||||
|
||||
config GCC_VERSION
|
||||
int
|
||||
@ -21,7 +38,7 @@ config LD_VERSION
|
||||
default $(shell,$(LD) --version | $(srctree)/scripts/ld-version.sh)
|
||||
|
||||
config CC_IS_CLANG
|
||||
def_bool $(success,$(CC) --version | head -n 1 | grep -q clang)
|
||||
def_bool $(success,echo "$(CC_VERSION_TEXT)" | grep -q clang)
|
||||
|
||||
config LD_IS_LLD
|
||||
def_bool $(success,$(LD) -v | head -n 1 | grep -q LLD)
|
||||
@ -31,7 +48,14 @@ config CLANG_VERSION
|
||||
default $(shell,$(srctree)/scripts/clang-version.sh $(CC))
|
||||
|
||||
config CC_CAN_LINK
|
||||
def_bool $(success,$(srctree)/scripts/cc-can-link.sh $(CC))
|
||||
bool
|
||||
default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(m64-flag)) if 64BIT
|
||||
default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) $(m32-flag))
|
||||
|
||||
config CC_CAN_LINK_STATIC
|
||||
bool
|
||||
default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) -static $(m64-flag)) if 64BIT
|
||||
default $(success,$(srctree)/scripts/cc-can-link.sh $(CC) -static $(m32-flag))
|
||||
|
||||
config CC_HAS_ASM_GOTO
|
||||
def_bool $(success,$(srctree)/scripts/gcc-goto.sh $(CC))
|
||||
|
@ -35,4 +35,4 @@ include/generated/compile.h: FORCE
|
||||
@$($(quiet)chk_compile.h)
|
||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkcompile_h $@ \
|
||||
"$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)" \
|
||||
"$(CONFIG_PREEMPT_RT)" "$(CC)" "$(LD)"
|
||||
"$(CONFIG_PREEMPT_RT)" $(CONFIG_CC_VERSION_TEXT) "$(LD)"
|
||||
|
@ -88,7 +88,7 @@ find $cpio_dir -type f -print0 |
|
||||
find $cpio_dir -printf "./%P\n" | LC_ALL=C sort | \
|
||||
tar "${KBUILD_BUILD_TIMESTAMP:+--mtime=$KBUILD_BUILD_TIMESTAMP}" \
|
||||
--owner=0 --group=0 --numeric-owner --no-recursion \
|
||||
-Jcf $tarfile -C $cpio_dir/ -T - > /dev/null
|
||||
-I $XZ -cf $tarfile -C $cpio_dir/ -T - > /dev/null
|
||||
|
||||
echo $headers_md5 > kernel/kheaders.md5
|
||||
echo "$this_file_md5" >> kernel/kheaders.md5
|
||||
|
@ -213,6 +213,23 @@ config DEBUG_INFO_REDUCED
|
||||
DEBUG_INFO build and compile times are reduced too.
|
||||
Only works with newer gcc versions.
|
||||
|
||||
config DEBUG_INFO_COMPRESSED
|
||||
bool "Compressed debugging information"
|
||||
depends on DEBUG_INFO
|
||||
depends on $(cc-option,-gz=zlib)
|
||||
depends on $(as-option,-Wa$(comma)--compress-debug-sections=zlib)
|
||||
depends on $(ld-option,--compress-debug-sections=zlib)
|
||||
help
|
||||
Compress the debug information using zlib. Requires GCC 5.0+ or Clang
|
||||
5.0+, binutils 2.26+, and zlib.
|
||||
|
||||
Users of dpkg-deb via scripts/package/builddeb may find an increase in
|
||||
size of their debug .deb packages with this config set, due to the
|
||||
debug info being compressed with zlib, then the object files being
|
||||
recompressed with a different compression scheme. But this is still
|
||||
preferable to setting $KDEB_COMPRESS to "none" which would be even
|
||||
larger.
|
||||
|
||||
config DEBUG_INFO_SPLIT
|
||||
bool "Produce split debuginfo in .dwo files"
|
||||
depends on DEBUG_INFO
|
||||
|
@ -9,8 +9,12 @@ menuconfig BPFILTER
|
||||
if BPFILTER
|
||||
config BPFILTER_UMH
|
||||
tristate "bpfilter kernel module with user mode helper"
|
||||
depends on CC_CAN_LINK
|
||||
depends on CC_CAN_LINK_STATIC
|
||||
default m
|
||||
help
|
||||
This builds bpfilter kernel module with embedded user mode helper
|
||||
|
||||
Note: your toolchain must support building static binaries, since
|
||||
rootfs isn't mounted at the time when __init functions are called
|
||||
and do_execv won't be able to find the elf interpreter.
|
||||
endif
|
||||
|
@ -3,17 +3,14 @@
|
||||
# Makefile for the Linux BPFILTER layer.
|
||||
#
|
||||
|
||||
hostprogs := bpfilter_umh
|
||||
userprogs := bpfilter_umh
|
||||
bpfilter_umh-objs := main.o
|
||||
KBUILD_HOSTCFLAGS += -I $(srctree)/tools/include/ -I $(srctree)/tools/include/uapi
|
||||
HOSTCC := $(CC)
|
||||
userccflags += -I $(srctree)/tools/include/ -I $(srctree)/tools/include/uapi
|
||||
|
||||
ifeq ($(CONFIG_BPFILTER_UMH), y)
|
||||
# builtin bpfilter_umh should be compiled with -static
|
||||
# builtin bpfilter_umh should be linked with -static
|
||||
# since rootfs isn't mounted at the time of __init
|
||||
# function is called and do_execv won't find elf interpreter
|
||||
KBUILD_HOSTLDFLAGS += -static
|
||||
endif
|
||||
userldflags += -static
|
||||
|
||||
$(obj)/bpfilter_umh_blob.o: $(obj)/bpfilter_umh
|
||||
|
||||
|
@ -6,6 +6,10 @@ menuconfig SAMPLES
|
||||
|
||||
if SAMPLES
|
||||
|
||||
config SAMPLE_AUXDISPLAY
|
||||
bool "auxdisplay sample"
|
||||
depends on CC_CAN_LINK
|
||||
|
||||
config SAMPLE_TRACE_EVENTS
|
||||
tristate "Build trace_events examples -- loadable modules only"
|
||||
depends on EVENT_TRACING && m
|
||||
@ -118,19 +122,29 @@ config SAMPLE_CONNECTOR
|
||||
|
||||
config SAMPLE_HIDRAW
|
||||
bool "hidraw sample"
|
||||
depends on HEADERS_INSTALL
|
||||
depends on CC_CAN_LINK && HEADERS_INSTALL
|
||||
|
||||
config SAMPLE_PIDFD
|
||||
bool "pidfd sample"
|
||||
depends on HEADERS_INSTALL
|
||||
depends on CC_CAN_LINK && HEADERS_INSTALL
|
||||
|
||||
config SAMPLE_SECCOMP
|
||||
bool "Build seccomp sample code"
|
||||
depends on SECCOMP_FILTER && HEADERS_INSTALL
|
||||
depends on SECCOMP_FILTER && CC_CAN_LINK && HEADERS_INSTALL
|
||||
help
|
||||
Build samples of seccomp filters using various methods of
|
||||
BPF filter construction.
|
||||
|
||||
config SAMPLE_TIMER
|
||||
bool "Timer sample"
|
||||
depends on CC_CAN_LINK && HEADERS_INSTALL
|
||||
|
||||
config SAMPLE_UHID
|
||||
bool "UHID sample"
|
||||
depends on CC_CAN_LINK && HEADERS_INSTALL
|
||||
help
|
||||
Build UHID sample program.
|
||||
|
||||
config SAMPLE_VFIO_MDEV_MTTY
|
||||
tristate "Build VFIO mtty example mediated device sample code -- loadable modules only"
|
||||
depends on VFIO_MDEV_DEVICE && m
|
||||
@ -178,7 +192,7 @@ config SAMPLE_ANDROID_BINDERFS
|
||||
|
||||
config SAMPLE_VFS
|
||||
bool "Build example programs that use new VFS system calls"
|
||||
depends on HEADERS_INSTALL
|
||||
depends on CC_CAN_LINK && HEADERS_INSTALL
|
||||
help
|
||||
Build example userspace programs that use new VFS system calls such
|
||||
as mount API and statx(). Note that this is restricted to the x86
|
||||
@ -187,8 +201,12 @@ config SAMPLE_VFS
|
||||
config SAMPLE_INTEL_MEI
|
||||
bool "Build example program working with intel mei driver"
|
||||
depends on INTEL_MEI
|
||||
depends on CC_CAN_LINK && HEADERS_INSTALL
|
||||
help
|
||||
Build a sample program to work with mei device.
|
||||
|
||||
config SAMPLE_WATCHDOG
|
||||
bool "watchdog sample"
|
||||
depends on CC_CAN_LINK
|
||||
|
||||
endif # SAMPLES
|
||||
|
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Makefile for Linux samples code
|
||||
OBJECT_FILES_NON_STANDARD := y
|
||||
|
||||
subdir-$(CONFIG_SAMPLE_AUXDISPLAY) += auxdisplay
|
||||
obj-$(CONFIG_SAMPLE_ANDROID_BINDERFS) += binderfs/
|
||||
obj-$(CONFIG_SAMPLE_CONFIGFS) += configfs/
|
||||
obj-$(CONFIG_SAMPLE_CONNECTOR) += connector/
|
||||
@ -16,11 +16,14 @@ subdir-$(CONFIG_SAMPLE_PIDFD) += pidfd
|
||||
obj-$(CONFIG_SAMPLE_QMI_CLIENT) += qmi/
|
||||
obj-$(CONFIG_SAMPLE_RPMSG_CLIENT) += rpmsg/
|
||||
subdir-$(CONFIG_SAMPLE_SECCOMP) += seccomp
|
||||
subdir-$(CONFIG_SAMPLE_TIMER) += timers
|
||||
obj-$(CONFIG_SAMPLE_TRACE_EVENTS) += trace_events/
|
||||
obj-$(CONFIG_SAMPLE_TRACE_PRINTK) += trace_printk/
|
||||
obj-$(CONFIG_SAMPLE_FTRACE_DIRECT) += ftrace/
|
||||
obj-$(CONFIG_SAMPLE_TRACE_ARRAY) += ftrace/
|
||||
subdir-$(CONFIG_SAMPLE_UHID) += uhid
|
||||
obj-$(CONFIG_VIDEO_PCI_SKELETON) += v4l/
|
||||
obj-y += vfio-mdev/
|
||||
subdir-$(CONFIG_SAMPLE_VFS) += vfs
|
||||
obj-$(CONFIG_SAMPLE_INTEL_MEI) += mei/
|
||||
subdir-$(CONFIG_SAMPLE_WATCHDOG) += watchdog
|
||||
|
@ -1,10 +1,3 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
CC := $(CROSS_COMPILE)gcc
|
||||
CFLAGS := -I../../usr/include
|
||||
|
||||
PROGS := cfag12864b-example
|
||||
|
||||
all: $(PROGS)
|
||||
|
||||
clean:
|
||||
rm -fr $(PROGS)
|
||||
userprogs := cfag12864b-example
|
||||
always-y := $(userprogs)
|
||||
|
@ -1,13 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
obj-$(CONFIG_SAMPLE_CONNECTOR) += cn_test.o
|
||||
|
||||
# List of programs to build
|
||||
hostprogs := ucon
|
||||
always-y := $(hostprogs)
|
||||
userprogs := ucon
|
||||
always-$(CONFIG_CC_CAN_LINK) := $(userprogs)
|
||||
|
||||
HOSTCFLAGS_ucon.o += -I$(objtree)/usr/include
|
||||
|
||||
all: modules
|
||||
|
||||
modules clean:
|
||||
$(MAKE) -C ../.. M=$(CURDIR) $@
|
||||
userccflags += -I usr/include
|
||||
|
@ -1,8 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# List of programs to build
|
||||
hostprogs := hid-example
|
||||
always-y := $(hostprogs)
|
||||
userprogs := hid-example
|
||||
always-y := $(userprogs)
|
||||
|
||||
HOSTCFLAGS_hid-example.o += -I$(objtree)/usr/include
|
||||
|
||||
all: hid-example
|
||||
userccflags += -I usr/include
|
||||
|
@ -1,10 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (c) 2012-2019, Intel Corporation. All rights reserved.
|
||||
|
||||
hostprogs := mei-amt-version
|
||||
userprogs := mei-amt-version
|
||||
always-y := $(userprogs)
|
||||
|
||||
HOSTCFLAGS_mei-amt-version.o += -I$(objtree)/usr/include
|
||||
|
||||
always-y := $(hostprogs)
|
||||
|
||||
all: mei-amt-version
|
||||
userccflags += -I usr/include
|
||||
|
@ -1,6 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
hostprogs := pidfd-metadata
|
||||
always-y := $(hostprogs)
|
||||
HOSTCFLAGS_pidfd-metadata.o += -I$(objtree)/usr/include
|
||||
all: pidfd-metadata
|
||||
usertprogs := pidfd-metadata
|
||||
always-y := $(userprogs)
|
||||
|
||||
userccflags += -I usr/include
|
||||
|
@ -1,44 +1,8 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
ifndef CROSS_COMPILE
|
||||
hostprogs := bpf-fancy dropper bpf-direct user-trap
|
||||
userprogs := bpf-fancy dropper bpf-direct user-trap
|
||||
|
||||
HOSTCFLAGS_bpf-fancy.o += -I$(objtree)/usr/include
|
||||
HOSTCFLAGS_bpf-fancy.o += -idirafter $(objtree)/include
|
||||
HOSTCFLAGS_bpf-helper.o += -I$(objtree)/usr/include
|
||||
HOSTCFLAGS_bpf-helper.o += -idirafter $(objtree)/include
|
||||
bpf-fancy-objs := bpf-fancy.o bpf-helper.o
|
||||
|
||||
HOSTCFLAGS_dropper.o += -I$(objtree)/usr/include
|
||||
HOSTCFLAGS_dropper.o += -idirafter $(objtree)/include
|
||||
dropper-objs := dropper.o
|
||||
userccflags += -I usr/include
|
||||
|
||||
HOSTCFLAGS_bpf-direct.o += -I$(objtree)/usr/include
|
||||
HOSTCFLAGS_bpf-direct.o += -idirafter $(objtree)/include
|
||||
bpf-direct-objs := bpf-direct.o
|
||||
|
||||
HOSTCFLAGS_user-trap.o += -I$(objtree)/usr/include
|
||||
HOSTCFLAGS_user-trap.o += -idirafter $(objtree)/include
|
||||
user-trap-objs := user-trap.o
|
||||
|
||||
# Try to match the kernel target.
|
||||
ifndef CONFIG_64BIT
|
||||
|
||||
# s390 has -m31 flag to build 31 bit binaries
|
||||
ifndef CONFIG_S390
|
||||
MFLAG = -m32
|
||||
else
|
||||
MFLAG = -m31
|
||||
endif
|
||||
|
||||
HOSTCFLAGS_bpf-direct.o += $(MFLAG)
|
||||
HOSTCFLAGS_dropper.o += $(MFLAG)
|
||||
HOSTCFLAGS_bpf-helper.o += $(MFLAG)
|
||||
HOSTCFLAGS_bpf-fancy.o += $(MFLAG)
|
||||
HOSTCFLAGS_user-trap.o += $(MFLAG)
|
||||
HOSTLDLIBS_bpf-direct += $(MFLAG)
|
||||
HOSTLDLIBS_bpf-fancy += $(MFLAG)
|
||||
HOSTLDLIBS_dropper += $(MFLAG)
|
||||
HOSTLDLIBS_user-trap += $(MFLAG)
|
||||
endif
|
||||
always-y := $(hostprogs)
|
||||
endif
|
||||
always-y := $(userprogs)
|
||||
|
@ -1,16 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
ifndef CROSS_COMPILE
|
||||
uname_M := $(shell uname -m 2>/dev/null || echo not)
|
||||
ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/x86/ -e s/x86_64/x86/)
|
||||
userprogs := hpet_example
|
||||
always-y := $(userprogs)
|
||||
|
||||
ifeq ($(ARCH),x86)
|
||||
CC := $(CROSS_COMPILE)gcc
|
||||
PROGS := hpet_example
|
||||
|
||||
all: $(PROGS)
|
||||
|
||||
clean:
|
||||
rm -fr $(PROGS)
|
||||
|
||||
endif
|
||||
endif
|
||||
userccflags += -I usr/include
|
||||
|
2
samples/uhid/.gitignore
vendored
Normal file
2
samples/uhid/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
/uhid-example
|
@ -1,8 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
# List of programs to build
|
||||
hostprogs := uhid-example
|
||||
userprogs := uhid-example
|
||||
always-y := $(userprogs)
|
||||
|
||||
# Tell kbuild to always build the programs
|
||||
always-y := $(hostprogs)
|
||||
|
||||
HOSTCFLAGS_uhid-example.o += -I$(objtree)/usr/include
|
||||
userccflags += -I usr/include
|
||||
|
@ -165,7 +165,7 @@ static int uhid_write(int fd, const struct uhid_event *ev)
|
||||
fprintf(stderr, "Cannot write to uhid: %m\n");
|
||||
return -errno;
|
||||
} else if (ret != sizeof(*ev)) {
|
||||
fprintf(stderr, "Wrong size written to uhid: %ld != %lu\n",
|
||||
fprintf(stderr, "Wrong size written to uhid: %zd != %zu\n",
|
||||
ret, sizeof(ev));
|
||||
return -EFAULT;
|
||||
} else {
|
||||
@ -236,7 +236,7 @@ static int event(int fd)
|
||||
fprintf(stderr, "Cannot read uhid-cdev: %m\n");
|
||||
return -errno;
|
||||
} else if (ret != sizeof(ev)) {
|
||||
fprintf(stderr, "Invalid size read from uhid-dev: %ld != %lu\n",
|
||||
fprintf(stderr, "Invalid size read from uhid-dev: %zd != %zu\n",
|
||||
ret, sizeof(ev));
|
||||
return -EFAULT;
|
||||
}
|
||||
|
@ -1,10 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
# List of programs to build
|
||||
hostprogs := \
|
||||
test-fsmount \
|
||||
test-statx
|
||||
userprogs := test-fsmount test-statx
|
||||
always-y := $(userprogs)
|
||||
|
||||
always-y := $(hostprogs)
|
||||
|
||||
HOSTCFLAGS_test-fsmount.o += -I$(objtree)/usr/include
|
||||
HOSTCFLAGS_test-statx.o += -I$(objtree)/usr/include
|
||||
userccflags += -I usr/include
|
||||
|
@ -1,9 +1,3 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
CC := $(CROSS_COMPILE)gcc
|
||||
PROGS := watchdog-simple
|
||||
|
||||
all: $(PROGS)
|
||||
|
||||
clean:
|
||||
rm -fr $(PROGS)
|
||||
|
||||
userprogs := watchdog-simple
|
||||
always-y := $(userprogs)
|
||||
|
@ -16,7 +16,7 @@ pound := \#
|
||||
dot-target = $(dir $@).$(notdir $@)
|
||||
|
||||
###
|
||||
# The temporary file to save gcc -MD generated dependencies must not
|
||||
# The temporary file to save gcc -MMD generated dependencies must not
|
||||
# contain a comma
|
||||
depfile = $(subst $(comma),_,$(dot-target).d)
|
||||
|
||||
|
@ -50,6 +50,12 @@ ifneq ($(hostprogs)$(hostcxxlibs-y)$(hostcxxlibs-m),)
|
||||
include scripts/Makefile.host
|
||||
endif
|
||||
|
||||
# Do not include userprogs rules unless needed.
|
||||
userprogs := $(sort $(userprogs))
|
||||
ifneq ($(userprogs),)
|
||||
include scripts/Makefile.userprogs
|
||||
endif
|
||||
|
||||
ifndef obj
|
||||
$(warning kbuild: Makefile.build is included improperly)
|
||||
endif
|
||||
@ -63,19 +69,27 @@ endif
|
||||
|
||||
# ===========================================================================
|
||||
|
||||
# subdir-builtin and subdir-modorder may contain duplications. Use $(sort ...)
|
||||
subdir-builtin := $(sort $(filter %/built-in.a, $(real-obj-y)))
|
||||
subdir-modorder := $(sort $(filter %/modules.order, $(obj-m)))
|
||||
|
||||
targets-for-builtin := $(extra-y)
|
||||
|
||||
ifneq ($(strip $(lib-y) $(lib-m) $(lib-)),)
|
||||
lib-target := $(obj)/lib.a
|
||||
targets-for-builtin += $(obj)/lib.a
|
||||
endif
|
||||
|
||||
ifdef need-builtin
|
||||
builtin-target := $(obj)/built-in.a
|
||||
targets-for-builtin += $(obj)/built-in.a
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_MODULES)$(need-modorder),y1)
|
||||
modorder-target := $(obj)/modules.order
|
||||
targets-for-modules := $(patsubst %.o, %.mod, $(filter %.o, $(obj-m)))
|
||||
|
||||
ifdef need-modorder
|
||||
targets-for-modules += $(obj)/modules.order
|
||||
endif
|
||||
|
||||
mod-targets := $(patsubst %.o, %.mod, $(obj-m))
|
||||
targets += $(targets-for-builtin) $(targets-for-modules)
|
||||
|
||||
# Linus' kernel sanity checking tool
|
||||
ifeq ($(KBUILD_CHECKSRC),1)
|
||||
@ -274,8 +288,6 @@ cmd_mod = { \
|
||||
$(obj)/%.mod: $(obj)/%.o FORCE
|
||||
$(call if_changed,mod)
|
||||
|
||||
targets += $(mod-targets)
|
||||
|
||||
quiet_cmd_cc_lst_c = MKLST $@
|
||||
cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \
|
||||
$(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \
|
||||
@ -348,8 +360,9 @@ endif
|
||||
$(obj)/%.o: $(src)/%.S $(objtool_dep) FORCE
|
||||
$(call if_changed_rule,as_o_S)
|
||||
|
||||
targets += $(filter-out $(subdir-obj-y), $(real-obj-y)) $(real-obj-m) $(lib-y)
|
||||
targets += $(extra-y) $(always-y) $(MAKECMDGOALS)
|
||||
targets += $(filter-out $(subdir-builtin), $(real-obj-y))
|
||||
targets += $(filter-out $(subdir-modorder), $(real-obj-m))
|
||||
targets += $(lib-y) $(always-y) $(MAKECMDGOALS)
|
||||
|
||||
# Linker scripts preprocessor (.lds.S -> .lds)
|
||||
# ---------------------------------------------------------------------------
|
||||
@ -373,44 +386,40 @@ $(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
# To build objects in subdirs, we need to descend into the directories
|
||||
$(obj)/%/built-in.a: $(obj)/% ;
|
||||
$(subdir-builtin): $(obj)/%/built-in.a: $(obj)/% ;
|
||||
$(subdir-modorder): $(obj)/%/modules.order: $(obj)/% ;
|
||||
|
||||
#
|
||||
# Rule to compile a set of .o files into one .a file (without symbol table)
|
||||
#
|
||||
ifdef builtin-target
|
||||
|
||||
quiet_cmd_ar_builtin = AR $@
|
||||
cmd_ar_builtin = rm -f $@; $(AR) cDPrST $@ $(real-prereqs)
|
||||
|
||||
$(builtin-target): $(real-obj-y) FORCE
|
||||
$(obj)/built-in.a: $(real-obj-y) FORCE
|
||||
$(call if_changed,ar_builtin)
|
||||
|
||||
targets += $(builtin-target)
|
||||
endif # builtin-target
|
||||
|
||||
#
|
||||
# Rule to create modules.order file
|
||||
#
|
||||
# Create commands to either record .ko file or cat modules.order from
|
||||
# a subdirectory
|
||||
$(modorder-target): $(subdir-ym) FORCE
|
||||
$(Q){ $(foreach m, $(modorder), \
|
||||
$(if $(filter %/modules.order, $m), cat $m, echo $m);) :; } \
|
||||
# Add $(obj-m) as the prerequisite to avoid updating the timestamp of
|
||||
# modules.order unless contained modules are updated.
|
||||
|
||||
cmd_modules_order = { $(foreach m, $(real-prereqs), \
|
||||
$(if $(filter %/modules.order, $m), cat $m, echo $(patsubst %.o,%.ko,$m));) :; } \
|
||||
| $(AWK) '!x[$$0]++' - > $@
|
||||
|
||||
$(obj)/modules.order: $(obj-m) FORCE
|
||||
$(call if_changed,modules_order)
|
||||
|
||||
#
|
||||
# Rule to compile a set of .o files into one .a file (with symbol table)
|
||||
#
|
||||
ifdef lib-target
|
||||
|
||||
$(lib-target): $(lib-y) FORCE
|
||||
$(obj)/lib.a: $(lib-y) FORCE
|
||||
$(call if_changed,ar)
|
||||
|
||||
targets += $(lib-target)
|
||||
|
||||
endif
|
||||
|
||||
# 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
|
||||
@ -473,8 +482,8 @@ endif
|
||||
|
||||
else
|
||||
|
||||
__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
|
||||
$(if $(KBUILD_MODULES),$(obj-m) $(mod-targets) $(modorder-target)) \
|
||||
__build: $(if $(KBUILD_BUILTIN), $(targets-for-builtin)) \
|
||||
$(if $(KBUILD_MODULES), $(targets-for-modules)) \
|
||||
$(subdir-ym) $(always-y)
|
||||
@:
|
||||
|
||||
@ -487,8 +496,8 @@ PHONY += $(subdir-ym)
|
||||
$(subdir-ym):
|
||||
$(Q)$(MAKE) $(build)=$@ \
|
||||
$(if $(filter $@/, $(KBUILD_SINGLE_TARGETS)),single-build=) \
|
||||
need-builtin=$(if $(filter $@/built-in.a, $(subdir-obj-y)),1) \
|
||||
need-modorder=$(if $(need-modorder),$(if $(filter $@/modules.order, $(modorder)),1))
|
||||
need-builtin=$(if $(filter $@/built-in.a, $(subdir-builtin)),1) \
|
||||
need-modorder=$(if $(filter $@/modules.order, $(subdir-modorder)),1)
|
||||
|
||||
# Add FORCE to the prequisites of a target to force it to be always rebuilt.
|
||||
# ---------------------------------------------------------------------------
|
||||
|
@ -29,7 +29,7 @@ subdir-ymn := $(addprefix $(obj)/,$(subdir-ymn))
|
||||
|
||||
__clean-files := $(extra-y) $(extra-m) $(extra-) \
|
||||
$(always) $(always-y) $(always-m) $(always-) $(targets) $(clean-files) \
|
||||
$(hostprogs) $(hostprogs-y) $(hostprogs-m) $(hostprogs-) \
|
||||
$(hostprogs) $(hostprogs-y) $(hostprogs-m) $(hostprogs-) $(userprogs) \
|
||||
$(hostcxxlibs-y) $(hostcxxlibs-m)
|
||||
|
||||
__clean-files := $(filter-out $(no-clean-files), $(__clean-files))
|
||||
|
@ -88,8 +88,8 @@ _hostcxx_flags += -I $(objtree)/$(obj)
|
||||
endif
|
||||
endif
|
||||
|
||||
hostc_flags = -Wp,-MD,$(depfile) $(_hostc_flags)
|
||||
hostcxx_flags = -Wp,-MD,$(depfile) $(_hostcxx_flags)
|
||||
hostc_flags = -Wp,-MMD,$(depfile) $(_hostc_flags)
|
||||
hostcxx_flags = -Wp,-MMD,$(depfile) $(_hostcxx_flags)
|
||||
|
||||
#####
|
||||
# Compile programs on the host
|
||||
|
@ -4,8 +4,18 @@ asflags-y += $(EXTRA_AFLAGS)
|
||||
ccflags-y += $(EXTRA_CFLAGS)
|
||||
cppflags-y += $(EXTRA_CPPFLAGS)
|
||||
ldflags-y += $(EXTRA_LDFLAGS)
|
||||
ifneq ($(always),)
|
||||
$(warning 'always' is deprecated. Please use 'always-y' instead)
|
||||
always-y += $(always)
|
||||
hostprogs += $(hostprogs-y) $(hostprogs-m)
|
||||
endif
|
||||
ifneq ($(hostprogs-y),)
|
||||
$(warning 'hostprogs-y' is deprecated. Please use 'hostprogs' instead)
|
||||
hostprogs += $(hostprogs-y)
|
||||
endif
|
||||
ifneq ($(hostprogs-m),)
|
||||
$(warning 'hostprogs-m' is deprecated. Please use 'hostprogs' instead)
|
||||
hostprogs += $(hostprogs-m)
|
||||
endif
|
||||
|
||||
# flags that take effect in current and sub directories
|
||||
KBUILD_AFLAGS += $(subdir-asflags-y)
|
||||
@ -22,40 +32,35 @@ obj-m := $(filter-out $(obj-y),$(obj-m))
|
||||
# Filter out objects already built-in
|
||||
lib-y := $(filter-out $(obj-y), $(sort $(lib-y) $(lib-m)))
|
||||
|
||||
# Determine modorder.
|
||||
# Unfortunately, we don't have information about ordering between -y
|
||||
# and -m subdirs. Just put -y's first.
|
||||
modorder := $(patsubst %/,%/modules.order, $(filter %/, $(obj-y)) $(obj-m:.o=.ko))
|
||||
# Subdirectories we need to descend into
|
||||
subdir-ym := $(sort $(subdir-y) $(subdir-m) \
|
||||
$(patsubst %/,%, $(filter %/, $(obj-y) $(obj-m))))
|
||||
|
||||
# Handle objects in subdirs:
|
||||
# - If we encounter foo/ in $(obj-y), replace it by foo/built-in.a and
|
||||
# foo/modules.order
|
||||
# - If we encounter foo/ in $(obj-m), replace it by foo/modules.order
|
||||
#
|
||||
# Generate modules.order to determine modorder. Unfortunately, we don't have
|
||||
# information about ordering between -y and -m subdirs. Just put -y's first.
|
||||
|
||||
ifdef need-modorder
|
||||
obj-m := $(patsubst %/,%/modules.order, $(filter %/, $(obj-y)) $(obj-m))
|
||||
else
|
||||
obj-m := $(filter-out %/, $(obj-m))
|
||||
endif
|
||||
|
||||
# Handle objects in subdirs
|
||||
# ---------------------------------------------------------------------------
|
||||
# o if we encounter foo/ in $(obj-y), replace it by foo/built-in.a
|
||||
# and add the directory to the list of dirs to descend into: $(subdir-y)
|
||||
# o if we encounter foo/ in $(obj-m), remove it from $(obj-m)
|
||||
# and add the directory to the list of dirs to descend into: $(subdir-m)
|
||||
__subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y)))
|
||||
subdir-y += $(__subdir-y)
|
||||
__subdir-m := $(patsubst %/,%,$(filter %/, $(obj-m)))
|
||||
subdir-m += $(__subdir-m)
|
||||
ifdef need-builtin
|
||||
obj-y := $(patsubst %/, %/built-in.a, $(obj-y))
|
||||
else
|
||||
obj-y := $(filter-out %/, $(obj-y))
|
||||
endif
|
||||
obj-m := $(filter-out %/, $(obj-m))
|
||||
|
||||
# Subdirectories we need to descend into
|
||||
subdir-ym := $(sort $(subdir-y) $(subdir-m))
|
||||
|
||||
# If $(foo-objs), $(foo-y), $(foo-m), or $(foo-) exists, foo.o is a composite object
|
||||
multi-used-y := $(sort $(foreach m,$(obj-y), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y)) $($(m:.o=-))), $(m))))
|
||||
multi-used-m := $(sort $(foreach m,$(obj-m), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y)) $($(m:.o=-m)) $($(m:.o=-))), $(m))))
|
||||
multi-used := $(multi-used-y) $(multi-used-m)
|
||||
|
||||
# $(subdir-obj-y) is the list of objects in $(obj-y) which uses dir/ to
|
||||
# tell kbuild to descend
|
||||
subdir-obj-y := $(filter %/built-in.a, $(obj-y))
|
||||
|
||||
# Replace multi-part objects by their individual parts,
|
||||
# including built-in.a from subdirectories
|
||||
real-obj-y := $(foreach m, $(obj-y), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y)) $($(m:.o=-))),$($(m:.o=-objs)) $($(m:.o=-y)),$(m)))
|
||||
@ -78,10 +83,8 @@ endif
|
||||
extra-y := $(addprefix $(obj)/,$(extra-y))
|
||||
always-y := $(addprefix $(obj)/,$(always-y))
|
||||
targets := $(addprefix $(obj)/,$(targets))
|
||||
modorder := $(addprefix $(obj)/,$(modorder))
|
||||
obj-m := $(addprefix $(obj)/,$(obj-m))
|
||||
lib-y := $(addprefix $(obj)/,$(lib-y))
|
||||
subdir-obj-y := $(addprefix $(obj)/,$(subdir-obj-y))
|
||||
real-obj-y := $(addprefix $(obj)/,$(real-obj-y))
|
||||
real-obj-m := $(addprefix $(obj)/,$(real-obj-m))
|
||||
multi-used-m := $(addprefix $(obj)/,$(multi-used-m))
|
||||
@ -171,22 +174,22 @@ modkern_aflags = $(if $(part-of-module), \
|
||||
$(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE), \
|
||||
$(KBUILD_AFLAGS_KERNEL) $(AFLAGS_KERNEL))
|
||||
|
||||
c_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
|
||||
c_flags = -Wp,-MMD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
|
||||
-include $(srctree)/include/linux/compiler_types.h \
|
||||
$(_c_flags) $(modkern_cflags) \
|
||||
$(basename_flags) $(modname_flags)
|
||||
|
||||
a_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
|
||||
a_flags = -Wp,-MMD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
|
||||
$(_a_flags) $(modkern_aflags)
|
||||
|
||||
cpp_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
|
||||
cpp_flags = -Wp,-MMD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
|
||||
$(_cpp_flags)
|
||||
|
||||
ld_flags = $(KBUILD_LDFLAGS) $(ldflags-y) $(LDFLAGS_$(@F))
|
||||
|
||||
DTC_INCLUDE := $(srctree)/scripts/dtc/include-prefixes
|
||||
|
||||
dtc_cpp_flags = -Wp,-MD,$(depfile).pre.tmp -nostdinc \
|
||||
dtc_cpp_flags = -Wp,-MMD,$(depfile).pre.tmp -nostdinc \
|
||||
$(addprefix -I,$(DTC_INCLUDE)) \
|
||||
-undef -D__DTS__
|
||||
|
||||
@ -241,7 +244,7 @@ cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
quiet_cmd_gzip = GZIP $@
|
||||
cmd_gzip = cat $(real-prereqs) | gzip -n -f -9 > $@
|
||||
cmd_gzip = cat $(real-prereqs) | $(_GZIP) -n -f -9 > $@
|
||||
|
||||
# DTC
|
||||
# ---------------------------------------------------------------------------
|
||||
@ -287,13 +290,13 @@ $(obj)/%.dtb.S: $(obj)/%.dtb FORCE
|
||||
quiet_cmd_dtc = DTC $@
|
||||
cmd_dtc = mkdir -p $(dir ${dtc-tmp}) ; \
|
||||
$(HOSTCC) -E $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \
|
||||
$(DTC) -O $(2) -o $@ -b 0 \
|
||||
$(DTC) -O $(patsubst .%,%,$(suffix $@)) -o $@ -b 0 \
|
||||
$(addprefix -i,$(dir $<) $(DTC_INCLUDE)) $(DTC_FLAGS) \
|
||||
-d $(depfile).dtc.tmp $(dtc-tmp) ; \
|
||||
cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile)
|
||||
|
||||
$(obj)/%.dtb: $(src)/%.dts $(DTC) FORCE
|
||||
$(call if_changed_dep,dtc,dtb)
|
||||
$(call if_changed_dep,dtc)
|
||||
|
||||
DT_CHECKER ?= dt-validate
|
||||
DT_BINDING_DIR := Documentation/devicetree/bindings
|
||||
@ -304,7 +307,7 @@ quiet_cmd_dtb_check = CHECK $@
|
||||
cmd_dtb_check = $(DT_CHECKER) -u $(srctree)/$(DT_BINDING_DIR) -p $(DT_TMP_SCHEMA) $@
|
||||
|
||||
define rule_dtc
|
||||
$(call cmd_and_fixdep,dtc,yaml)
|
||||
$(call cmd_and_fixdep,dtc)
|
||||
$(call cmd,dtb_check)
|
||||
endef
|
||||
|
||||
@ -334,19 +337,19 @@ printf "%08x\n" $$dec_size | \
|
||||
)
|
||||
|
||||
quiet_cmd_bzip2 = BZIP2 $@
|
||||
cmd_bzip2 = { cat $(real-prereqs) | bzip2 -9; $(size_append); } > $@
|
||||
cmd_bzip2 = { cat $(real-prereqs) | $(_BZIP2) -9; $(size_append); } > $@
|
||||
|
||||
# Lzma
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
quiet_cmd_lzma = LZMA $@
|
||||
cmd_lzma = { cat $(real-prereqs) | lzma -9; $(size_append); } > $@
|
||||
cmd_lzma = { cat $(real-prereqs) | $(LZMA) -9; $(size_append); } > $@
|
||||
|
||||
quiet_cmd_lzo = LZO $@
|
||||
cmd_lzo = { cat $(real-prereqs) | lzop -9; $(size_append); } > $@
|
||||
cmd_lzo = { cat $(real-prereqs) | $(_LZOP) -9; $(size_append); } > $@
|
||||
|
||||
quiet_cmd_lz4 = LZ4 $@
|
||||
cmd_lz4 = { cat $(real-prereqs) | lz4c -l -c1 stdin stdout; \
|
||||
cmd_lz4 = { cat $(real-prereqs) | $(LZ4) -l -c1 stdin stdout; \
|
||||
$(size_append); } > $@
|
||||
|
||||
# U-Boot mkimage
|
||||
@ -393,7 +396,7 @@ quiet_cmd_xzkern = XZKERN $@
|
||||
$(size_append); } > $@
|
||||
|
||||
quiet_cmd_xzmisc = XZMISC $@
|
||||
cmd_xzmisc = cat $(real-prereqs) | xz --check=crc32 --lzma2=dict=1MiB > $@
|
||||
cmd_xzmisc = cat $(real-prereqs) | $(XZ) --check=crc32 --lzma2=dict=1MiB > $@
|
||||
|
||||
# ASM offsets
|
||||
# ---------------------------------------------------------------------------
|
||||
|
@ -43,34 +43,30 @@ __modpost:
|
||||
include include/config/auto.conf
|
||||
include scripts/Kbuild.include
|
||||
|
||||
kernelsymfile := $(objtree)/Module.symvers
|
||||
modulesymfile := $(firstword $(KBUILD_EXTMOD))/Module.symvers
|
||||
|
||||
MODPOST = scripts/mod/modpost \
|
||||
$(if $(CONFIG_MODVERSIONS),-m) \
|
||||
$(if $(CONFIG_MODULE_SRCVERSION_ALL),-a) \
|
||||
$(if $(KBUILD_EXTMOD),-i,-o) $(kernelsymfile) \
|
||||
$(if $(KBUILD_EXTMOD),$(addprefix -e ,$(KBUILD_EXTRA_SYMBOLS))) \
|
||||
$(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \
|
||||
$(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E) \
|
||||
$(if $(CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS)$(KBUILD_NSDEPS),-N) \
|
||||
$(if $(KBUILD_MODPOST_WARN),-w)
|
||||
$(if $(KBUILD_MODPOST_WARN),-w) \
|
||||
-o $@
|
||||
|
||||
ifdef MODPOST_VMLINUX
|
||||
|
||||
quiet_cmd_modpost = MODPOST vmlinux.o
|
||||
cmd_modpost = $(MODPOST) vmlinux.o
|
||||
quiet_cmd_modpost = MODPOST $@
|
||||
cmd_modpost = $(MODPOST) $<
|
||||
|
||||
__modpost:
|
||||
vmlinux.symvers: vmlinux.o
|
||||
$(call cmd,modpost)
|
||||
|
||||
__modpost: vmlinux.symvers
|
||||
|
||||
else
|
||||
|
||||
MODPOST += $(subst -i,-n,$(filter -i,$(MAKEFLAGS))) -s -T - \
|
||||
$(if $(KBUILD_NSDEPS),-d $(MODULES_NSDEPS))
|
||||
|
||||
ifeq ($(KBUILD_EXTMOD),)
|
||||
MODPOST += $(wildcard vmlinux)
|
||||
|
||||
input-symdump := vmlinux.symvers
|
||||
output-symdump := Module.symvers
|
||||
|
||||
else
|
||||
|
||||
# set src + obj - they may be used in the modules's Makefile
|
||||
@ -80,22 +76,57 @@ src := $(obj)
|
||||
# Include the module's Makefile to find KBUILD_EXTRA_SYMBOLS
|
||||
include $(if $(wildcard $(KBUILD_EXTMOD)/Kbuild), \
|
||||
$(KBUILD_EXTMOD)/Kbuild, $(KBUILD_EXTMOD)/Makefile)
|
||||
|
||||
# modpost option for external modules
|
||||
MODPOST += -e
|
||||
|
||||
input-symdump := Module.symvers $(KBUILD_EXTRA_SYMBOLS)
|
||||
output-symdump := $(KBUILD_EXTMOD)/Module.symvers
|
||||
|
||||
endif
|
||||
|
||||
# find all modules listed in modules.order
|
||||
modules := $(sort $(shell cat $(MODORDER)))
|
||||
# modpost options for modules (both in-kernel and external)
|
||||
MODPOST += \
|
||||
$(addprefix -i ,$(wildcard $(input-symdump))) \
|
||||
$(if $(KBUILD_NSDEPS),-d $(MODULES_NSDEPS)) \
|
||||
$(if $(CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS)$(KBUILD_NSDEPS),-N)
|
||||
|
||||
# Read out modules.order instead of expanding $(modules) to pass in modpost.
|
||||
# 'make -i -k' ignores compile errors, and builds as many modules as possible.
|
||||
ifneq ($(findstring i,$(filter-out --%,$(MAKEFLAGS))),)
|
||||
MODPOST += -n
|
||||
endif
|
||||
|
||||
# Clear VPATH to not search for *.symvers in $(srctree). Check only $(objtree).
|
||||
VPATH :=
|
||||
$(input-symdump):
|
||||
@echo >&2 'WARNING: Symbol version dump "$@" is missing.'
|
||||
@echo >&2 ' Modules may not have dependencies or modversions.'
|
||||
|
||||
# Read out modules.order to pass in modpost.
|
||||
# Otherwise, allmodconfig would fail with "Argument list too long".
|
||||
quiet_cmd_modpost = MODPOST $(words $(modules)) modules
|
||||
cmd_modpost = sed 's/ko$$/o/' $(MODORDER) | $(MODPOST)
|
||||
quiet_cmd_modpost = MODPOST $@
|
||||
cmd_modpost = sed 's/ko$$/o/' $< | $(MODPOST) -T -
|
||||
|
||||
__modpost:
|
||||
$(call cmd,modpost)
|
||||
$(output-symdump): $(MODORDER) $(input-symdump) FORCE
|
||||
$(call if_changed,modpost)
|
||||
|
||||
targets += $(output-symdump)
|
||||
|
||||
__modpost: $(output-symdump)
|
||||
ifneq ($(KBUILD_MODPOST_NOFINAL),1)
|
||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal
|
||||
endif
|
||||
|
||||
PHONY += FORCE
|
||||
FORCE:
|
||||
|
||||
existing-targets := $(wildcard $(sort $(targets)))
|
||||
|
||||
-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)
|
||||
|
||||
PHONY += FORCE
|
||||
FORCE:
|
||||
|
||||
endif
|
||||
|
||||
.PHONY: $(PHONY)
|
||||
|
@ -45,7 +45,7 @@ if test "$(objtree)" != "$(srctree)"; then \
|
||||
false; \
|
||||
fi ; \
|
||||
$(srctree)/scripts/setlocalversion --save-scmversion; \
|
||||
tar -cz $(RCS_TAR_IGNORE) -f $(2).tar.gz \
|
||||
tar -I $(_GZIP) -c $(RCS_TAR_IGNORE) -f $(2).tar.gz \
|
||||
--transform 's:^:$(2)/:S' $(TAR_CONTENT) $(3); \
|
||||
rm -f $(objtree)/.scmversion
|
||||
|
||||
@ -127,9 +127,9 @@ util/PERF-VERSION-GEN $(CURDIR)/$(perf-tar)/); \
|
||||
tar rf $(perf-tar).tar $(perf-tar)/HEAD $(perf-tar)/PERF-VERSION-FILE; \
|
||||
rm -r $(perf-tar); \
|
||||
$(if $(findstring tar-src,$@),, \
|
||||
$(if $(findstring bz2,$@),bzip2, \
|
||||
$(if $(findstring gz,$@),gzip, \
|
||||
$(if $(findstring xz,$@),xz, \
|
||||
$(if $(findstring bz2,$@),$(_BZIP2), \
|
||||
$(if $(findstring gz,$@),$(_GZIP), \
|
||||
$(if $(findstring xz,$@),$(XZ), \
|
||||
$(error unknown target $@)))) \
|
||||
-f -9 $(perf-tar).tar)
|
||||
|
||||
|
45
scripts/Makefile.userprogs
Normal file
45
scripts/Makefile.userprogs
Normal file
@ -0,0 +1,45 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
#
|
||||
# Build userspace programs for the target system
|
||||
#
|
||||
|
||||
# Executables compiled from a single .c file
|
||||
user-csingle := $(foreach m, $(userprogs), $(if $($(m)-objs),,$(m)))
|
||||
|
||||
# Executables linked based on several .o files
|
||||
user-cmulti := $(foreach m, $(userprogs), $(if $($(m)-objs),$(m)))
|
||||
|
||||
# Objects compiled from .c files
|
||||
user-cobjs := $(sort $(foreach m, $(userprogs), $($(m)-objs)))
|
||||
|
||||
user-csingle := $(addprefix $(obj)/, $(user-csingle))
|
||||
user-cmulti := $(addprefix $(obj)/, $(user-cmulti))
|
||||
user-cobjs := $(addprefix $(obj)/, $(user-cobjs))
|
||||
|
||||
user_ccflags = -Wp,-MMD,$(depfile) $(KBUILD_USERCFLAGS) $(userccflags) \
|
||||
$($(target-stem)-userccflags)
|
||||
user_ldflags = $(KBUILD_USERLDFLAGS) $(userldflags) $($(target-stem)-userldflags)
|
||||
|
||||
# Create an executable from a single .c file
|
||||
quiet_cmd_user_cc_c = CC [U] $@
|
||||
cmd_user_cc_c = $(CC) $(user_ccflags) $(user_ldflags) -o $@ $< \
|
||||
$($(target-stem)-userldlibs)
|
||||
$(user-csingle): $(obj)/%: $(src)/%.c FORCE
|
||||
$(call if_changed_dep,user_cc_c)
|
||||
|
||||
# Link an executable based on list of .o files
|
||||
quiet_cmd_user_ld = LD [U] $@
|
||||
cmd_user_ld = $(CC) $(user_ldflags) -o $@ \
|
||||
$(addprefix $(obj)/, $($(target-stem)-objs)) \
|
||||
$($(target-stem)-userldlibs)
|
||||
$(user-cmulti): FORCE
|
||||
$(call if_changed,user_ld)
|
||||
$(call multi_depend, $(user-cmulti), , -objs)
|
||||
|
||||
# Create .o file from a .c file
|
||||
quiet_cmd_user_cc_o_c = CC [U] $@
|
||||
cmd_user_cc_o_c = $(CC) $(user_ccflags) -c -o $@ $<
|
||||
$(user-cobjs): $(obj)/%.o: $(src)/%.c FORCE
|
||||
$(call if_changed_dep,user_cc_o_c)
|
||||
|
||||
targets += $(user-csingle) $(user-cmulti) $(user-cobjs)
|
@ -160,7 +160,7 @@ struct item {
|
||||
struct item *next;
|
||||
unsigned int len;
|
||||
unsigned int hash;
|
||||
char name[0];
|
||||
char name[];
|
||||
};
|
||||
|
||||
#define HASHSZ 256
|
||||
|
@ -34,8 +34,10 @@ use strict;
|
||||
# $& (whole re) matches the complete objdump line with the stack growth
|
||||
# $1 (first bracket) matches the dynamic amount of the stack growth
|
||||
#
|
||||
# $sub: subroutine for special handling to check stack usage.
|
||||
#
|
||||
# use anything else and feel the pain ;)
|
||||
my (@stack, $re, $dre, $x, $xs, $funcre);
|
||||
my (@stack, $re, $dre, $sub, $x, $xs, $funcre, $min_stack);
|
||||
{
|
||||
my $arch = shift;
|
||||
if ($arch eq "") {
|
||||
@ -43,6 +45,11 @@ my (@stack, $re, $dre, $x, $xs, $funcre);
|
||||
chomp($arch);
|
||||
}
|
||||
|
||||
$min_stack = shift;
|
||||
if ($min_stack eq "" || $min_stack !~ /^\d+$/) {
|
||||
$min_stack = 100;
|
||||
}
|
||||
|
||||
$x = "[0-9a-f]"; # hex character
|
||||
$xs = "[0-9a-f ]"; # hex character or space
|
||||
$funcre = qr/^$x* <(.*)>:$/;
|
||||
@ -53,7 +60,8 @@ my (@stack, $re, $dre, $x, $xs, $funcre);
|
||||
$dre = qr/^.*sub.*sp, sp, #(0x$x{1,8})/o;
|
||||
} elsif ($arch eq 'arm') {
|
||||
#c0008ffc: e24dd064 sub sp, sp, #100 ; 0x64
|
||||
$re = qr/.*sub.*sp, sp, #(([0-9]{2}|[3-9])[0-9]{2})/o;
|
||||
$re = qr/.*sub.*sp, sp, #([0-9]{1,4})/o;
|
||||
$sub = \&arm_push_handling;
|
||||
} elsif ($arch =~ /^x86(_64)?$/ || $arch =~ /^i[3456]86$/) {
|
||||
#c0105234: 81 ec ac 05 00 00 sub $0x5ac,%esp
|
||||
# or
|
||||
@ -106,14 +114,51 @@ my (@stack, $re, $dre, $x, $xs, $funcre);
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# To count stack usage of push {*, fp, ip, lr, pc} instruction in ARM,
|
||||
# if FRAME POINTER is enabled.
|
||||
# e.g. c01f0d48: e92ddff0 push {r4, r5, r6, r7, r8, r9, sl, fp, ip, lr, pc}
|
||||
#
|
||||
sub arm_push_handling {
|
||||
my $regex = qr/.*push.*fp, ip, lr, pc}/o;
|
||||
my $size = 0;
|
||||
my $line_arg = shift;
|
||||
|
||||
if ($line_arg =~ m/$regex/) {
|
||||
$size = $line_arg =~ tr/,//;
|
||||
$size = ($size + 1) * 4;
|
||||
}
|
||||
|
||||
return $size;
|
||||
}
|
||||
|
||||
#
|
||||
# main()
|
||||
#
|
||||
my ($func, $file, $lastslash);
|
||||
my ($func, $file, $lastslash, $total_size, $addr, $intro);
|
||||
|
||||
$total_size = 0;
|
||||
|
||||
while (my $line = <STDIN>) {
|
||||
if ($line =~ m/$funcre/) {
|
||||
$func = $1;
|
||||
next if $line !~ m/^($xs*)/;
|
||||
if ($total_size > $min_stack) {
|
||||
push @stack, "$intro$total_size\n";
|
||||
}
|
||||
|
||||
$addr = $1;
|
||||
$addr =~ s/ /0/g;
|
||||
$addr = "0x$addr";
|
||||
|
||||
$intro = "$addr $func [$file]:";
|
||||
my $padlen = 56 - length($intro);
|
||||
while ($padlen > 0) {
|
||||
$intro .= ' ';
|
||||
$padlen -= 8;
|
||||
}
|
||||
|
||||
$total_size = 0;
|
||||
}
|
||||
elsif ($line =~ m/(.*):\s*file format/) {
|
||||
$file = $1;
|
||||
@ -134,36 +179,22 @@ while (my $line = <STDIN>) {
|
||||
}
|
||||
next if ($size > 0x10000000);
|
||||
|
||||
next if $line !~ m/^($xs*)/;
|
||||
my $addr = $1;
|
||||
$addr =~ s/ /0/g;
|
||||
$addr = "0x$addr";
|
||||
|
||||
my $intro = "$addr $func [$file]:";
|
||||
my $padlen = 56 - length($intro);
|
||||
while ($padlen > 0) {
|
||||
$intro .= ' ';
|
||||
$padlen -= 8;
|
||||
}
|
||||
next if ($size < 100);
|
||||
push @stack, "$intro$size\n";
|
||||
$total_size += $size;
|
||||
}
|
||||
elsif (defined $dre && $line =~ m/$dre/) {
|
||||
my $size = "Dynamic ($1)";
|
||||
my $size = $1;
|
||||
|
||||
next if $line !~ m/^($xs*)/;
|
||||
my $addr = $1;
|
||||
$addr =~ s/ /0/g;
|
||||
$addr = "0x$addr";
|
||||
|
||||
my $intro = "$addr $func [$file]:";
|
||||
my $padlen = 56 - length($intro);
|
||||
while ($padlen > 0) {
|
||||
$intro .= ' ';
|
||||
$padlen -= 8;
|
||||
}
|
||||
push @stack, "$intro$size\n";
|
||||
$size = hex($size) if ($size =~ /^0x/);
|
||||
$total_size += $size;
|
||||
}
|
||||
elsif (defined $sub) {
|
||||
my $size = &$sub($line);
|
||||
|
||||
$total_size += $size;
|
||||
}
|
||||
}
|
||||
if ($total_size > $min_stack) {
|
||||
push @stack, "$intro$total_size\n";
|
||||
}
|
||||
|
||||
# Sort output by size (last field)
|
||||
|
@ -14,7 +14,7 @@ $(objtree)/$(obj)/randomize_layout_seed.h: FORCE
|
||||
$(call if_changed,create_randomize_layout_seed)
|
||||
targets = randomize_layout_seed.h randomize_layout_hash.h
|
||||
|
||||
hostcxxlibs-y := $(foreach p,$(GCC_PLUGIN),$(if $(findstring /,$(p)),,$(p)))
|
||||
hostcxxlibs-y := $(GCC_PLUGIN)
|
||||
always-y := $(hostcxxlibs-y)
|
||||
|
||||
$(foreach p,$(hostcxxlibs-y:%.so=%),$(eval $(p)-objs := $(p).o))
|
||||
|
@ -64,7 +64,7 @@ configs=$(sed -e '
|
||||
d
|
||||
' $OUTFILE)
|
||||
|
||||
# The entries in the following list are not warned.
|
||||
# The entries in the following list do not result in an error.
|
||||
# Please do not add a new entry. This list is only for existing ones.
|
||||
# The list will be reduced gradually, and deleted eventually. (hopefully)
|
||||
#
|
||||
@ -98,18 +98,19 @@ include/uapi/linux/raw.h:CONFIG_MAX_RAW_DEVS
|
||||
|
||||
for c in $configs
|
||||
do
|
||||
warn=1
|
||||
leak_error=1
|
||||
|
||||
for ignore in $config_leak_ignores
|
||||
do
|
||||
if echo "$INFILE:$c" | grep -q "$ignore$"; then
|
||||
warn=
|
||||
leak_error=
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$warn" = 1 ]; then
|
||||
echo "warning: $INFILE: leak $c to user-space" >&2
|
||||
if [ "$leak_error" = 1 ]; then
|
||||
echo "error: $INFILE: leak $c to user-space" >&2
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
|
@ -241,8 +241,6 @@ on_signals()
|
||||
}
|
||||
trap on_signals HUP INT QUIT TERM
|
||||
|
||||
#
|
||||
#
|
||||
# Use "make V=1" to debug this script
|
||||
case "${KBUILD_VERBOSE}" in
|
||||
*1*)
|
||||
|
@ -6,7 +6,7 @@ ARCH=$2
|
||||
SMP=$3
|
||||
PREEMPT=$4
|
||||
PREEMPT_RT=$5
|
||||
CC=$6
|
||||
CC_VERSION="$6"
|
||||
LD=$7
|
||||
|
||||
vecho() { [ "${quiet}" = "silent_" ] || echo "$@" ; }
|
||||
@ -62,7 +62,6 @@ UTS_VERSION="$(echo $UTS_VERSION $CONFIG_FLAGS $TIMESTAMP | cut -b -$UTS_LEN)"
|
||||
printf '#define LINUX_COMPILE_BY "%s"\n' "$LINUX_COMPILE_BY"
|
||||
echo \#define LINUX_COMPILE_HOST \"$LINUX_COMPILE_HOST\"
|
||||
|
||||
CC_VERSION=$($CC -v 2>&1 | grep ' version ' | sed 's/[[:space:]]*$//')
|
||||
LD_VERSION=$($LD -v | head -n1 | sed 's/(compatible with [^)]*)//' \
|
||||
| sed 's/[[:space:]]*$//')
|
||||
printf '#define LINUX_COMPILER "%s"\n' "$CC_VERSION, $LD_VERSION"
|
||||
|
@ -41,4 +41,4 @@
|
||||
# so we just ignore them to let readprofile continue to work.
|
||||
# (At least sparc64 has __crc_ in the middle).
|
||||
|
||||
$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)\|\( .L\)' > $2
|
||||
$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)\|\( \.L\)' > $2
|
||||
|
@ -30,8 +30,6 @@ static int have_vmlinux = 0;
|
||||
static int all_versions = 0;
|
||||
/* If we are modposting external module set to 1 */
|
||||
static int external_module = 0;
|
||||
/* Warn about section mismatch in vmlinux if set to 1 */
|
||||
static int vmlinux_section_warnings = 1;
|
||||
/* Only warn about unresolved symbols */
|
||||
static int warn_unresolved = 0;
|
||||
/* How a symbol is exported */
|
||||
@ -90,20 +88,6 @@ static inline bool strends(const char *str, const char *postfix)
|
||||
return strcmp(str + strlen(str) - strlen(postfix), postfix) == 0;
|
||||
}
|
||||
|
||||
static int is_vmlinux(const char *modname)
|
||||
{
|
||||
const char *myname;
|
||||
|
||||
myname = strrchr(modname, '/');
|
||||
if (myname)
|
||||
myname++;
|
||||
else
|
||||
myname = modname;
|
||||
|
||||
return (strcmp(myname, "vmlinux") == 0) ||
|
||||
(strcmp(myname, "vmlinux.o") == 0);
|
||||
}
|
||||
|
||||
void *do_nofail(void *ptr, const char *expr)
|
||||
{
|
||||
if (!ptr)
|
||||
@ -112,6 +96,55 @@ void *do_nofail(void *ptr, const char *expr)
|
||||
return ptr;
|
||||
}
|
||||
|
||||
char *read_text_file(const char *filename)
|
||||
{
|
||||
struct stat st;
|
||||
size_t nbytes;
|
||||
int fd;
|
||||
char *buf;
|
||||
|
||||
fd = open(filename, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
perror(filename);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (fstat(fd, &st) < 0) {
|
||||
perror(filename);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
buf = NOFAIL(malloc(st.st_size + 1));
|
||||
|
||||
nbytes = st.st_size;
|
||||
|
||||
while (nbytes) {
|
||||
ssize_t bytes_read;
|
||||
|
||||
bytes_read = read(fd, buf, nbytes);
|
||||
if (bytes_read < 0) {
|
||||
perror(filename);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
nbytes -= bytes_read;
|
||||
}
|
||||
buf[st.st_size] = '\0';
|
||||
|
||||
close(fd);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
char *get_line(char **stringp)
|
||||
{
|
||||
/* do not return the unwanted extra line at EOF */
|
||||
if (*stringp && **stringp == '\0')
|
||||
return NULL;
|
||||
|
||||
return strsep(stringp, "\n");
|
||||
}
|
||||
|
||||
/* A list of all modules we processed */
|
||||
static struct module *modules;
|
||||
|
||||
@ -128,24 +161,20 @@ static struct module *find_module(const char *modname)
|
||||
static struct module *new_module(const char *modname)
|
||||
{
|
||||
struct module *mod;
|
||||
char *p;
|
||||
|
||||
mod = NOFAIL(malloc(sizeof(*mod)));
|
||||
mod = NOFAIL(malloc(sizeof(*mod) + strlen(modname) + 1));
|
||||
memset(mod, 0, sizeof(*mod));
|
||||
p = NOFAIL(strdup(modname));
|
||||
|
||||
/* strip trailing .o */
|
||||
if (strends(p, ".o")) {
|
||||
p[strlen(p) - 2] = '\0';
|
||||
mod->is_dot_o = 1;
|
||||
}
|
||||
|
||||
/* add to list */
|
||||
mod->name = p;
|
||||
strcpy(mod->name, modname);
|
||||
mod->is_vmlinux = (strcmp(modname, "vmlinux") == 0);
|
||||
mod->gpl_compatible = -1;
|
||||
mod->next = modules;
|
||||
modules = mod;
|
||||
|
||||
if (mod->is_vmlinux)
|
||||
have_vmlinux = 1;
|
||||
|
||||
return mod;
|
||||
}
|
||||
|
||||
@ -161,12 +190,9 @@ struct symbol {
|
||||
int crc_valid;
|
||||
char *namespace;
|
||||
unsigned int weak:1;
|
||||
unsigned int vmlinux:1; /* 1 if symbol is defined in vmlinux */
|
||||
unsigned int kernel:1; /* 1 if symbol is from kernel
|
||||
* (only for external modules) **/
|
||||
unsigned int is_static:1; /* 1 if symbol is not global */
|
||||
enum export export; /* Type of export */
|
||||
char name[0];
|
||||
char name[];
|
||||
};
|
||||
|
||||
static struct symbol *symbolhash[SYMBOL_HASH_SIZE];
|
||||
@ -288,31 +314,34 @@ static enum export export_no(const char *s)
|
||||
return export_unknown;
|
||||
}
|
||||
|
||||
static const char *sech_name(struct elf_info *elf, Elf_Shdr *sechdr)
|
||||
static void *sym_get_data_by_offset(const struct elf_info *info,
|
||||
unsigned int secindex, unsigned long offset)
|
||||
{
|
||||
return (void *)elf->hdr +
|
||||
elf->sechdrs[elf->secindex_strings].sh_offset +
|
||||
sechdr->sh_name;
|
||||
}
|
||||
|
||||
static const char *sec_name(struct elf_info *elf, int secindex)
|
||||
{
|
||||
return sech_name(elf, &elf->sechdrs[secindex]);
|
||||
}
|
||||
|
||||
static void *sym_get_data(const struct elf_info *info, const Elf_Sym *sym)
|
||||
{
|
||||
unsigned int secindex = get_secindex(info, sym);
|
||||
Elf_Shdr *sechdr = &info->sechdrs[secindex];
|
||||
unsigned long offset;
|
||||
|
||||
offset = sym->st_value;
|
||||
if (info->hdr->e_type != ET_REL)
|
||||
offset -= sechdr->sh_addr;
|
||||
|
||||
return (void *)info->hdr + sechdr->sh_offset + offset;
|
||||
}
|
||||
|
||||
static void *sym_get_data(const struct elf_info *info, const Elf_Sym *sym)
|
||||
{
|
||||
return sym_get_data_by_offset(info, get_secindex(info, sym),
|
||||
sym->st_value);
|
||||
}
|
||||
|
||||
static const char *sech_name(const struct elf_info *info, Elf_Shdr *sechdr)
|
||||
{
|
||||
return sym_get_data_by_offset(info, info->secindex_strings,
|
||||
sechdr->sh_name);
|
||||
}
|
||||
|
||||
static const char *sec_name(const struct elf_info *info, int secindex)
|
||||
{
|
||||
return sech_name(info, &info->sechdrs[secindex]);
|
||||
}
|
||||
|
||||
#define strstarts(str, prefix) (strncmp(str, prefix, strlen(prefix)) == 0)
|
||||
|
||||
static enum export export_from_secname(struct elf_info *elf, unsigned int sec)
|
||||
@ -386,17 +415,15 @@ static struct symbol *sym_add_exported(const char *name, struct module *mod,
|
||||
|
||||
if (!s) {
|
||||
s = new_symbol(name, mod, export);
|
||||
} else if (!external_module || is_vmlinux(s->module->name) ||
|
||||
} else if (!external_module || s->module->is_vmlinux ||
|
||||
s->module == mod) {
|
||||
warn("%s: '%s' exported twice. Previous export was in %s%s\n",
|
||||
mod->name, name, s->module->name,
|
||||
is_vmlinux(s->module->name) ? "" : ".ko");
|
||||
s->module->is_vmlinux ? "" : ".ko");
|
||||
return s;
|
||||
}
|
||||
|
||||
s->module = mod;
|
||||
s->vmlinux = is_vmlinux(mod->name);
|
||||
s->kernel = 0;
|
||||
s->export = export;
|
||||
return s;
|
||||
}
|
||||
@ -416,7 +443,7 @@ static void sym_set_crc(const char *name, unsigned int crc)
|
||||
s->crc_valid = 1;
|
||||
}
|
||||
|
||||
void *grab_file(const char *filename, unsigned long *size)
|
||||
static void *grab_file(const char *filename, size_t *size)
|
||||
{
|
||||
struct stat st;
|
||||
void *map = MAP_FAILED;
|
||||
@ -438,41 +465,7 @@ failed:
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a copy of the next line in a mmap'ed file.
|
||||
* spaces in the beginning of the line is trimmed away.
|
||||
* Return a pointer to a static buffer.
|
||||
**/
|
||||
char *get_next_line(unsigned long *pos, void *file, unsigned long size)
|
||||
{
|
||||
static char line[4096];
|
||||
int skip = 1;
|
||||
size_t len = 0;
|
||||
signed char *p = (signed char *)file + *pos;
|
||||
char *s = line;
|
||||
|
||||
for (; *pos < size ; (*pos)++) {
|
||||
if (skip && isspace(*p)) {
|
||||
p++;
|
||||
continue;
|
||||
}
|
||||
skip = 0;
|
||||
if (*p != '\n' && (*pos < size)) {
|
||||
len++;
|
||||
*s++ = *p++;
|
||||
if (len > 4095)
|
||||
break; /* Too long, stop */
|
||||
} else {
|
||||
/* End of string */
|
||||
*s = '\0';
|
||||
return line;
|
||||
}
|
||||
}
|
||||
/* End of buffer */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void release_file(void *file, unsigned long size)
|
||||
static void release_file(void *file, size_t size)
|
||||
{
|
||||
munmap(file, size);
|
||||
}
|
||||
@ -528,9 +521,8 @@ static int parse_elf(struct elf_info *info, const char *filename)
|
||||
|
||||
/* Check if file offset is correct */
|
||||
if (hdr->e_shoff > info->size) {
|
||||
fatal("section header offset=%lu in file '%s' is bigger than "
|
||||
"filesize=%lu\n", (unsigned long)hdr->e_shoff,
|
||||
filename, info->size);
|
||||
fatal("section header offset=%lu in file '%s' is bigger than filesize=%zu\n",
|
||||
(unsigned long)hdr->e_shoff, filename, info->size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -683,7 +675,7 @@ static void handle_modversion(const struct module *mod,
|
||||
|
||||
if (sym->st_shndx == SHN_UNDEF) {
|
||||
warn("EXPORT symbol \"%s\" [%s%s] version generation failed, symbol will not be versioned.\n",
|
||||
symname, mod->name, is_vmlinux(mod->name) ? "":".ko");
|
||||
symname, mod->name, mod->is_vmlinux ? "" : ".ko");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -705,8 +697,7 @@ static void handle_symbol(struct module *mod, struct elf_info *info,
|
||||
enum export export;
|
||||
const char *name;
|
||||
|
||||
if ((!is_vmlinux(mod->name) || mod->is_dot_o) &&
|
||||
strstarts(symname, "__ksymtab"))
|
||||
if (strstarts(symname, "__ksymtab"))
|
||||
export = export_from_secname(info, get_secindex(info, sym));
|
||||
else
|
||||
export = export_from_sec(info, get_secindex(info, sym));
|
||||
@ -1752,11 +1743,7 @@ static void check_section_mismatch(const char *modname, struct elf_info *elf,
|
||||
static unsigned int *reloc_location(struct elf_info *elf,
|
||||
Elf_Shdr *sechdr, Elf_Rela *r)
|
||||
{
|
||||
Elf_Shdr *sechdrs = elf->sechdrs;
|
||||
int section = sechdr->sh_info;
|
||||
|
||||
return (void *)elf->hdr + sechdrs[section].sh_offset +
|
||||
r->r_offset;
|
||||
return sym_get_data_by_offset(elf, sechdr->sh_info, r->r_offset);
|
||||
}
|
||||
|
||||
static int addend_386_rel(struct elf_info *elf, Elf_Shdr *sechdr, Elf_Rela *r)
|
||||
@ -2005,34 +1992,36 @@ static void read_symbols(const char *modname)
|
||||
if (!parse_elf(&info, modname))
|
||||
return;
|
||||
|
||||
mod = new_module(modname);
|
||||
{
|
||||
char *tmp;
|
||||
|
||||
/* When there's no vmlinux, don't print warnings about
|
||||
* unresolved symbols (since there'll be too many ;) */
|
||||
if (is_vmlinux(modname)) {
|
||||
have_vmlinux = 1;
|
||||
mod->skip = 1;
|
||||
/* strip trailing .o */
|
||||
tmp = NOFAIL(strdup(modname));
|
||||
tmp[strlen(tmp) - 2] = '\0';
|
||||
mod = new_module(tmp);
|
||||
free(tmp);
|
||||
}
|
||||
|
||||
license = get_modinfo(&info, "license");
|
||||
if (!license && !is_vmlinux(modname))
|
||||
warn("missing MODULE_LICENSE() in %s\n"
|
||||
"see include/linux/module.h for "
|
||||
"more information\n", modname);
|
||||
while (license) {
|
||||
if (license_is_gpl_compatible(license))
|
||||
mod->gpl_compatible = 1;
|
||||
else {
|
||||
mod->gpl_compatible = 0;
|
||||
break;
|
||||
if (!mod->is_vmlinux) {
|
||||
license = get_modinfo(&info, "license");
|
||||
if (!license)
|
||||
warn("missing MODULE_LICENSE() in %s\n", modname);
|
||||
while (license) {
|
||||
if (license_is_gpl_compatible(license))
|
||||
mod->gpl_compatible = 1;
|
||||
else {
|
||||
mod->gpl_compatible = 0;
|
||||
break;
|
||||
}
|
||||
license = get_next_modinfo(&info, "license", license);
|
||||
}
|
||||
license = get_next_modinfo(&info, "license", license);
|
||||
}
|
||||
|
||||
namespace = get_modinfo(&info, "import_ns");
|
||||
while (namespace) {
|
||||
add_namespace(&mod->imported_namespaces, namespace);
|
||||
namespace = get_next_modinfo(&info, "import_ns", namespace);
|
||||
namespace = get_modinfo(&info, "import_ns");
|
||||
while (namespace) {
|
||||
add_namespace(&mod->imported_namespaces, namespace);
|
||||
namespace = get_next_modinfo(&info, "import_ns",
|
||||
namespace);
|
||||
}
|
||||
}
|
||||
|
||||
for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
|
||||
@ -2070,16 +2059,14 @@ static void read_symbols(const char *modname)
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_vmlinux(modname) || vmlinux_section_warnings)
|
||||
check_sec_ref(mod, modname, &info);
|
||||
check_sec_ref(mod, modname, &info);
|
||||
|
||||
version = get_modinfo(&info, "version");
|
||||
if (version)
|
||||
maybe_frob_rcs_version(modname, version, info.modinfo,
|
||||
version - (char *)info.hdr);
|
||||
if (version || (all_versions && !is_vmlinux(modname)))
|
||||
get_src_version(modname, mod->srcversion,
|
||||
sizeof(mod->srcversion)-1);
|
||||
if (!mod->is_vmlinux) {
|
||||
version = get_modinfo(&info, "version");
|
||||
if (version || all_versions)
|
||||
get_src_version(modname, mod->srcversion,
|
||||
sizeof(mod->srcversion) - 1);
|
||||
}
|
||||
|
||||
parse_elf_finish(&info);
|
||||
|
||||
@ -2143,20 +2130,18 @@ void buf_write(struct buffer *buf, const char *s, int len)
|
||||
|
||||
static void check_for_gpl_usage(enum export exp, const char *m, const char *s)
|
||||
{
|
||||
const char *e = is_vmlinux(m) ?"":".ko";
|
||||
|
||||
switch (exp) {
|
||||
case export_gpl:
|
||||
fatal("GPL-incompatible module %s%s "
|
||||
"uses GPL-only symbol '%s'\n", m, e, s);
|
||||
fatal("GPL-incompatible module %s.ko uses GPL-only symbol '%s'\n",
|
||||
m, s);
|
||||
break;
|
||||
case export_unused_gpl:
|
||||
fatal("GPL-incompatible module %s%s "
|
||||
"uses GPL-only symbol marked UNUSED '%s'\n", m, e, s);
|
||||
fatal("GPL-incompatible module %s.ko uses GPL-only symbol marked UNUSED '%s'\n",
|
||||
m, s);
|
||||
break;
|
||||
case export_gpl_future:
|
||||
warn("GPL-incompatible module %s%s "
|
||||
"uses future GPL-only symbol '%s'\n", m, e, s);
|
||||
warn("GPL-incompatible module %s.ko uses future GPL-only symbol '%s'\n",
|
||||
m, s);
|
||||
break;
|
||||
case export_plain:
|
||||
case export_unused:
|
||||
@ -2168,13 +2153,11 @@ static void check_for_gpl_usage(enum export exp, const char *m, const char *s)
|
||||
|
||||
static void check_for_unused(enum export exp, const char *m, const char *s)
|
||||
{
|
||||
const char *e = is_vmlinux(m) ?"":".ko";
|
||||
|
||||
switch (exp) {
|
||||
case export_unused:
|
||||
case export_unused_gpl:
|
||||
warn("module %s%s "
|
||||
"uses symbol '%s' marked UNUSED\n", m, e, s);
|
||||
warn("module %s.ko uses symbol '%s' marked UNUSED\n",
|
||||
m, s);
|
||||
break;
|
||||
default:
|
||||
/* ignore */
|
||||
@ -2349,7 +2332,7 @@ static void add_depends(struct buffer *b, struct module *mod)
|
||||
/* Clear ->seen flag of modules that own symbols needed by this. */
|
||||
for (s = mod->unres; s; s = s->next)
|
||||
if (s->module)
|
||||
s->module->seen = is_vmlinux(s->module->name);
|
||||
s->module->seen = s->module->is_vmlinux;
|
||||
|
||||
buf_printf(b, "\n");
|
||||
buf_printf(b, "MODULE_INFO(depends, \"");
|
||||
@ -2382,6 +2365,25 @@ static void add_srcversion(struct buffer *b, struct module *mod)
|
||||
}
|
||||
}
|
||||
|
||||
static void write_buf(struct buffer *b, const char *fname)
|
||||
{
|
||||
FILE *file;
|
||||
|
||||
file = fopen(fname, "w");
|
||||
if (!file) {
|
||||
perror(fname);
|
||||
exit(1);
|
||||
}
|
||||
if (fwrite(b->p, 1, b->pos, file) != b->pos) {
|
||||
perror(fname);
|
||||
exit(1);
|
||||
}
|
||||
if (fclose(file) != 0) {
|
||||
perror(fname);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
static void write_if_changed(struct buffer *b, const char *fname)
|
||||
{
|
||||
char *tmp;
|
||||
@ -2414,32 +2416,24 @@ static void write_if_changed(struct buffer *b, const char *fname)
|
||||
close_write:
|
||||
fclose(file);
|
||||
write:
|
||||
file = fopen(fname, "w");
|
||||
if (!file) {
|
||||
perror(fname);
|
||||
exit(1);
|
||||
}
|
||||
if (fwrite(b->p, 1, b->pos, file) != b->pos) {
|
||||
perror(fname);
|
||||
exit(1);
|
||||
}
|
||||
fclose(file);
|
||||
write_buf(b, fname);
|
||||
}
|
||||
|
||||
/* parse Module.symvers file. line format:
|
||||
* 0x12345678<tab>symbol<tab>module<tab>export<tab>namespace
|
||||
**/
|
||||
static void read_dump(const char *fname, unsigned int kernel)
|
||||
static void read_dump(const char *fname)
|
||||
{
|
||||
unsigned long size, pos = 0;
|
||||
void *file = grab_file(fname, &size);
|
||||
char *line;
|
||||
char *buf, *pos, *line;
|
||||
|
||||
if (!file)
|
||||
buf = read_text_file(fname);
|
||||
if (!buf)
|
||||
/* No symbol versions, silently ignore */
|
||||
return;
|
||||
|
||||
while ((line = get_next_line(&pos, file, size))) {
|
||||
pos = buf;
|
||||
|
||||
while ((line = get_line(&pos))) {
|
||||
char *symname, *namespace, *modname, *d, *export;
|
||||
unsigned int crc;
|
||||
struct module *mod;
|
||||
@ -2463,21 +2457,18 @@ static void read_dump(const char *fname, unsigned int kernel)
|
||||
goto fail;
|
||||
mod = find_module(modname);
|
||||
if (!mod) {
|
||||
if (is_vmlinux(modname))
|
||||
have_vmlinux = 1;
|
||||
mod = new_module(modname);
|
||||
mod->skip = 1;
|
||||
mod->from_dump = 1;
|
||||
}
|
||||
s = sym_add_exported(symname, mod, export_no(export));
|
||||
s->kernel = kernel;
|
||||
s->is_static = 0;
|
||||
sym_set_crc(symname, crc);
|
||||
sym_update_namespace(symname, namespace);
|
||||
}
|
||||
release_file(file, size);
|
||||
free(buf);
|
||||
return;
|
||||
fail:
|
||||
release_file(file, size);
|
||||
free(buf);
|
||||
fatal("parse error in symbol dump file\n");
|
||||
}
|
||||
|
||||
@ -2489,7 +2480,7 @@ static int dump_sym(struct symbol *sym)
|
||||
{
|
||||
if (!external_module)
|
||||
return 1;
|
||||
if (sym->vmlinux || sym->kernel)
|
||||
if (sym->module->from_dump)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
@ -2515,7 +2506,7 @@ static void write_dump(const char *fname)
|
||||
symbol = symbol->next;
|
||||
}
|
||||
}
|
||||
write_if_changed(&buf, fname);
|
||||
write_buf(&buf, fname);
|
||||
free(buf.p);
|
||||
}
|
||||
|
||||
@ -2527,7 +2518,7 @@ static void write_namespace_deps_files(const char *fname)
|
||||
|
||||
for (mod = modules; mod; mod = mod->next) {
|
||||
|
||||
if (mod->skip || !mod->missing_namespaces)
|
||||
if (mod->from_dump || !mod->missing_namespaces)
|
||||
continue;
|
||||
|
||||
buf_printf(&ns_deps_buf, "%s.ko:", mod->name);
|
||||
@ -2542,8 +2533,8 @@ static void write_namespace_deps_files(const char *fname)
|
||||
free(ns_deps_buf.p);
|
||||
}
|
||||
|
||||
struct ext_sym_list {
|
||||
struct ext_sym_list *next;
|
||||
struct dump_list {
|
||||
struct dump_list *next;
|
||||
const char *file;
|
||||
};
|
||||
|
||||
@ -2551,28 +2542,24 @@ int main(int argc, char **argv)
|
||||
{
|
||||
struct module *mod;
|
||||
struct buffer buf = { };
|
||||
char *kernel_read = NULL;
|
||||
char *missing_namespace_deps = NULL;
|
||||
char *dump_write = NULL, *files_source = NULL;
|
||||
int opt;
|
||||
int err;
|
||||
int n;
|
||||
struct ext_sym_list *extsym_iter;
|
||||
struct ext_sym_list *extsym_start = NULL;
|
||||
struct dump_list *dump_read_start = NULL;
|
||||
struct dump_list **dump_read_iter = &dump_read_start;
|
||||
|
||||
while ((opt = getopt(argc, argv, "i:e:mnsT:o:awENd:")) != -1) {
|
||||
while ((opt = getopt(argc, argv, "ei:mnT:o:awENd:")) != -1) {
|
||||
switch (opt) {
|
||||
case 'i':
|
||||
kernel_read = optarg;
|
||||
external_module = 1;
|
||||
break;
|
||||
case 'e':
|
||||
external_module = 1;
|
||||
extsym_iter =
|
||||
NOFAIL(malloc(sizeof(*extsym_iter)));
|
||||
extsym_iter->next = extsym_start;
|
||||
extsym_iter->file = optarg;
|
||||
extsym_start = extsym_iter;
|
||||
break;
|
||||
case 'i':
|
||||
*dump_read_iter =
|
||||
NOFAIL(calloc(1, sizeof(**dump_read_iter)));
|
||||
(*dump_read_iter)->file = optarg;
|
||||
dump_read_iter = &(*dump_read_iter)->next;
|
||||
break;
|
||||
case 'm':
|
||||
modversions = 1;
|
||||
@ -2586,9 +2573,6 @@ int main(int argc, char **argv)
|
||||
case 'a':
|
||||
all_versions = 1;
|
||||
break;
|
||||
case 's':
|
||||
vmlinux_section_warnings = 0;
|
||||
break;
|
||||
case 'T':
|
||||
files_source = optarg;
|
||||
break;
|
||||
@ -2609,13 +2593,13 @@ int main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
|
||||
if (kernel_read)
|
||||
read_dump(kernel_read, 1);
|
||||
while (extsym_start) {
|
||||
read_dump(extsym_start->file, 0);
|
||||
extsym_iter = extsym_start->next;
|
||||
free(extsym_start);
|
||||
extsym_start = extsym_iter;
|
||||
while (dump_read_start) {
|
||||
struct dump_list *tmp;
|
||||
|
||||
read_dump(dump_read_start->file);
|
||||
tmp = dump_read_start->next;
|
||||
free(dump_read_start);
|
||||
dump_read_start = tmp;
|
||||
}
|
||||
|
||||
while (optind < argc)
|
||||
@ -2624,12 +2608,19 @@ int main(int argc, char **argv)
|
||||
if (files_source)
|
||||
read_symbols_from_files(files_source);
|
||||
|
||||
/*
|
||||
* When there's no vmlinux, don't print warnings about
|
||||
* unresolved symbols (since there'll be too many ;)
|
||||
*/
|
||||
if (!have_vmlinux)
|
||||
warn("Symbol info of vmlinux is missing. Unresolved symbol check will be entirely skipped.\n");
|
||||
|
||||
err = 0;
|
||||
|
||||
for (mod = modules; mod; mod = mod->next) {
|
||||
char fname[PATH_MAX];
|
||||
|
||||
if (mod->skip)
|
||||
if (mod->is_vmlinux || mod->from_dump)
|
||||
continue;
|
||||
|
||||
buf.pos = 0;
|
||||
@ -2662,13 +2653,6 @@ int main(int argc, char **argv)
|
||||
struct symbol *s;
|
||||
|
||||
for (s = symbolhash[n]; s; s = s->next) {
|
||||
/*
|
||||
* Do not check "vmlinux". This avoids the same warnings
|
||||
* shown twice, and false-positives for ARCH=um.
|
||||
*/
|
||||
if (is_vmlinux(s->module->name) && !s->module->is_dot_o)
|
||||
continue;
|
||||
|
||||
if (s->is_static)
|
||||
warn("\"%s\" [%s] is a static %s\n",
|
||||
s->name, s->module->name,
|
||||
|
@ -111,29 +111,29 @@ buf_write(struct buffer *buf, const char *s, int len);
|
||||
|
||||
struct namespace_list {
|
||||
struct namespace_list *next;
|
||||
char namespace[0];
|
||||
char namespace[];
|
||||
};
|
||||
|
||||
struct module {
|
||||
struct module *next;
|
||||
const char *name;
|
||||
int gpl_compatible;
|
||||
struct symbol *unres;
|
||||
int from_dump; /* 1 if module was loaded from *.symvers */
|
||||
int is_vmlinux;
|
||||
int seen;
|
||||
int skip;
|
||||
int has_init;
|
||||
int has_cleanup;
|
||||
struct buffer dev_table_buf;
|
||||
char srcversion[25];
|
||||
int is_dot_o;
|
||||
// Missing namespace dependencies
|
||||
struct namespace_list *missing_namespaces;
|
||||
// Actual imported namespaces
|
||||
struct namespace_list *imported_namespaces;
|
||||
char name[];
|
||||
};
|
||||
|
||||
struct elf_info {
|
||||
unsigned long size;
|
||||
size_t size;
|
||||
Elf_Ehdr *hdr;
|
||||
Elf_Shdr *sechdrs;
|
||||
Elf_Sym *symtab_start;
|
||||
@ -187,16 +187,11 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
|
||||
void add_moddevtable(struct buffer *buf, struct module *mod);
|
||||
|
||||
/* sumversion.c */
|
||||
void maybe_frob_rcs_version(const char *modfilename,
|
||||
char *version,
|
||||
void *modinfo,
|
||||
unsigned long modinfo_offset);
|
||||
void get_src_version(const char *modname, char sum[], unsigned sumlen);
|
||||
|
||||
/* from modpost.c */
|
||||
void *grab_file(const char *filename, unsigned long *size);
|
||||
char* get_next_line(unsigned long *pos, void *file, unsigned long size);
|
||||
void release_file(void *file, unsigned long size);
|
||||
char *read_text_file(const char *filename);
|
||||
char *get_line(char **stringp);
|
||||
|
||||
enum loglevel {
|
||||
LOG_WARN,
|
||||
|
@ -258,9 +258,8 @@ static int parse_file(const char *fname, struct md4_ctx *md)
|
||||
char *file;
|
||||
unsigned long i, len;
|
||||
|
||||
file = grab_file(fname, &len);
|
||||
if (!file)
|
||||
return 0;
|
||||
file = read_text_file(fname);
|
||||
len = strlen(file);
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
/* Collapse and ignore \ and CR. */
|
||||
@ -287,7 +286,7 @@ static int parse_file(const char *fname, struct md4_ctx *md)
|
||||
|
||||
add_char(file[i], md);
|
||||
}
|
||||
release_file(file, len);
|
||||
free(file);
|
||||
return 1;
|
||||
}
|
||||
/* Check whether the file is a static library or not */
|
||||
@ -304,9 +303,8 @@ static int is_static_library(const char *objfile)
|
||||
* to figure out source files. */
|
||||
static int parse_source_files(const char *objfile, struct md4_ctx *md)
|
||||
{
|
||||
char *cmd, *file, *line, *dir;
|
||||
char *cmd, *file, *line, *dir, *pos;
|
||||
const char *base;
|
||||
unsigned long flen, pos = 0;
|
||||
int dirlen, ret = 0, check_files = 0;
|
||||
|
||||
cmd = NOFAIL(malloc(strlen(objfile) + sizeof("..cmd")));
|
||||
@ -324,14 +322,12 @@ static int parse_source_files(const char *objfile, struct md4_ctx *md)
|
||||
strncpy(dir, objfile, dirlen);
|
||||
dir[dirlen] = '\0';
|
||||
|
||||
file = grab_file(cmd, &flen);
|
||||
if (!file) {
|
||||
warn("could not find %s for %s\n", cmd, objfile);
|
||||
goto out;
|
||||
}
|
||||
file = read_text_file(cmd);
|
||||
|
||||
pos = file;
|
||||
|
||||
/* Sum all files in the same dir or subdirs. */
|
||||
while ((line = get_next_line(&pos, file, flen)) != NULL) {
|
||||
while ((line = get_line(&pos))) {
|
||||
char* p = line;
|
||||
|
||||
if (strncmp(line, "source_", sizeof("source_")-1) == 0) {
|
||||
@ -382,8 +378,7 @@ static int parse_source_files(const char *objfile, struct md4_ctx *md)
|
||||
/* Everyone parsed OK */
|
||||
ret = 1;
|
||||
out_file:
|
||||
release_file(file, flen);
|
||||
out:
|
||||
free(file);
|
||||
free(dir);
|
||||
free(cmd);
|
||||
return ret;
|
||||
@ -392,106 +387,34 @@ out:
|
||||
/* Calc and record src checksum. */
|
||||
void get_src_version(const char *modname, char sum[], unsigned sumlen)
|
||||
{
|
||||
void *file;
|
||||
unsigned long len;
|
||||
char *buf, *pos, *firstline;
|
||||
struct md4_ctx md;
|
||||
char *sources, *end, *fname;
|
||||
char *fname;
|
||||
char filelist[PATH_MAX + 1];
|
||||
|
||||
/* objects for a module are listed in the first line of *.mod file. */
|
||||
snprintf(filelist, sizeof(filelist), "%.*smod",
|
||||
(int)strlen(modname) - 1, modname);
|
||||
|
||||
file = grab_file(filelist, &len);
|
||||
if (!file)
|
||||
/* not a module or .mod file missing - ignore */
|
||||
return;
|
||||
buf = read_text_file(filelist);
|
||||
|
||||
sources = file;
|
||||
|
||||
end = strchr(sources, '\n');
|
||||
if (!end) {
|
||||
pos = buf;
|
||||
firstline = get_line(&pos);
|
||||
if (!firstline) {
|
||||
warn("bad ending versions file for %s\n", modname);
|
||||
goto release;
|
||||
goto free;
|
||||
}
|
||||
*end = '\0';
|
||||
|
||||
md4_init(&md);
|
||||
while ((fname = strsep(&sources, " ")) != NULL) {
|
||||
while ((fname = strsep(&firstline, " "))) {
|
||||
if (!*fname)
|
||||
continue;
|
||||
if (!(is_static_library(fname)) &&
|
||||
!parse_source_files(fname, &md))
|
||||
goto release;
|
||||
goto free;
|
||||
}
|
||||
|
||||
md4_final_ascii(&md, sum, sumlen);
|
||||
release:
|
||||
release_file(file, len);
|
||||
}
|
||||
|
||||
static void write_version(const char *filename, const char *sum,
|
||||
unsigned long offset)
|
||||
{
|
||||
int fd;
|
||||
|
||||
fd = open(filename, O_RDWR);
|
||||
if (fd < 0) {
|
||||
warn("changing sum in %s failed: %s\n",
|
||||
filename, strerror(errno));
|
||||
return;
|
||||
}
|
||||
|
||||
if (lseek(fd, offset, SEEK_SET) == (off_t)-1) {
|
||||
warn("changing sum in %s:%lu failed: %s\n",
|
||||
filename, offset, strerror(errno));
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (write(fd, sum, strlen(sum)+1) != strlen(sum)+1) {
|
||||
warn("writing sum in %s failed: %s\n",
|
||||
filename, strerror(errno));
|
||||
goto out;
|
||||
}
|
||||
out:
|
||||
close(fd);
|
||||
}
|
||||
|
||||
static int strip_rcs_crap(char *version)
|
||||
{
|
||||
unsigned int len, full_len;
|
||||
|
||||
if (strncmp(version, "$Revision", strlen("$Revision")) != 0)
|
||||
return 0;
|
||||
|
||||
/* Space for version string follows. */
|
||||
full_len = strlen(version) + strlen(version + strlen(version) + 1) + 2;
|
||||
|
||||
/* Move string to start with version number: prefix will be
|
||||
* $Revision$ or $Revision: */
|
||||
len = strlen("$Revision");
|
||||
if (version[len] == ':' || version[len] == '$')
|
||||
len++;
|
||||
while (isspace(version[len]))
|
||||
len++;
|
||||
memmove(version, version+len, full_len-len);
|
||||
full_len -= len;
|
||||
|
||||
/* Preserve up to next whitespace. */
|
||||
len = 0;
|
||||
while (version[len] && !isspace(version[len]))
|
||||
len++;
|
||||
memmove(version + len, version + strlen(version),
|
||||
full_len - strlen(version));
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Clean up RCS-style version numbers. */
|
||||
void maybe_frob_rcs_version(const char *modfilename,
|
||||
char *version,
|
||||
void *modinfo,
|
||||
unsigned long version_offset)
|
||||
{
|
||||
if (strip_rcs_crap(version))
|
||||
write_version(modfilename, version, version_offset);
|
||||
free:
|
||||
free(buf);
|
||||
}
|
||||
|
@ -3,14 +3,24 @@
|
||||
|
||||
set -e
|
||||
|
||||
if [ $# != 1 ]; then
|
||||
echo "Usage: $0 <modules.order>" >& 2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit_code=0
|
||||
|
||||
# Check uniqueness of module names
|
||||
check_same_name_modules()
|
||||
{
|
||||
for m in $(sed 's:.*/::' modules.order | sort | uniq -d)
|
||||
for m in $(sed 's:.*/::' $1 | sort | uniq -d)
|
||||
do
|
||||
echo "warning: same module names found:" >&2
|
||||
echo "error: the following would cause module name conflict:" >&2
|
||||
sed -n "/\/$m/s:^: :p" modules.order >&2
|
||||
exit_code=1
|
||||
done
|
||||
}
|
||||
|
||||
check_same_name_modules
|
||||
check_same_name_modules "$1"
|
||||
|
||||
exit $exit_code
|
||||
|
@ -28,15 +28,15 @@ case "${1}" in
|
||||
opts=
|
||||
;;
|
||||
targz-pkg)
|
||||
opts=--gzip
|
||||
opts="-I ${_GZIP}"
|
||||
tarball=${tarball}.gz
|
||||
;;
|
||||
tarbz2-pkg)
|
||||
opts=--bzip2
|
||||
opts="-I ${_BZIP2}"
|
||||
tarball=${tarball}.bz2
|
||||
;;
|
||||
tarxz-pkg)
|
||||
opts=--xz
|
||||
opts="-I ${XZ}"
|
||||
tarball=${tarball}.xz
|
||||
;;
|
||||
*)
|
||||
|
@ -20,4 +20,4 @@ case $SRCARCH in
|
||||
sparc) BCJ=--sparc ;;
|
||||
esac
|
||||
|
||||
exec xz --check=crc32 $BCJ --lzma2=$LZMA2OPTS,dict=32MiB
|
||||
exec $XZ --check=crc32 $BCJ --lzma2=$LZMA2OPTS,dict=32MiB
|
||||
|
@ -8,7 +8,11 @@
|
||||
# We cannot go as far as adding -Wpedantic since it emits too many warnings.
|
||||
UAPI_CFLAGS := -std=c90 -Wall -Werror=implicit-function-declaration
|
||||
|
||||
override c_flags = $(UAPI_CFLAGS) -Wp,-MD,$(depfile) -I$(objtree)/usr/include
|
||||
# In theory, we do not care -m32 or -m64 for header compile tests.
|
||||
# It is here just because CONFIG_CC_CAN_LINK is tested with -m32 or -m64.
|
||||
UAPI_CFLAGS += $(filter -m32 -m64, $(KBUILD_CFLAGS))
|
||||
|
||||
override c_flags = $(UAPI_CFLAGS) -Wp,-MMD,$(depfile) -I$(objtree)/usr/include
|
||||
|
||||
# The following are excluded for now because they fail to build.
|
||||
#
|
||||
|
Loading…
Reference in New Issue
Block a user