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:
@@ -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
|
||||
|
Reference in New Issue
Block a user