mirror of
https://github.com/Qortal/Brooklyn.git
synced 2025-01-30 14:52:17 +00:00
update
This commit is contained in:
commit
26999baf09
@ -15,6 +15,10 @@ pound := \#
|
||||
# Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o
|
||||
dot-target = $(dir $@).$(notdir $@)
|
||||
|
||||
###
|
||||
# Name of target with a '.tmp_' as filename prefix. foo/bar.o => foo/.tmp_bar.o
|
||||
tmp-target = $(dir $@).tmp_$(notdir $@)
|
||||
|
||||
###
|
||||
# The temporary file to save gcc -MMD generated dependencies must not
|
||||
# contain a comma
|
||||
@ -138,9 +142,11 @@ check-FORCE = $(if $(filter FORCE, $^),,$(warning FORCE prerequisite is missing)
|
||||
if-changed-cond = $(newer-prereqs)$(cmd-check)$(check-FORCE)
|
||||
|
||||
# Execute command if command has changed or prerequisite(s) are updated.
|
||||
if_changed = $(if $(if-changed-cond), \
|
||||
if_changed = $(if $(if-changed-cond),$(cmd_and_savecmd),@:)
|
||||
|
||||
cmd_and_savecmd = \
|
||||
$(cmd); \
|
||||
printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:)
|
||||
printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd
|
||||
|
||||
# Execute the command and also postprocess generated .d dependencies file.
|
||||
if_changed_dep = $(if $(if-changed-cond),$(cmd_and_fixdep),@:)
|
||||
|
@ -25,7 +25,7 @@ failure = $(if-success,$(1),n,y)
|
||||
|
||||
# $(cc-option,<flag>)
|
||||
# Return y if the compiler supports <flag>, n otherwise
|
||||
cc-option = $(success,mkdir .tmp_$$$$; trap "rm -rf .tmp_$$$$" EXIT; $(CC) -Werror $(CLANG_FLAGS) $(1) -c -x c /dev/null -o .tmp_$$$$/tmp.o)
|
||||
cc-option = $(success,trap "rm -rf .tmp_$$" EXIT; mkdir .tmp_$$; $(CC) -Werror $(CLANG_FLAGS) $(1) -c -x c /dev/null -o .tmp_$$/tmp.o)
|
||||
|
||||
# $(ld-option,<flag>)
|
||||
# Return y if the linker supports <flag>, n otherwise
|
||||
|
@ -14,8 +14,8 @@ hostprogs-always-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE) += insert-sys-cert
|
||||
HOSTCFLAGS_sorttable.o = -I$(srctree)/tools/include
|
||||
HOSTLDLIBS_sorttable = -lpthread
|
||||
HOSTCFLAGS_asn1_compiler.o = -I$(srctree)/include
|
||||
HOSTCFLAGS_sign-file.o = $(shell pkg-config --cflags libcrypto 2> /dev/null)
|
||||
HOSTLDLIBS_sign-file = $(shell pkg-config --libs libcrypto 2> /dev/null || echo -lcrypto)
|
||||
HOSTCFLAGS_sign-file.o = $(shell $(HOSTPKG_CONFIG) --cflags libcrypto 2> /dev/null)
|
||||
HOSTLDLIBS_sign-file = $(shell $(HOSTPKG_CONFIG) --libs libcrypto 2> /dev/null || echo -lcrypto)
|
||||
|
||||
ifdef CONFIG_UNWINDER_ORC
|
||||
ifeq ($(ARCH),x86_64)
|
||||
|
@ -85,11 +85,8 @@ ifdef need-builtin
|
||||
targets-for-builtin += $(obj)/built-in.a
|
||||
endif
|
||||
|
||||
targets-for-modules := $(patsubst %.o, %.mod, $(filter %.o, $(obj-m)))
|
||||
|
||||
ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),)
|
||||
targets-for-modules += $(patsubst %.o, %.prelink.o, $(filter %.o, $(obj-m)))
|
||||
endif
|
||||
targets-for-modules := $(foreach x, o mod $(if $(CONFIG_TRIM_UNUSED_KSYMS), usyms), \
|
||||
$(patsubst %.o, %.$x, $(filter %.o, $(obj-m))))
|
||||
|
||||
ifdef need-modorder
|
||||
targets-for-modules += $(obj)/modules.order
|
||||
@ -125,18 +122,16 @@ cmd_cpp_i_c = $(CPP) $(c_flags) -o $@ $<
|
||||
$(obj)/%.i: $(src)/%.c FORCE
|
||||
$(call if_changed_dep,cpp_i_c)
|
||||
|
||||
genksyms = scripts/genksyms/genksyms \
|
||||
$(if $(1), -T $(2)) \
|
||||
$(if $(KBUILD_PRESERVE), -p) \
|
||||
-r $(or $(wildcard $(2:.symtypes=.symref)), /dev/null)
|
||||
|
||||
# These mirror gensymtypes_S and co below, keep them in synch.
|
||||
cmd_gensymtypes_c = \
|
||||
$(CPP) -D__GENKSYMS__ $(c_flags) $< | \
|
||||
scripts/genksyms/genksyms $(if $(1), -T $(2)) \
|
||||
$(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS)) \
|
||||
$(if $(KBUILD_PRESERVE),-p) \
|
||||
-r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
|
||||
cmd_gensymtypes_c = $(CPP) -D__GENKSYMS__ $(c_flags) $< | $(genksyms)
|
||||
|
||||
quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
|
||||
cmd_cc_symtypes_c = \
|
||||
$(call cmd_gensymtypes_c,true,$@) >/dev/null; \
|
||||
test -s $@ || rm -f $@
|
||||
cmd_cc_symtypes_c = $(call cmd_gensymtypes_c,true,$@) >/dev/null
|
||||
|
||||
$(obj)/%.symtypes : $(src)/%.c FORCE
|
||||
$(call cmd,cc_symtypes_c)
|
||||
@ -153,8 +148,18 @@ $(obj)/%.ll: $(src)/%.c FORCE
|
||||
# The C file is compiled and updated dependency information is generated.
|
||||
# (See cmd_cc_o_c + relevant part of rule_cc_o_c)
|
||||
|
||||
is-single-obj-m = $(and $(part-of-module),$(filter $@, $(obj-m)),y)
|
||||
|
||||
# When a module consists of a single object, there is no reason to keep LLVM IR.
|
||||
# Make $(LD) covert LLVM IR to ELF here.
|
||||
ifdef CONFIG_LTO_CLANG
|
||||
cmd_ld_single_m = $(if $(is-single-obj-m), ; $(LD) $(ld_flags) -r -o $(tmp-target) $@; mv $(tmp-target) $@)
|
||||
endif
|
||||
|
||||
quiet_cmd_cc_o_c = CC $(quiet_modtag) $@
|
||||
cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< $(cmd_objtool)
|
||||
cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< \
|
||||
$(cmd_ld_single_m) \
|
||||
$(cmd_objtool)
|
||||
|
||||
ifdef CONFIG_MODVERSIONS
|
||||
# When module versioning is enabled the following steps are executed:
|
||||
@ -162,35 +167,18 @@ ifdef CONFIG_MODVERSIONS
|
||||
# o if <file>.o doesn't contain a __ksymtab version, i.e. does
|
||||
# not export symbols, it's done.
|
||||
# o otherwise, we calculate symbol versions using the good old
|
||||
# genksyms on the preprocessed source and postprocess them in a way
|
||||
# that they are usable as a linker script
|
||||
# o generate .tmp_<file>.o from <file>.o using the linker to
|
||||
# replace the unresolved symbols __crc_exported_symbol with
|
||||
# the actual value of the checksum generated by genksyms
|
||||
# o remove .tmp_<file>.o to <file>.o
|
||||
# genksyms on the preprocessed source and dump them into the .cmd file.
|
||||
# o modpost will extract versions from that file and create *.c files that will
|
||||
# be compiled and linked to the kernel and/or modules.
|
||||
|
||||
ifdef CONFIG_LTO_CLANG
|
||||
# Generate .o.symversions files for each .o with exported symbols, and link these
|
||||
# to the kernel and/or modules at the end.
|
||||
cmd_modversions_c = \
|
||||
gen_symversions = \
|
||||
if $(NM) $@ 2>/dev/null | grep -q __ksymtab; then \
|
||||
$(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
|
||||
> $@.symversions; \
|
||||
else \
|
||||
rm -f $@.symversions; \
|
||||
fi;
|
||||
else
|
||||
cmd_modversions_c = \
|
||||
if $(OBJDUMP) -h $@ | grep -q __ksymtab; then \
|
||||
$(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
|
||||
> $(@D)/.tmp_$(@F:.o=.ver); \
|
||||
\
|
||||
$(LD) $(KBUILD_LDFLAGS) -r -o $(@D)/.tmp_$(@F) $@ \
|
||||
-T $(@D)/.tmp_$(@F:.o=.ver); \
|
||||
mv -f $(@D)/.tmp_$(@F) $@; \
|
||||
rm -f $(@D)/.tmp_$(@F:.o=.ver); \
|
||||
$(call cmd_gensymtypes_$(1),$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
|
||||
>> $(dot-target).cmd; \
|
||||
fi
|
||||
endif
|
||||
|
||||
cmd_gen_symversions_c = $(call gen_symversions,c)
|
||||
|
||||
endif
|
||||
|
||||
ifdef CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT
|
||||
@ -222,65 +210,38 @@ cmd_record_mcount = $(if $(findstring $(strip $(CC_FLAGS_FTRACE)),$(_c_flags)),
|
||||
$(sub_cmd_record_mcount))
|
||||
endif # CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT
|
||||
|
||||
ifdef CONFIG_STACK_VALIDATION
|
||||
|
||||
objtool := $(objtree)/tools/objtool/objtool
|
||||
|
||||
objtool_args = \
|
||||
$(if $(CONFIG_UNWINDER_ORC),orc generate,check) \
|
||||
$(if $(part-of-module), --module) \
|
||||
$(if $(CONFIG_X86_KERNEL_IBT), --lto --ibt) \
|
||||
$(if $(CONFIG_FRAME_POINTER),, --no-fp) \
|
||||
$(if $(CONFIG_GCOV_KERNEL), --no-unreachable) \
|
||||
$(if $(CONFIG_RETPOLINE), --retpoline) \
|
||||
$(if $(CONFIG_X86_SMAP), --uaccess) \
|
||||
$(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount) \
|
||||
$(if $(CONFIG_SLS), --sls)
|
||||
|
||||
cmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $@)
|
||||
cmd_gen_objtooldep = $(if $(objtool-enabled), { echo ; echo '$@: $$(wildcard $(objtool))' ; } >> $(dot-target).cmd)
|
||||
|
||||
endif # CONFIG_STACK_VALIDATION
|
||||
|
||||
ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),)
|
||||
|
||||
# Skip objtool for LLVM bitcode
|
||||
$(obj)/%.o: objtool-enabled :=
|
||||
|
||||
else
|
||||
|
||||
# 'OBJECT_FILES_NON_STANDARD := y': skip objtool checking for a directory
|
||||
# 'OBJECT_FILES_NON_STANDARD_foo.o := 'y': skip objtool checking for a file
|
||||
# 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip for a file
|
||||
|
||||
$(obj)/%.o: objtool-enabled = $(if $(filter-out y%, \
|
||||
$(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n),y)
|
||||
is-standard-object = $(if $(filter-out y%, $(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n),y)
|
||||
|
||||
endif
|
||||
$(obj)/%.o: objtool-enabled = $(if $(is-standard-object),$(if $(delay-objtool),$(is-single-obj-m),y))
|
||||
|
||||
ifdef CONFIG_TRIM_UNUSED_KSYMS
|
||||
cmd_gen_ksymdeps = \
|
||||
$(CONFIG_SHELL) $(srctree)/scripts/gen_ksymdeps.sh $@ >> $(dot-target).cmd
|
||||
|
||||
# List module undefined symbols
|
||||
undefined_syms = $(NM) $< | $(AWK) '$$1 == "U" { printf("%s%s", x++ ? " " : "", $$2) }';
|
||||
endif
|
||||
|
||||
cmd_check_local_export = $(srctree)/scripts/check-local-export $@
|
||||
|
||||
define rule_cc_o_c
|
||||
$(call cmd_and_fixdep,cc_o_c)
|
||||
$(call cmd,gen_ksymdeps)
|
||||
$(call cmd,check_local_export)
|
||||
$(call cmd,checksrc)
|
||||
$(call cmd,checkdoc)
|
||||
$(call cmd,gen_objtooldep)
|
||||
$(call cmd,modversions_c)
|
||||
$(call cmd,gen_symversions_c)
|
||||
$(call cmd,record_mcount)
|
||||
endef
|
||||
|
||||
define rule_as_o_S
|
||||
$(call cmd_and_fixdep,as_o_S)
|
||||
$(call cmd,gen_ksymdeps)
|
||||
$(call cmd,check_local_export)
|
||||
$(call cmd,gen_objtooldep)
|
||||
$(call cmd,modversions_S)
|
||||
$(call cmd,gen_symversions_S)
|
||||
endef
|
||||
|
||||
# Built-in and composite module parts
|
||||
@ -288,34 +249,20 @@ $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
|
||||
$(call if_changed_rule,cc_o_c)
|
||||
$(call cmd,force_checksrc)
|
||||
|
||||
ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),)
|
||||
# Module .o files may contain LLVM bitcode, compile them into native code
|
||||
# before ELF processing
|
||||
quiet_cmd_cc_prelink_modules = LD [M] $@
|
||||
cmd_cc_prelink_modules = \
|
||||
$(LD) $(ld_flags) -r -o $@ \
|
||||
$(shell [ -s $(@:.prelink.o=.o.symversions) ] && \
|
||||
echo -T $(@:.prelink.o=.o.symversions)) \
|
||||
--whole-archive $(filter-out FORCE,$^) \
|
||||
$(cmd_objtool)
|
||||
# To make this rule robust against "Argument list too long" error,
|
||||
# ensure to add $(obj)/ prefix by a shell command.
|
||||
cmd_mod = printf '%s\n' $(call real-search, $*.o, .o, -objs -y -m) | \
|
||||
$(AWK) '!x[$$0]++ { print("$(obj)/"$$0) }' > $@
|
||||
|
||||
# objtool was skipped for LLVM bitcode, run it now that we have compiled
|
||||
# modules into native code
|
||||
$(obj)/%.prelink.o: objtool-enabled = y
|
||||
$(obj)/%.prelink.o: part-of-module := y
|
||||
|
||||
$(obj)/%.prelink.o: $(obj)/%.o FORCE
|
||||
$(call if_changed,cc_prelink_modules)
|
||||
endif
|
||||
|
||||
cmd_mod = { \
|
||||
echo $(if $($*-objs)$($*-y)$($*-m), $(addprefix $(obj)/, $($*-objs) $($*-y) $($*-m)), $(@:.mod=.o)); \
|
||||
$(undefined_syms) echo; \
|
||||
} > $@
|
||||
|
||||
$(obj)/%.mod: $(obj)/%$(mod-prelink-ext).o FORCE
|
||||
$(obj)/%.mod: FORCE
|
||||
$(call if_changed,mod)
|
||||
|
||||
# List module undefined symbols
|
||||
cmd_undefined_syms = $(NM) $< | sed -n 's/^ *U //p' > $@
|
||||
|
||||
$(obj)/%.usyms: $(obj)/%.o FORCE
|
||||
$(call if_changed,undefined_syms)
|
||||
|
||||
quiet_cmd_cc_lst_c = MKLST $@
|
||||
cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \
|
||||
$(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \
|
||||
@ -344,16 +291,10 @@ cmd_gensymtypes_S = \
|
||||
$(CPP) $(a_flags) $< | \
|
||||
grep "\<___EXPORT_SYMBOL\>" | \
|
||||
sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ; } | \
|
||||
$(CPP) -D__GENKSYMS__ $(c_flags) -xc - | \
|
||||
scripts/genksyms/genksyms $(if $(1), -T $(2)) \
|
||||
$(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS)) \
|
||||
$(if $(KBUILD_PRESERVE),-p) \
|
||||
-r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
|
||||
$(CPP) -D__GENKSYMS__ $(c_flags) -xc - | $(genksyms)
|
||||
|
||||
quiet_cmd_cc_symtypes_S = SYM $(quiet_modtag) $@
|
||||
cmd_cc_symtypes_S = \
|
||||
$(call cmd_gensymtypes_S,true,$@) >/dev/null; \
|
||||
test -s $@ || rm -f $@
|
||||
cmd_cc_symtypes_S = $(call cmd_gensymtypes_S,true,$@) >/dev/null
|
||||
|
||||
$(obj)/%.symtypes : $(src)/%.S FORCE
|
||||
$(call cmd,cc_symtypes_S)
|
||||
@ -373,16 +314,8 @@ ifdef CONFIG_ASM_MODVERSIONS
|
||||
# versioning matches the C process described above, with difference that
|
||||
# we parse asm-prototypes.h C header to get function definitions.
|
||||
|
||||
cmd_modversions_S = \
|
||||
if $(OBJDUMP) -h $@ | grep -q __ksymtab; then \
|
||||
$(call cmd_gensymtypes_S,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
|
||||
> $(@D)/.tmp_$(@F:.o=.ver); \
|
||||
\
|
||||
$(LD) $(KBUILD_LDFLAGS) -r -o $(@D)/.tmp_$(@F) $@ \
|
||||
-T $(@D)/.tmp_$(@F:.o=.ver); \
|
||||
mv -f $(@D)/.tmp_$(@F) $@; \
|
||||
rm -f $(@D)/.tmp_$(@F:.o=.ver); \
|
||||
fi
|
||||
cmd_gen_symversions_S = $(call gen_symversions,S)
|
||||
|
||||
endif
|
||||
|
||||
$(obj)/%.o: $(src)/%.S FORCE
|
||||
@ -417,29 +350,19 @@ $(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler
|
||||
$(subdir-builtin): $(obj)/%/built-in.a: $(obj)/% ;
|
||||
$(subdir-modorder): $(obj)/%/modules.order: $(obj)/% ;
|
||||
|
||||
# combine symversions for later processing
|
||||
ifeq ($(CONFIG_LTO_CLANG) $(CONFIG_MODVERSIONS),y y)
|
||||
cmd_update_lto_symversions = \
|
||||
rm -f $@.symversions \
|
||||
$(foreach n, $(filter-out FORCE,$^), \
|
||||
$(if $(shell test -s $(n).symversions && echo y), \
|
||||
; cat $(n).symversions >> $@.symversions))
|
||||
else
|
||||
cmd_update_lto_symversions = echo >/dev/null
|
||||
endif
|
||||
|
||||
#
|
||||
# Rule to compile a set of .o files into one .a file (without symbol table)
|
||||
#
|
||||
# To make this rule robust against "Argument list too long" error,
|
||||
# remove $(obj)/ prefix, and restore it by a shell command.
|
||||
|
||||
quiet_cmd_ar_builtin = AR $@
|
||||
cmd_ar_builtin = rm -f $@; $(AR) cDPrST $@ $(real-prereqs)
|
||||
|
||||
quiet_cmd_ar_and_symver = AR $@
|
||||
cmd_ar_and_symver = $(cmd_update_lto_symversions); $(cmd_ar_builtin)
|
||||
cmd_ar_builtin = rm -f $@; \
|
||||
$(if $(real-prereqs), printf "$(obj)/%s " $(patsubst $(obj)/%,%,$(real-prereqs)) | xargs) \
|
||||
$(AR) cDPrST $@
|
||||
|
||||
$(obj)/built-in.a: $(real-obj-y) FORCE
|
||||
$(call if_changed,ar_and_symver)
|
||||
$(call if_changed,ar_builtin)
|
||||
|
||||
#
|
||||
# Rule to create modules.order file
|
||||
@ -459,32 +382,24 @@ $(obj)/modules.order: $(obj-m) FORCE
|
||||
#
|
||||
# Rule to compile a set of .o files into one .a file (with symbol table)
|
||||
#
|
||||
quiet_cmd_ar_lib = AR $@
|
||||
cmd_ar_lib = $(cmd_update_lto_symversions); $(cmd_ar)
|
||||
|
||||
$(obj)/lib.a: $(lib-y) FORCE
|
||||
$(call if_changed,ar_lib)
|
||||
$(call if_changed,ar)
|
||||
|
||||
# NOTE:
|
||||
# Do not replace $(filter %.o,^) with $(real-prereqs). When a single object
|
||||
# module is turned into a multi object module, $^ will contain header file
|
||||
# dependencies recorded in the .*.cmd file.
|
||||
ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),)
|
||||
quiet_cmd_link_multi-m = AR [M] $@
|
||||
cmd_link_multi-m = \
|
||||
$(cmd_update_lto_symversions); \
|
||||
rm -f $@; \
|
||||
$(AR) cDPrsT $@ $(filter %.o,$^)
|
||||
else
|
||||
quiet_cmd_link_multi-m = LD [M] $@
|
||||
cmd_link_multi-m = $(LD) $(ld_flags) -r -o $@ $(filter %.o,$^)
|
||||
endif
|
||||
quiet_cmd_ld_multi_m = LD [M] $@
|
||||
cmd_ld_multi_m = $(LD) $(ld_flags) -r -o $@ @$(patsubst %.o,%.mod,$@) $(cmd_objtool)
|
||||
|
||||
$(multi-obj-m): FORCE
|
||||
$(call if_changed,link_multi-m)
|
||||
define rule_ld_multi_m
|
||||
$(call cmd_and_savecmd,ld_multi_m)
|
||||
$(call cmd,gen_objtooldep)
|
||||
endef
|
||||
|
||||
$(multi-obj-m): objtool-enabled := $(delay-objtool)
|
||||
$(multi-obj-m): part-of-module := y
|
||||
$(multi-obj-m): %.o: %.mod FORCE
|
||||
$(call if_changed_rule,ld_multi_m)
|
||||
$(call multi_depend, $(multi-obj-m), .o, -objs -y -m)
|
||||
|
||||
targets += $(multi-obj-m)
|
||||
targets := $(filter-out $(PHONY), $(targets))
|
||||
|
||||
# Add intermediate targets:
|
||||
|
@ -36,13 +36,7 @@ __clean-files := \
|
||||
|
||||
__clean-files := $(filter-out $(no-clean-files), $(__clean-files))
|
||||
|
||||
# clean-files is given relative to the current directory, unless it
|
||||
# starts with $(objtree)/ (which means "./", so do not add "./" unless
|
||||
# you want to delete a file from the toplevel object directory).
|
||||
|
||||
__clean-files := $(wildcard \
|
||||
$(addprefix $(obj)/, $(filter-out $(objtree)/%, $(__clean-files))) \
|
||||
$(filter $(objtree)/%, $(__clean-files)))
|
||||
__clean-files := $(wildcard $(addprefix $(obj)/, $(__clean-files)))
|
||||
|
||||
# ==========================================================================
|
||||
|
||||
|
@ -21,8 +21,8 @@ TMPOUT = $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_$$$$
|
||||
# automatically cleaned up.
|
||||
try-run = $(shell set -e; \
|
||||
TMP=$(TMPOUT)/tmp; \
|
||||
mkdir -p $(TMPOUT); \
|
||||
trap "rm -rf $(TMPOUT)" EXIT; \
|
||||
mkdir -p $(TMPOUT); \
|
||||
if ($(1)) >/dev/null 2>&1; \
|
||||
then echo "$(2)"; \
|
||||
else echo "$(3)"; \
|
||||
|
@ -2,8 +2,8 @@
|
||||
# ==========================================================================
|
||||
# make W=... settings
|
||||
#
|
||||
# There are three warning groups enabled by W=1, W=2, W=3.
|
||||
# They are independent, and can be combined like W=12 or W=123.
|
||||
# There are four warning groups enabled by W=1, W=2, W=3, and W=e
|
||||
# They are independent, and can be combined like W=12 or W=123e.
|
||||
# ==========================================================================
|
||||
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, packed-not-aligned)
|
||||
@ -47,9 +47,20 @@ else
|
||||
|
||||
ifdef CONFIG_CC_IS_CLANG
|
||||
KBUILD_CFLAGS += -Wno-initializer-overrides
|
||||
# Clang before clang-16 would warn on default argument promotions.
|
||||
ifeq ($(shell [ $(CONFIG_CLANG_VERSION) -lt 160000 ] && echo y),y)
|
||||
# Disable -Wformat
|
||||
KBUILD_CFLAGS += -Wno-format
|
||||
# Then re-enable flags that were part of the -Wformat group that aren't
|
||||
# problematic.
|
||||
KBUILD_CFLAGS += -Wformat-extra-args -Wformat-invalid-specifier
|
||||
KBUILD_CFLAGS += -Wformat-zero-length -Wnonnull
|
||||
# Requires clang-12+.
|
||||
ifeq ($(shell [ $(CONFIG_CLANG_VERSION) -ge 120000 ] && echo y),y)
|
||||
KBUILD_CFLAGS += -Wformat-insufficient-args
|
||||
endif
|
||||
endif
|
||||
KBUILD_CFLAGS += -Wno-sign-compare
|
||||
KBUILD_CFLAGS += -Wno-format-zero-length
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast)
|
||||
KBUILD_CFLAGS += -Wno-tautological-constant-out-of-range-compare
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access)
|
||||
@ -94,3 +105,12 @@ KBUILD_CFLAGS += $(call cc-option, -Wpacked-bitfield-compat)
|
||||
KBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN3
|
||||
|
||||
endif
|
||||
|
||||
#
|
||||
# W=e - error out on warnings
|
||||
#
|
||||
ifneq ($(findstring e, $(KBUILD_EXTRA_WARN)),)
|
||||
|
||||
KBUILD_CFLAGS += -Werror
|
||||
|
||||
endif
|
||||
|
@ -4,12 +4,10 @@ gcc-plugin-$(CONFIG_GCC_PLUGIN_LATENT_ENTROPY) += latent_entropy_plugin.so
|
||||
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_LATENT_ENTROPY) \
|
||||
+= -DLATENT_ENTROPY_PLUGIN
|
||||
ifdef CONFIG_GCC_PLUGIN_LATENT_ENTROPY
|
||||
DISABLE_LATENT_ENTROPY_PLUGIN += -fplugin-arg-latent_entropy_plugin-disable
|
||||
DISABLE_LATENT_ENTROPY_PLUGIN += -fplugin-arg-latent_entropy_plugin-disable -ULATENT_ENTROPY_PLUGIN
|
||||
endif
|
||||
export DISABLE_LATENT_ENTROPY_PLUGIN
|
||||
|
||||
gcc-plugin-$(CONFIG_GCC_PLUGIN_SANCOV) += sancov_plugin.so
|
||||
|
||||
gcc-plugin-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) += structleak_plugin.so
|
||||
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_VERBOSE) \
|
||||
+= -fplugin-arg-structleak_plugin-verbose
|
||||
@ -24,12 +22,6 @@ export DISABLE_STRUCTLEAK_PLUGIN
|
||||
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) \
|
||||
+= -DSTRUCTLEAK_PLUGIN
|
||||
|
||||
gcc-plugin-$(CONFIG_GCC_PLUGIN_RANDSTRUCT) += randomize_layout_plugin.so
|
||||
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_RANDSTRUCT) \
|
||||
+= -DRANDSTRUCT_PLUGIN
|
||||
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_RANDSTRUCT_PERFORMANCE) \
|
||||
+= -fplugin-arg-randomize_layout_plugin-performance-mode
|
||||
|
||||
gcc-plugin-$(CONFIG_GCC_PLUGIN_STACKLEAK) += stackleak_plugin.so
|
||||
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STACKLEAK) \
|
||||
+= -DSTACKLEAK_PLUGIN
|
||||
@ -53,13 +45,19 @@ export DISABLE_ARM_SSP_PER_TASK_PLUGIN
|
||||
# All the plugin CFLAGS are collected here in case a build target needs to
|
||||
# filter them out of the KBUILD_CFLAGS.
|
||||
GCC_PLUGINS_CFLAGS := $(strip $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y)) $(gcc-plugin-cflags-y))
|
||||
# The sancov_plugin.so is included via CFLAGS_KCOV, so it is removed here.
|
||||
GCC_PLUGINS_CFLAGS := $(filter-out %/sancov_plugin.so, $(GCC_PLUGINS_CFLAGS))
|
||||
export GCC_PLUGINS_CFLAGS
|
||||
|
||||
# Add the flags to the build!
|
||||
KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS)
|
||||
|
||||
# All enabled GCC plugins are collected here for building below.
|
||||
GCC_PLUGIN := $(gcc-plugin-y)
|
||||
# Some plugins are enabled outside of this Makefile, but they still need to
|
||||
# be included in GCC_PLUGIN so they can get built.
|
||||
gcc-plugin-external-$(CONFIG_GCC_PLUGIN_SANCOV) \
|
||||
+= sancov_plugin.so
|
||||
gcc-plugin-external-$(CONFIG_GCC_PLUGIN_RANDSTRUCT) \
|
||||
+= randomize_layout_plugin.so
|
||||
|
||||
# All enabled GCC plugins are collected here for building in
|
||||
# scripts/gcc-scripts/Makefile.
|
||||
GCC_PLUGIN := $(gcc-plugin-y) $(gcc-plugin-external-y)
|
||||
export GCC_PLUGIN
|
||||
|
@ -225,20 +225,40 @@ dtc_cpp_flags = -Wp,-MMD,$(depfile).pre.tmp -nostdinc \
|
||||
$(addprefix -I,$(DTC_INCLUDE)) \
|
||||
-undef -D__DTS__
|
||||
|
||||
ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),)
|
||||
# With CONFIG_LTO_CLANG, .o files in modules might be LLVM bitcode, so we
|
||||
# need to run LTO to compile them into native code (.lto.o) before further
|
||||
# processing.
|
||||
mod-prelink-ext := .prelink
|
||||
endif
|
||||
ifdef CONFIG_OBJTOOL
|
||||
|
||||
objtool := $(objtree)/tools/objtool/objtool
|
||||
|
||||
objtool_args = \
|
||||
$(if $(CONFIG_HAVE_JUMP_LABEL_HACK), --hacks=jump_label) \
|
||||
$(if $(CONFIG_HAVE_NOINSTR_HACK), --hacks=noinstr) \
|
||||
$(if $(CONFIG_X86_KERNEL_IBT), --ibt) \
|
||||
$(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount) \
|
||||
$(if $(CONFIG_UNWINDER_ORC), --orc) \
|
||||
$(if $(CONFIG_RETPOLINE), --retpoline) \
|
||||
$(if $(CONFIG_RETHUNK), --rethunk) \
|
||||
$(if $(CONFIG_SLS), --sls) \
|
||||
$(if $(CONFIG_STACK_VALIDATION), --stackval) \
|
||||
$(if $(CONFIG_HAVE_STATIC_CALL_INLINE), --static-call) \
|
||||
$(if $(CONFIG_HAVE_UACCESS_VALIDATION), --uaccess) \
|
||||
$(if $(delay-objtool), --link) \
|
||||
$(if $(part-of-module), --module) \
|
||||
$(if $(CONFIG_GCOV_KERNEL), --no-unreachable)
|
||||
|
||||
delay-objtool := $(or $(CONFIG_LTO_CLANG),$(CONFIG_X86_KERNEL_IBT))
|
||||
|
||||
cmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $@)
|
||||
cmd_gen_objtooldep = $(if $(objtool-enabled), { echo ; echo '$@: $$(wildcard $(objtool))' ; } >> $(dot-target).cmd)
|
||||
|
||||
endif # CONFIG_OBJTOOL
|
||||
|
||||
# Useful for describing the dependency of composite objects
|
||||
# Usage:
|
||||
# $(call multi_depend, multi_used_targets, suffix_to_remove, suffix_to_add)
|
||||
define multi_depend
|
||||
$(foreach m, $(notdir $1), \
|
||||
$(eval $(obj)/$m: \
|
||||
$(addprefix $(obj)/, $(foreach s, $3, $($(m:%$(strip $2)=%$(s)))))))
|
||||
$(foreach m, $1, \
|
||||
$(eval $m: \
|
||||
$(addprefix $(obj)/, $(call suffix-search, $(patsubst $(obj)/%,%,$m), $2, $3))))
|
||||
endef
|
||||
|
||||
# Copy a file
|
||||
|
@ -9,7 +9,7 @@ __modfinal:
|
||||
include include/config/auto.conf
|
||||
include $(srctree)/scripts/Kbuild.include
|
||||
|
||||
# for c_flags and mod-prelink-ext
|
||||
# for c_flags
|
||||
include $(srctree)/scripts/Makefile.lib
|
||||
|
||||
# find all modules listed in modules.order
|
||||
@ -54,9 +54,8 @@ if_changed_except = $(if $(call newer_prereqs_except,$(2))$(cmd-check), \
|
||||
$(cmd); \
|
||||
printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:)
|
||||
|
||||
|
||||
# Re-generate module BTFs if either module's .ko or vmlinux changed
|
||||
$(modules): %.ko: %$(mod-prelink-ext).o %.mod.o scripts/module.lds $(if $(KBUILD_BUILTIN),vmlinux) FORCE
|
||||
$(modules): %.ko: %.o %.mod.o scripts/module.lds $(if $(KBUILD_BUILTIN),vmlinux) FORCE
|
||||
+$(call if_changed_except,ld_ko_o,vmlinux)
|
||||
ifdef CONFIG_DEBUG_INFO_BTF_MODULES
|
||||
+$(if $(newer-prereqs),$(call cmd,btf_ko))
|
||||
|
@ -18,6 +18,9 @@ INSTALL_MOD_DIR ?= extra
|
||||
dst := $(MODLIB)/$(INSTALL_MOD_DIR)
|
||||
endif
|
||||
|
||||
$(foreach x, % :, $(if $(findstring $x, $(dst)), \
|
||||
$(error module installation path cannot contain '$x')))
|
||||
|
||||
suffix-y :=
|
||||
suffix-$(CONFIG_MODULE_COMPRESS_GZIP) := .gz
|
||||
suffix-$(CONFIG_MODULE_COMPRESS_XZ) := .xz
|
||||
@ -28,9 +31,6 @@ modules := $(patsubst $(extmod_prefix)%, $(dst)/%$(suffix-y), $(modules))
|
||||
__modinst: $(modules)
|
||||
@:
|
||||
|
||||
quiet_cmd_none =
|
||||
cmd_none = :
|
||||
|
||||
#
|
||||
# Installation
|
||||
#
|
||||
|
@ -41,9 +41,6 @@ __modpost:
|
||||
include include/config/auto.conf
|
||||
include $(srctree)/scripts/Kbuild.include
|
||||
|
||||
# for mod-prelink-ext
|
||||
include $(srctree)/scripts/Makefile.lib
|
||||
|
||||
MODPOST = scripts/mod/modpost \
|
||||
$(if $(CONFIG_MODVERSIONS),-m) \
|
||||
$(if $(CONFIG_MODULE_SRCVERSION_ALL),-a) \
|
||||
@ -87,8 +84,7 @@ obj := $(KBUILD_EXTMOD)
|
||||
src := $(obj)
|
||||
|
||||
# Include the module's Makefile to find KBUILD_EXTRA_SYMBOLS
|
||||
include $(if $(wildcard $(KBUILD_EXTMOD)/Kbuild), \
|
||||
$(KBUILD_EXTMOD)/Kbuild, $(KBUILD_EXTMOD)/Makefile)
|
||||
include $(or $(wildcard $(src)/Kbuild), $(src)/Makefile)
|
||||
|
||||
# modpost option for external modules
|
||||
MODPOST += -e
|
||||
@ -118,8 +114,6 @@ $(input-symdump):
|
||||
@echo >&2 ' Modules may not have dependencies or modversions.'
|
||||
@echo >&2 ' You may get many unresolved symbol warnings.'
|
||||
|
||||
modules := $(sort $(shell cat $(MODORDER)))
|
||||
|
||||
# KBUILD_MODPOST_WARN can be set to avoid error out in case of undefined symbols
|
||||
ifneq ($(KBUILD_MODPOST_WARN)$(filter-out $(existing-input-symdump), $(input-symdump)),)
|
||||
MODPOST += -w
|
||||
@ -128,9 +122,9 @@ endif
|
||||
# Read out modules.order to pass in modpost.
|
||||
# Otherwise, allmodconfig would fail with "Argument list too long".
|
||||
quiet_cmd_modpost = MODPOST $@
|
||||
cmd_modpost = sed 's/\.ko$$/$(mod-prelink-ext)\.o/' $< | $(MODPOST) -T -
|
||||
cmd_modpost = sed 's/ko$$/o/' $< | $(MODPOST) -T -
|
||||
|
||||
$(output-symdump): $(MODORDER) $(input-symdump) $(modules:.ko=$(mod-prelink-ext).o) FORCE
|
||||
$(output-symdump): $(MODORDER) $(input-symdump) FORCE
|
||||
$(call if_changed,modpost)
|
||||
|
||||
targets += $(output-symdump)
|
||||
|
@ -56,7 +56,7 @@ rpm-pkg:
|
||||
$(MAKE) clean
|
||||
$(CONFIG_SHELL) $(MKSPEC) >$(objtree)/kernel.spec
|
||||
$(call cmd,src_tar,$(KERNELPATH),kernel.spec)
|
||||
+rpmbuild $(RPMOPTS) --target $(UTS_MACHINE) -ta $(KERNELPATH).tar.gz \
|
||||
+rpmbuild $(RPMOPTS) --target $(UTS_MACHINE)-linux -ta $(KERNELPATH).tar.gz \
|
||||
--define='_smp_mflags %{nil}'
|
||||
|
||||
# binrpm-pkg
|
||||
@ -66,7 +66,7 @@ binrpm-pkg:
|
||||
$(MAKE) -f $(srctree)/Makefile
|
||||
$(CONFIG_SHELL) $(MKSPEC) prebuilt > $(objtree)/binkernel.spec
|
||||
+rpmbuild $(RPMOPTS) --define "_builddir $(objtree)" --target \
|
||||
$(UTS_MACHINE) -bb $(objtree)/binkernel.spec
|
||||
$(UTS_MACHINE)-linux -bb $(objtree)/binkernel.spec
|
||||
|
||||
PHONY += deb-pkg
|
||||
deb-pkg:
|
||||
|
@ -35,7 +35,7 @@ case "$KBUILD_VERBOSE" in
|
||||
esac
|
||||
|
||||
# Generate a new symbol list file
|
||||
$CONFIG_SHELL $srctree/scripts/gen_autoksyms.sh "$new_ksyms_file"
|
||||
$CONFIG_SHELL $srctree/scripts/gen_autoksyms.sh --modorder "$new_ksyms_file"
|
||||
|
||||
# Extract changes between old and new list and touch corresponding
|
||||
# dependency files.
|
||||
|
@ -164,41 +164,44 @@ gen_xchg_fallbacks()
|
||||
|
||||
gen_try_cmpxchg_fallback()
|
||||
{
|
||||
local cmpxchg="$1"; shift;
|
||||
local order="$1"; shift;
|
||||
|
||||
cat <<EOF
|
||||
#ifndef arch_try_cmpxchg${order}
|
||||
#define arch_try_cmpxchg${order}(_ptr, _oldp, _new) \\
|
||||
#ifndef arch_try_${cmpxchg}${order}
|
||||
#define arch_try_${cmpxchg}${order}(_ptr, _oldp, _new) \\
|
||||
({ \\
|
||||
typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \\
|
||||
___r = arch_cmpxchg${order}((_ptr), ___o, (_new)); \\
|
||||
___r = arch_${cmpxchg}${order}((_ptr), ___o, (_new)); \\
|
||||
if (unlikely(___r != ___o)) \\
|
||||
*___op = ___r; \\
|
||||
likely(___r == ___o); \\
|
||||
})
|
||||
#endif /* arch_try_cmpxchg${order} */
|
||||
#endif /* arch_try_${cmpxchg}${order} */
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
gen_try_cmpxchg_fallbacks()
|
||||
{
|
||||
printf "#ifndef arch_try_cmpxchg_relaxed\n"
|
||||
printf "#ifdef arch_try_cmpxchg\n"
|
||||
local cmpxchg="$1"; shift;
|
||||
|
||||
gen_basic_fallbacks "arch_try_cmpxchg"
|
||||
printf "#ifndef arch_try_${cmpxchg}_relaxed\n"
|
||||
printf "#ifdef arch_try_${cmpxchg}\n"
|
||||
|
||||
printf "#endif /* arch_try_cmpxchg */\n\n"
|
||||
gen_basic_fallbacks "arch_try_${cmpxchg}"
|
||||
|
||||
printf "#endif /* arch_try_${cmpxchg} */\n\n"
|
||||
|
||||
for order in "" "_acquire" "_release" "_relaxed"; do
|
||||
gen_try_cmpxchg_fallback "${order}"
|
||||
gen_try_cmpxchg_fallback "${cmpxchg}" "${order}"
|
||||
done
|
||||
|
||||
printf "#else /* arch_try_cmpxchg_relaxed */\n"
|
||||
printf "#else /* arch_try_${cmpxchg}_relaxed */\n"
|
||||
|
||||
gen_order_fallbacks "arch_try_cmpxchg"
|
||||
gen_order_fallbacks "arch_try_${cmpxchg}"
|
||||
|
||||
printf "#endif /* arch_try_cmpxchg_relaxed */\n\n"
|
||||
printf "#endif /* arch_try_${cmpxchg}_relaxed */\n\n"
|
||||
}
|
||||
|
||||
cat << EOF
|
||||
@ -218,7 +221,9 @@ for xchg in "arch_xchg" "arch_cmpxchg" "arch_cmpxchg64"; do
|
||||
gen_xchg_fallbacks "${xchg}"
|
||||
done
|
||||
|
||||
gen_try_cmpxchg_fallbacks
|
||||
for cmpxchg in "cmpxchg" "cmpxchg64"; do
|
||||
gen_try_cmpxchg_fallbacks "${cmpxchg}"
|
||||
done
|
||||
|
||||
grep '^[a-z]' "$1" | while read name meta args; do
|
||||
gen_proto "${meta}" "${name}" "atomic" "int" ${args}
|
||||
|
@ -166,7 +166,7 @@ grep '^[a-z]' "$1" | while read name meta args; do
|
||||
done
|
||||
|
||||
|
||||
for xchg in "xchg" "cmpxchg" "cmpxchg64" "try_cmpxchg"; do
|
||||
for xchg in "xchg" "cmpxchg" "cmpxchg64" "try_cmpxchg" "try_cmpxchg64"; do
|
||||
for order in "" "_acquire" "_release" "_relaxed"; do
|
||||
gen_xchg "${xchg}" "${order}" ""
|
||||
printf "\n"
|
||||
|
1
scripts/basic/.gitignore
vendored
1
scripts/basic/.gitignore
vendored
@ -1,2 +1,3 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
/fixdep
|
||||
/randstruct.seed
|
||||
|
@ -3,3 +3,14 @@
|
||||
# fixdep: used to generate dependency information during build process
|
||||
|
||||
hostprogs-always-y += fixdep
|
||||
|
||||
# randstruct: the seed is needed before building the gcc-plugin or
|
||||
# before running a Clang kernel build.
|
||||
gen-randstruct-seed := $(srctree)/scripts/gen-randstruct-seed.sh
|
||||
quiet_cmd_create_randstruct_seed = GENSEED $@
|
||||
cmd_create_randstruct_seed = \
|
||||
$(CONFIG_SHELL) $(gen-randstruct-seed) \
|
||||
$@ $(objtree)/include/generated/randstruct_hash.h
|
||||
$(obj)/randstruct.seed: $(gen-randstruct-seed) FORCE
|
||||
$(call if_changed,create_randstruct_seed)
|
||||
always-$(CONFIG_RANDSTRUCT) += randstruct.seed
|
||||
|
@ -7,24 +7,31 @@
|
||||
# This software may be used and distributed according to the terms
|
||||
# of the GNU General Public License, incorporated herein by reference.
|
||||
|
||||
import sys, os, re
|
||||
import sys, os, re, argparse
|
||||
from signal import signal, SIGPIPE, SIG_DFL
|
||||
|
||||
signal(SIGPIPE, SIG_DFL)
|
||||
|
||||
if len(sys.argv) < 3:
|
||||
sys.stderr.write("usage: %s [option] file1 file2\n" % sys.argv[0])
|
||||
sys.stderr.write("The options are:\n")
|
||||
sys.stderr.write("-c categorize output based on symbol type\n")
|
||||
sys.stderr.write("-d Show delta of Data Section\n")
|
||||
sys.stderr.write("-t Show delta of text Section\n")
|
||||
sys.exit(-1)
|
||||
parser = argparse.ArgumentParser(description="Simple script used to compare the symbol sizes of 2 object files")
|
||||
group = parser.add_mutually_exclusive_group()
|
||||
group.add_argument('-c', help='categorize output based on symbol type', action='store_true')
|
||||
group.add_argument('-d', help='Show delta of Data Section', action='store_true')
|
||||
group.add_argument('-t', help='Show delta of text Section', action='store_true')
|
||||
parser.add_argument('-p', dest='prefix', help='Arch prefix for the tool being used. Useful in cross build scenarios')
|
||||
parser.add_argument('file1', help='First file to compare')
|
||||
parser.add_argument('file2', help='Second file to compare')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
re_NUMBER = re.compile(r'\.[0-9]+')
|
||||
|
||||
def getsizes(file, format):
|
||||
sym = {}
|
||||
with os.popen("nm --size-sort " + file) as f:
|
||||
nm = "nm"
|
||||
if args.prefix:
|
||||
nm = "{}nm".format(args.prefix)
|
||||
|
||||
with os.popen("{} --size-sort {}".format(nm, file)) as f:
|
||||
for line in f:
|
||||
if line.startswith("\n") or ":" in line:
|
||||
continue
|
||||
@ -36,6 +43,7 @@ def getsizes(file, format):
|
||||
if name.startswith("__se_compat_sys"): continue
|
||||
if name.startswith("__addressable_"): continue
|
||||
if name == "linux_banner": continue
|
||||
if name == "vermagic": continue
|
||||
# statics and some other optimizations adds random .NUMBER
|
||||
name = re_NUMBER.sub('', name)
|
||||
sym[name] = sym.get(name, 0) + int(size, 16)
|
||||
@ -76,9 +84,9 @@ def calc(oldfile, newfile, format):
|
||||
delta.reverse()
|
||||
return grow, shrink, add, remove, up, down, delta, old, new, otot, ntot
|
||||
|
||||
def print_result(symboltype, symbolformat, argc):
|
||||
def print_result(symboltype, symbolformat):
|
||||
grow, shrink, add, remove, up, down, delta, old, new, otot, ntot = \
|
||||
calc(sys.argv[argc - 1], sys.argv[argc], symbolformat)
|
||||
calc(args.file1, args.file2, symbolformat)
|
||||
|
||||
print("add/remove: %s/%s grow/shrink: %s/%s up/down: %s/%s (%s)" % \
|
||||
(add, remove, grow, shrink, up, -down, up-down))
|
||||
@ -92,13 +100,13 @@ def print_result(symboltype, symbolformat, argc):
|
||||
percent = 0
|
||||
print("Total: Before=%d, After=%d, chg %+.2f%%" % (otot, ntot, percent))
|
||||
|
||||
if sys.argv[1] == "-c":
|
||||
print_result("Function", "tT", 3)
|
||||
print_result("Data", "dDbB", 3)
|
||||
print_result("RO Data", "rR", 3)
|
||||
elif sys.argv[1] == "-d":
|
||||
print_result("Data", "dDbBrR", 3)
|
||||
elif sys.argv[1] == "-t":
|
||||
print_result("Function", "tT", 3)
|
||||
if args.c:
|
||||
print_result("Function", "tT")
|
||||
print_result("Data", "dDbB")
|
||||
print_result("RO Data", "rR")
|
||||
elif args.d:
|
||||
print_result("Data", "dDbBrR")
|
||||
elif args.t:
|
||||
print_result("Function", "tT")
|
||||
else:
|
||||
print_result("Function", "tTdDbBrR", 2)
|
||||
print_result("Function", "tTdDbBrR")
|
||||
|
@ -333,27 +333,7 @@ class PrinterRST(Printer):
|
||||
.. Copyright (C) All BPF authors and contributors from 2014 to present.
|
||||
.. See git log include/uapi/linux/bpf.h in kernel tree for details.
|
||||
..
|
||||
.. %%%LICENSE_START(VERBATIM)
|
||||
.. Permission is granted to make and distribute verbatim copies of this
|
||||
.. manual provided the copyright notice and this permission notice are
|
||||
.. preserved on all copies.
|
||||
..
|
||||
.. Permission is granted to copy and distribute modified versions of this
|
||||
.. manual under the conditions for verbatim copying, provided that the
|
||||
.. entire resulting derived work is distributed under the terms of a
|
||||
.. permission notice identical to this one.
|
||||
..
|
||||
.. Since the Linux kernel and libraries are constantly changing, this
|
||||
.. manual page may be incorrect or out-of-date. The author(s) assume no
|
||||
.. responsibility for errors or omissions, or for damages resulting from
|
||||
.. the use of the information contained herein. The author(s) may not
|
||||
.. have taken the same level of care in the production of this manual,
|
||||
.. which is licensed free of charge, as they might when working
|
||||
.. professionally.
|
||||
..
|
||||
.. Formatted or processed versions of this manual, if unaccompanied by
|
||||
.. the source, must acknowledge the copyright and authors of this work.
|
||||
.. %%%LICENSE_END
|
||||
.. SPDX-License-Identifier: Linux-man-pages-copyleft
|
||||
..
|
||||
.. Please do not edit this file. It was generated from the documentation
|
||||
.. located in file include/uapi/linux/bpf.h of the Linux kernel sources
|
||||
@ -633,6 +613,10 @@ class PrinterHelpers(Printer):
|
||||
'struct socket',
|
||||
'struct file',
|
||||
'struct bpf_timer',
|
||||
'struct mptcp_sock',
|
||||
'struct bpf_dynptr',
|
||||
'struct iphdr',
|
||||
'struct ipv6hdr',
|
||||
]
|
||||
known_types = {
|
||||
'...',
|
||||
@ -682,6 +666,10 @@ class PrinterHelpers(Printer):
|
||||
'struct socket',
|
||||
'struct file',
|
||||
'struct bpf_timer',
|
||||
'struct mptcp_sock',
|
||||
'struct bpf_dynptr',
|
||||
'struct iphdr',
|
||||
'struct ipv6hdr',
|
||||
}
|
||||
mapped_types = {
|
||||
'u8': '__u8',
|
||||
|
@ -1042,7 +1042,8 @@ our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)};
|
||||
our $declaration_macros = qr{(?x:
|
||||
(?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(|
|
||||
(?:$Storage\s+)?[HLP]?LIST_HEAD\s*\(|
|
||||
(?:SKCIPHER_REQUEST|SHASH_DESC|AHASH_REQUEST)_ON_STACK\s*\(
|
||||
(?:SKCIPHER_REQUEST|SHASH_DESC|AHASH_REQUEST)_ON_STACK\s*\(|
|
||||
(?:$Storage\s+)?(?:XA_STATE|XA_STATE_ORDER)\s*\(
|
||||
)};
|
||||
|
||||
our %allow_repeated_words = (
|
||||
@ -5720,7 +5721,7 @@ sub process {
|
||||
$var !~ /^(?:[a-z0-9_]*|[A-Z0-9_]*)?_?[a-z][A-Z](?:_[a-z0-9_]+|_[A-Z0-9_]+)?$/ &&
|
||||
#Ignore some three character SI units explicitly, like MiB and KHz
|
||||
$var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) {
|
||||
while ($var =~ m{($Ident)}g) {
|
||||
while ($var =~ m{\b($Ident)}g) {
|
||||
my $word = $1;
|
||||
next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
|
||||
if ($check) {
|
||||
@ -7033,14 +7034,16 @@ sub process {
|
||||
"Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
|
||||
}
|
||||
|
||||
# check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc
|
||||
# check for (kv|k)[mz]alloc with multiplies that could be kmalloc_array/kvmalloc_array/kvcalloc/kcalloc
|
||||
if ($perl_version_ok &&
|
||||
defined $stat &&
|
||||
$stat =~ /^\+\s*($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
|
||||
$stat =~ /^\+\s*($Lval)\s*\=\s*(?:$balanced_parens)?\s*((?:kv|k)[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
|
||||
my $oldfunc = $3;
|
||||
my $a1 = $4;
|
||||
my $a2 = $10;
|
||||
my $newfunc = "kmalloc_array";
|
||||
$newfunc = "kvmalloc_array" if ($oldfunc eq "kvmalloc");
|
||||
$newfunc = "kvcalloc" if ($oldfunc eq "kvzalloc");
|
||||
$newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
|
||||
my $r1 = $a1;
|
||||
my $r2 = $a2;
|
||||
@ -7057,7 +7060,7 @@ sub process {
|
||||
"Prefer $newfunc over $oldfunc with multiply\n" . $herectx) &&
|
||||
$cnt == 1 &&
|
||||
$fix) {
|
||||
$fixed[$fixlinenr] =~ s/\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/$1 . ' = ' . "$newfunc(" . trim($r1) . ', ' . trim($r2)/e;
|
||||
$fixed[$fixlinenr] =~ s/\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*((?:kv|k)[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/$1 . ' = ' . "$newfunc(" . trim($r1) . ', ' . trim($r2)/e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -16,6 +16,7 @@
|
||||
# AArch64, PARISC ports by Kyle McMartin
|
||||
# sparc port by Martin Habets <errandir_news@mph.eclipse.co.uk>
|
||||
# ppc64le port by Breno Leitao <leitao@debian.org>
|
||||
# riscv port by Wadim Mueller <wafgo01@gmail.com>
|
||||
#
|
||||
# Usage:
|
||||
# objdump -d vmlinux | scripts/checkstack.pl [arch]
|
||||
@ -108,6 +109,9 @@ my (@stack, $re, $dre, $sub, $x, $xs, $funcre, $min_stack);
|
||||
} elsif ($arch eq 'sparc' || $arch eq 'sparc64') {
|
||||
# f0019d10: 9d e3 bf 90 save %sp, -112, %sp
|
||||
$re = qr/.*save.*%sp, -(([0-9]{2}|[3-9])[0-9]{2}), %sp/o;
|
||||
} elsif ($arch =~ /^riscv(64)?$/) {
|
||||
#ffffffff8036e868: c2010113 addi sp,sp,-992
|
||||
$re = qr/.*addi.*sp,sp,-(([0-9]{2}|[3-9])[0-9]{2})/o;
|
||||
} else {
|
||||
print("wrong or unknown architecture \"$arch\"\n");
|
||||
exit
|
||||
|
@ -268,4 +268,4 @@ syscall_list() {
|
||||
}
|
||||
|
||||
(ignore_list && syscall_list $(dirname $0)/../arch/x86/entry/syscalls/syscall_32.tbl) | \
|
||||
$* -Wno-error -E -x c - > /dev/null
|
||||
$* -Wno-error -Wno-unused-macros -E -x c - > /dev/null
|
||||
|
@ -157,10 +157,10 @@ def cmdfiles_for_modorder(modorder):
|
||||
if ext != '.ko':
|
||||
sys.exit('{}: module path must end with .ko'.format(ko))
|
||||
mod = base + '.mod'
|
||||
# The first line of *.mod lists the objects that compose the module.
|
||||
# Read from *.mod, to get a list of objects that compose the module.
|
||||
with open(mod) as m:
|
||||
for obj in m.readline().split():
|
||||
yield to_cmdfile(obj)
|
||||
for mod_line in m:
|
||||
yield to_cmdfile(mod_line.rstrip())
|
||||
|
||||
|
||||
def process_line(root_directory, command_prefix, file_path):
|
||||
|
@ -51,6 +51,7 @@ def run_analysis(entry):
|
||||
checks += "linuxkernel-*"
|
||||
else:
|
||||
checks += "clang-analyzer-*"
|
||||
checks += ",-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling"
|
||||
p = subprocess.run(["clang-tidy", "-p", args.path, checks, entry["file"]],
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.STDOUT,
|
||||
|
@ -10,7 +10,7 @@
|
||||
// Copyright: (C) 2009-2010 Julia Lawall, Nicolas Palix, DIKU.
|
||||
// Copyright: (C) 2009-2010 Gilles Muller, INRIA/LiP6.
|
||||
// Copyright: (C) 2017 Himanshu Jha
|
||||
// URL: http://coccinelle.lip6.fr/rules/kzalloc.html
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Options: --no-includes --include-headers
|
||||
//
|
||||
// Keywords: kmalloc, kzalloc
|
||||
|
@ -5,7 +5,7 @@
|
||||
// Copyright (c) 2016-2017, Elena Reshetova, Intel Corporation
|
||||
//
|
||||
// Confidence: Moderate
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Options: --include-headers --very-quiet
|
||||
|
||||
virtual report
|
||||
|
@ -6,7 +6,7 @@
|
||||
///
|
||||
// Confidence: High
|
||||
// Copyright: (C) 2017 Julia Lawall, Inria/LIP6,
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Requires: 1.0.7
|
||||
// Keywords: BQ27XXX_DATA
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
// Keywords: d_find_alias, dput
|
||||
//
|
||||
// Confidence: Moderate
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Options: --include-headers
|
||||
|
||||
virtual context
|
||||
|
@ -6,7 +6,7 @@
|
||||
// Copyright: (C) 2009, 2010 Nicolas Palix, DIKU.
|
||||
// Copyright: (C) 2009, 2010 Julia Lawall, DIKU.
|
||||
// Copyright: (C) 2009, 2010 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Options:
|
||||
//
|
||||
// Keywords: ERR_PTR, PTR_ERR, ERR_CAST
|
||||
|
@ -5,7 +5,7 @@
|
||||
// Copyright: (C) 2010-2012 Nicolas Palix.
|
||||
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
// Copyright: (C) 2010-2012 Nicolas Palix.
|
||||
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
// Copyright: (C) 2010-2012 Nicolas Palix.
|
||||
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
// Keywords: pm_runtime
|
||||
// Confidence: Medium
|
||||
// Copyright (C) 2013 Texas Instruments Incorporated -
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Options: --include-headers
|
||||
|
||||
virtual patch
|
||||
|
@ -7,7 +7,7 @@
|
||||
// Copyright: (C) 2009, 2010 Nicolas Palix, DIKU.
|
||||
// Copyright: (C) 2009, 2010 Julia Lawall, DIKU.
|
||||
// Copyright: (C) 2009, 2010 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Options:
|
||||
//
|
||||
// Keywords: resource_size
|
||||
|
@ -8,7 +8,7 @@
|
||||
// Confidence: Moderate
|
||||
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options:
|
||||
|
||||
|
@ -17,7 +17,7 @@
|
||||
// Confidence: Moderate
|
||||
// Copyright: (C) 2011 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2011 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
// Confidence: Moderate
|
||||
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options:
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
// Copyright: (C) 2010-2012 Nicolas Palix.
|
||||
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
///
|
||||
// Confidence: High
|
||||
// Copyright: (C) 2013 Julia Lawall, INRIA/LIP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
///
|
||||
// Confidence: Moderate
|
||||
// Copyright: (C) 2013 Petr Strnad.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Keywords: pci_free_consistent, pci_alloc_consistent
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
///
|
||||
// Confidence: High
|
||||
// Copyright: (C) 2015 Julia Lawall, Inria.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Options: --no-includes --include-headers
|
||||
// Requires: 1.0.4
|
||||
// Keywords: for_each_child_of_node, etc.
|
||||
|
@ -5,7 +5,7 @@
|
||||
///
|
||||
// Confidence: High
|
||||
// Copyright: (C) 2020 Sumera Priyadarsini
|
||||
// URL: http://coccinelle.lip6.fr
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
virtual patch
|
||||
|
@ -10,7 +10,7 @@
|
||||
// Copyright: (C) 2010-2012 Nicolas Palix.
|
||||
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
// Copyright: (C) 2010 Nicolas Palix, DIKU.
|
||||
// Copyright: (C) 2010 Julia Lawall, DIKU.
|
||||
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
||||
// Confidence: Moderate
|
||||
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2012 Gilles Muller, INRIA/LIP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
// Copyright: (C) 2012 Nicolas Palix.
|
||||
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
// Copyright: (C) 2010 Nicolas Palix, DIKU.
|
||||
// Copyright: (C) 2010 Julia Lawall, DIKU.
|
||||
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
// Copyright: (C) 2010-2012 Nicolas Palix.
|
||||
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
||||
// Copyright: (C) 2010-2012 Nicolas Palix.
|
||||
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
// Confidence: High
|
||||
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
// Copyright: (C) 2010-2012 Nicolas Palix.
|
||||
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments: requires at least Coccinelle 0.2.4, lex or parse error otherwise
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -12,7 +12,7 @@
|
||||
// Copyright: (C) 2010 Nicolas Palix, DIKU.
|
||||
// Copyright: (C) 2010 Julia Lawall, DIKU.
|
||||
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
///
|
||||
// Confidence: Very High
|
||||
// Copyright: (C) 2020 Intel Corporation
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
virtual context
|
||||
|
@ -5,7 +5,7 @@
|
||||
// Confidence: High
|
||||
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
// Confidence: Moderate
|
||||
// Copyright: (C) 2013 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2013 Gilles Muller, INRIA/LIP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
///
|
||||
// Confidence: Moderate
|
||||
// Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments: Comments on code can be deleted if near code that is removed.
|
||||
// "when strict" can be removed to get more hits, but adds false
|
||||
// positives
|
||||
|
@ -4,7 +4,7 @@
|
||||
///
|
||||
// Confidence: Moderate
|
||||
// Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments: Some false positives on empty default cases in switch statements.
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
// Confidence: High
|
||||
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
||||
// Confidence: High
|
||||
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Requires: 1.0.0
|
||||
// Options:
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
// Copyright: (C) 2010 Nicolas Palix, DIKU.
|
||||
// Copyright: (C) 2010 Julia Lawall, DIKU.
|
||||
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments: -I ... -all_includes can give more complete results
|
||||
// Options:
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
// Copyright: (C) 2010-2012 Nicolas Palix.
|
||||
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
|
||||
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
// Copyright: (C) 2010 Nicolas Palix, DIKU.
|
||||
// Copyright: (C) 2010 Julia Lawall, DIKU.
|
||||
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
// Copyright: (C) 2010 Nicolas Palix, DIKU.
|
||||
// Copyright: (C) 2010 Julia Lawall, DIKU.
|
||||
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
// Copyright: (C) 2010 Nicolas Palix, DIKU.
|
||||
// Copyright: (C) 2010 Julia Lawall, DIKU.
|
||||
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Comments:
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
// Confidence: High
|
||||
// Copyright: (C) 2012, 2015 Julia Lawall, INRIA.
|
||||
// Copyright: (C) 2012, 2015 Gilles Muller, INRIA.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Options: --no-includes --include-headers
|
||||
|
||||
virtual patch
|
||||
|
@ -13,7 +13,7 @@
|
||||
///
|
||||
// Confidence: Average
|
||||
// Copyright: (C) 2015 Andrzej Hajda, Samsung Electronics Co., Ltd.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// URL: https://coccinelle.gitlabpages.inria.fr/website
|
||||
// Options: --all-includes
|
||||
|
||||
virtual context
|
||||
|
@ -45,8 +45,13 @@ else
|
||||
fi
|
||||
fi
|
||||
|
||||
declare -A cache
|
||||
declare -A modcache
|
||||
declare aarray_support=true
|
||||
declare -A cache 2>/dev/null
|
||||
if [[ $? != 0 ]]; then
|
||||
aarray_support=false
|
||||
else
|
||||
declare -A modcache
|
||||
fi
|
||||
|
||||
find_module() {
|
||||
if [[ -n $debuginfod ]] ; then
|
||||
@ -97,7 +102,7 @@ parse_symbol() {
|
||||
|
||||
if [[ $module == "" ]] ; then
|
||||
local objfile=$vmlinux
|
||||
elif [[ "${modcache[$module]+isset}" == "isset" ]]; then
|
||||
elif [[ $aarray_support == true && "${modcache[$module]+isset}" == "isset" ]]; then
|
||||
local objfile=${modcache[$module]}
|
||||
else
|
||||
local objfile=$(find_module)
|
||||
@ -105,8 +110,10 @@ parse_symbol() {
|
||||
echo "WARNING! Modules path isn't set, but is needed to parse this symbol" >&2
|
||||
return
|
||||
fi
|
||||
if [[ $aarray_support == true ]]; then
|
||||
modcache[$module]=$objfile
|
||||
fi
|
||||
fi
|
||||
|
||||
# Remove the englobing parenthesis
|
||||
symbol=${symbol#\(}
|
||||
@ -125,7 +132,7 @@ parse_symbol() {
|
||||
# Use 'nm vmlinux' to figure out the base address of said symbol.
|
||||
# It's actually faster to call it every time than to load it
|
||||
# all into bash.
|
||||
if [[ "${cache[$module,$name]+isset}" == "isset" ]]; then
|
||||
if [[ $aarray_support == true && "${cache[$module,$name]+isset}" == "isset" ]]; then
|
||||
local base_addr=${cache[$module,$name]}
|
||||
else
|
||||
local base_addr=$(nm "$objfile" 2>/dev/null | awk '$3 == "'$name'" && ($2 == "t" || $2 == "T") {print $1; exit}')
|
||||
@ -133,8 +140,10 @@ parse_symbol() {
|
||||
# address not found
|
||||
return
|
||||
fi
|
||||
if [[ $aarray_support == true ]]; then
|
||||
cache[$module,$name]="$base_addr"
|
||||
fi
|
||||
fi
|
||||
# Let's start doing the math to get the exact address into the
|
||||
# symbol. First, strip out the symbol total length.
|
||||
local expr=${symbol%/*}
|
||||
@ -149,12 +158,14 @@ parse_symbol() {
|
||||
|
||||
# Pass it to addr2line to get filename and line number
|
||||
# Could get more than one result
|
||||
if [[ "${cache[$module,$address]+isset}" == "isset" ]]; then
|
||||
if [[ $aarray_support == true && "${cache[$module,$address]+isset}" == "isset" ]]; then
|
||||
local code=${cache[$module,$address]}
|
||||
else
|
||||
local code=$(${CROSS_COMPILE}addr2line -i -e "$objfile" "$address" 2>/dev/null)
|
||||
if [[ $aarray_support == true ]]; then
|
||||
cache[$module,$address]=$code
|
||||
fi
|
||||
fi
|
||||
|
||||
# addr2line doesn't return a proper error code if it fails, so
|
||||
# we detect it using the value it prints so that we could preserve
|
||||
|
@ -1 +0,0 @@
|
||||
../../../arch/arc/boot/dts
|
@ -1 +0,0 @@
|
||||
../../../arch/arm/boot/dts
|
@ -1 +0,0 @@
|
||||
../../../arch/arm64/boot/dts
|
@ -1 +0,0 @@
|
||||
../../../include/dt-bindings
|
@ -1 +0,0 @@
|
||||
../../../arch/microblaze/boot/dts
|
@ -1 +0,0 @@
|
||||
../../../arch/mips/boot/dts
|
@ -1 +0,0 @@
|
||||
../../../arch/nios2/boot/dts
|
@ -1 +0,0 @@
|
||||
../../../arch/openrisc/boot/dts
|
@ -1 +0,0 @@
|
||||
../../../arch/powerpc/boot/dts
|
@ -1 +0,0 @@
|
||||
../../../arch/sh/boot/dts
|
@ -1 +0,0 @@
|
||||
../../../arch/xtensa/boot/dts
|
@ -59,7 +59,7 @@ fi
|
||||
if arg_contain -E "$@"; then
|
||||
# For scripts/cc-version.sh; This emulates GCC 20.0.0
|
||||
if arg_contain - "$@"; then
|
||||
sed -n '/^GCC/{s/__GNUC__/20/; s/__GNUC_MINOR__/0/; s/__GNUC_PATCHLEVEL__/0/; p;}'
|
||||
sed -n '/^GCC/{s/__GNUC__/20/; s/__GNUC_MINOR__/0/; s/__GNUC_PATCHLEVEL__/0/; p;}; s/__LONG_DOUBLE_128__/1/ p'
|
||||
exit 0
|
||||
else
|
||||
echo "no input files" >&2
|
||||
@ -96,12 +96,8 @@ fi
|
||||
|
||||
# To set GCC_PLUGINS
|
||||
if arg_contain -print-file-name=plugin "$@"; then
|
||||
plugin_dir=$(mktemp -d)
|
||||
|
||||
mkdir -p $plugin_dir/include
|
||||
touch $plugin_dir/include/plugin-version.h
|
||||
|
||||
echo $plugin_dir
|
||||
# Use $0 to find the in-tree dummy directory
|
||||
echo "$(dirname "$(readlink -f "$0")")/dummy-plugin-dir"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
|
@ -1,30 +0,0 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
# Dummy script that always succeeds.
|
||||
|
||||
# Check if the first parameter appears in the rest. Succeeds if found.
|
||||
# This helper is useful if a particular option was passed to this script.
|
||||
# Typically used like this:
|
||||
# arg_contain <word-you-are-searching-for> "$@"
|
||||
arg_contain ()
|
||||
{
|
||||
search="$1"
|
||||
shift
|
||||
|
||||
while [ $# -gt 0 ]
|
||||
do
|
||||
if [ "$search" = "$1" ]; then
|
||||
return 0
|
||||
fi
|
||||
shift
|
||||
done
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
if arg_contain --version "$@" || arg_contain -v "$@"; then
|
||||
progname=$(basename $0)
|
||||
echo "GNU $progname (scripts/dummy-tools/$progname) 2.50"
|
||||
exit 0
|
||||
fi
|
@ -1,30 +0,0 @@
|
||||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
# Dummy script that always succeeds.
|
||||
|
||||
# Check if the first parameter appears in the rest. Succeeds if found.
|
||||
# This helper is useful if a particular option was passed to this script.
|
||||
# Typically used like this:
|
||||
# arg_contain <word-you-are-searching-for> "$@"
|
||||
arg_contain ()
|
||||
{
|
||||
search="$1"
|
||||
shift
|
||||
|
||||
while [ $# -gt 0 ]
|
||||
do
|
||||
if [ "$search" = "$1" ]; then
|
||||
return 0
|
||||
fi
|
||||
shift
|
||||
done
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
if arg_contain --version "$@" || arg_contain -v "$@"; then
|
||||
progname=$(basename $0)
|
||||
echo "GNU $progname (scripts/dummy-tools/$progname) 2.50"
|
||||
exit 0
|
||||
fi
|
@ -44,17 +44,6 @@
|
||||
set -o errexit
|
||||
set -o nounset
|
||||
|
||||
READELF="${CROSS_COMPILE:-}readelf"
|
||||
ADDR2LINE="${CROSS_COMPILE:-}addr2line"
|
||||
SIZE="${CROSS_COMPILE:-}size"
|
||||
NM="${CROSS_COMPILE:-}nm"
|
||||
|
||||
command -v awk >/dev/null 2>&1 || die "awk isn't installed"
|
||||
command -v ${READELF} >/dev/null 2>&1 || die "readelf isn't installed"
|
||||
command -v ${ADDR2LINE} >/dev/null 2>&1 || die "addr2line isn't installed"
|
||||
command -v ${SIZE} >/dev/null 2>&1 || die "size isn't installed"
|
||||
command -v ${NM} >/dev/null 2>&1 || die "nm isn't installed"
|
||||
|
||||
usage() {
|
||||
echo "usage: faddr2line [--list] <object file> <func+offset> <func+offset>..." >&2
|
||||
exit 1
|
||||
@ -69,6 +58,15 @@ die() {
|
||||
exit 1
|
||||
}
|
||||
|
||||
READELF="${CROSS_COMPILE:-}readelf"
|
||||
ADDR2LINE="${CROSS_COMPILE:-}addr2line"
|
||||
AWK="awk"
|
||||
GREP="grep"
|
||||
|
||||
command -v ${AWK} >/dev/null 2>&1 || die "${AWK} isn't installed"
|
||||
command -v ${READELF} >/dev/null 2>&1 || die "${READELF} isn't installed"
|
||||
command -v ${ADDR2LINE} >/dev/null 2>&1 || die "${ADDR2LINE} isn't installed"
|
||||
|
||||
# Try to figure out the source directory prefix so we can remove it from the
|
||||
# addr2line output. HACK ALERT: This assumes that start_kernel() is in
|
||||
# init/main.c! This only works for vmlinux. Otherwise it falls back to
|
||||
@ -76,7 +74,7 @@ die() {
|
||||
find_dir_prefix() {
|
||||
local objfile=$1
|
||||
|
||||
local start_kernel_addr=$(${READELF} -sW $objfile | awk '$8 == "start_kernel" {printf "0x%s", $2}')
|
||||
local start_kernel_addr=$(${READELF} --symbols --wide $objfile | ${AWK} '$8 == "start_kernel" {printf "0x%s", $2}')
|
||||
[[ -z $start_kernel_addr ]] && return
|
||||
|
||||
local file_line=$(${ADDR2LINE} -e $objfile $start_kernel_addr)
|
||||
@ -97,86 +95,158 @@ __faddr2line() {
|
||||
local dir_prefix=$3
|
||||
local print_warnings=$4
|
||||
|
||||
local func=${func_addr%+*}
|
||||
local offset=${func_addr#*+}
|
||||
offset=${offset%/*}
|
||||
local size=
|
||||
[[ $func_addr =~ "/" ]] && size=${func_addr#*/}
|
||||
local sym_name=${func_addr%+*}
|
||||
local func_offset=${func_addr#*+}
|
||||
func_offset=${func_offset%/*}
|
||||
local user_size=
|
||||
local file_type
|
||||
local is_vmlinux=0
|
||||
[[ $func_addr =~ "/" ]] && user_size=${func_addr#*/}
|
||||
|
||||
if [[ -z $func ]] || [[ -z $offset ]] || [[ $func = $func_addr ]]; then
|
||||
if [[ -z $sym_name ]] || [[ -z $func_offset ]] || [[ $sym_name = $func_addr ]]; then
|
||||
warn "bad func+offset $func_addr"
|
||||
DONE=1
|
||||
return
|
||||
fi
|
||||
|
||||
# Go through each of the object's symbols which match the func name.
|
||||
# In rare cases there might be duplicates.
|
||||
file_end=$(${SIZE} -Ax $objfile | awk '$1 == ".text" {print $2}')
|
||||
while read symbol; do
|
||||
local fields=($symbol)
|
||||
local sym_base=0x${fields[0]}
|
||||
local sym_type=${fields[1]}
|
||||
local sym_end=${fields[3]}
|
||||
# vmlinux uses absolute addresses in the section table rather than
|
||||
# section offsets.
|
||||
local file_type=$(${READELF} --file-header $objfile |
|
||||
${AWK} '$1 == "Type:" { print $2; exit }')
|
||||
if [[ $file_type = "EXEC" ]] || [[ $file_type == "DYN" ]]; then
|
||||
is_vmlinux=1
|
||||
fi
|
||||
|
||||
# calculate the size
|
||||
local sym_size=$(($sym_end - $sym_base))
|
||||
if [[ -z $sym_size ]] || [[ $sym_size -le 0 ]]; then
|
||||
warn "bad symbol size: base: $sym_base end: $sym_end"
|
||||
# Go through each of the object's symbols which match the func name.
|
||||
# In rare cases there might be duplicates, in which case we print all
|
||||
# matches.
|
||||
while read line; do
|
||||
local fields=($line)
|
||||
local sym_addr=0x${fields[1]}
|
||||
local sym_elf_size=${fields[2]}
|
||||
local sym_sec=${fields[6]}
|
||||
local sec_size
|
||||
local sec_name
|
||||
|
||||
# Get the section size:
|
||||
sec_size=$(${READELF} --section-headers --wide $objfile |
|
||||
sed 's/\[ /\[/' |
|
||||
${AWK} -v sec=$sym_sec '$1 == "[" sec "]" { print "0x" $6; exit }')
|
||||
|
||||
if [[ -z $sec_size ]]; then
|
||||
warn "bad section size: section: $sym_sec"
|
||||
DONE=1
|
||||
return
|
||||
fi
|
||||
|
||||
# Get the section name:
|
||||
sec_name=$(${READELF} --section-headers --wide $objfile |
|
||||
sed 's/\[ /\[/' |
|
||||
${AWK} -v sec=$sym_sec '$1 == "[" sec "]" { print $2; exit }')
|
||||
|
||||
if [[ -z $sec_name ]]; then
|
||||
warn "bad section name: section: $sym_sec"
|
||||
DONE=1
|
||||
return
|
||||
fi
|
||||
|
||||
# Calculate the symbol size.
|
||||
#
|
||||
# Unfortunately we can't use the ELF size, because kallsyms
|
||||
# also includes the padding bytes in its size calculation. For
|
||||
# kallsyms, the size calculation is the distance between the
|
||||
# symbol and the next symbol in a sorted list.
|
||||
local sym_size
|
||||
local cur_sym_addr
|
||||
local found=0
|
||||
while read line; do
|
||||
local fields=($line)
|
||||
cur_sym_addr=0x${fields[1]}
|
||||
local cur_sym_elf_size=${fields[2]}
|
||||
local cur_sym_name=${fields[7]:-}
|
||||
|
||||
if [[ $cur_sym_addr = $sym_addr ]] &&
|
||||
[[ $cur_sym_elf_size = $sym_elf_size ]] &&
|
||||
[[ $cur_sym_name = $sym_name ]]; then
|
||||
found=1
|
||||
continue
|
||||
fi
|
||||
|
||||
if [[ $found = 1 ]]; then
|
||||
sym_size=$(($cur_sym_addr - $sym_addr))
|
||||
[[ $sym_size -lt $sym_elf_size ]] && continue;
|
||||
found=2
|
||||
break
|
||||
fi
|
||||
done < <(${READELF} --symbols --wide $objfile | ${AWK} -v sec=$sym_sec '$7 == sec' | sort --key=2)
|
||||
|
||||
if [[ $found = 0 ]]; then
|
||||
warn "can't find symbol: sym_name: $sym_name sym_sec: $sym_sec sym_addr: $sym_addr sym_elf_size: $sym_elf_size"
|
||||
DONE=1
|
||||
return
|
||||
fi
|
||||
|
||||
# If nothing was found after the symbol, assume it's the last
|
||||
# symbol in the section.
|
||||
[[ $found = 1 ]] && sym_size=$(($sec_size - $sym_addr))
|
||||
|
||||
if [[ -z $sym_size ]] || [[ $sym_size -le 0 ]]; then
|
||||
warn "bad symbol size: sym_addr: $sym_addr cur_sym_addr: $cur_sym_addr"
|
||||
DONE=1
|
||||
return
|
||||
fi
|
||||
|
||||
sym_size=0x$(printf %x $sym_size)
|
||||
|
||||
# calculate the address
|
||||
local addr=$(($sym_base + $offset))
|
||||
# Calculate the address from user-supplied offset:
|
||||
local addr=$(($sym_addr + $func_offset))
|
||||
if [[ -z $addr ]] || [[ $addr = 0 ]]; then
|
||||
warn "bad address: $sym_base + $offset"
|
||||
warn "bad address: $sym_addr + $func_offset"
|
||||
DONE=1
|
||||
return
|
||||
fi
|
||||
addr=0x$(printf %x $addr)
|
||||
|
||||
# weed out non-function symbols
|
||||
if [[ $sym_type != t ]] && [[ $sym_type != T ]]; then
|
||||
# If the user provided a size, make sure it matches the symbol's size:
|
||||
if [[ -n $user_size ]] && [[ $user_size -ne $sym_size ]]; then
|
||||
[[ $print_warnings = 1 ]] &&
|
||||
echo "skipping $func address at $addr due to non-function symbol of type '$sym_type'"
|
||||
continue
|
||||
fi
|
||||
|
||||
# if the user provided a size, make sure it matches the symbol's size
|
||||
if [[ -n $size ]] && [[ $size -ne $sym_size ]]; then
|
||||
[[ $print_warnings = 1 ]] &&
|
||||
echo "skipping $func address at $addr due to size mismatch ($size != $sym_size)"
|
||||
echo "skipping $sym_name address at $addr due to size mismatch ($user_size != $sym_size)"
|
||||
continue;
|
||||
fi
|
||||
|
||||
# make sure the provided offset is within the symbol's range
|
||||
if [[ $offset -gt $sym_size ]]; then
|
||||
# Make sure the provided offset is within the symbol's range:
|
||||
if [[ $func_offset -gt $sym_size ]]; then
|
||||
[[ $print_warnings = 1 ]] &&
|
||||
echo "skipping $func address at $addr due to size mismatch ($offset > $sym_size)"
|
||||
echo "skipping $sym_name address at $addr due to size mismatch ($func_offset > $sym_size)"
|
||||
continue
|
||||
fi
|
||||
|
||||
# separate multiple entries with a blank line
|
||||
# In case of duplicates or multiple addresses specified on the
|
||||
# cmdline, separate multiple entries with a blank line:
|
||||
[[ $FIRST = 0 ]] && echo
|
||||
FIRST=0
|
||||
|
||||
# pass real address to addr2line
|
||||
echo "$func+$offset/$sym_size:"
|
||||
local file_lines=$(${ADDR2LINE} -fpie $objfile $addr | sed "s; $dir_prefix\(\./\)*; ;")
|
||||
[[ -z $file_lines ]] && return
|
||||
echo "$sym_name+$func_offset/$sym_size:"
|
||||
|
||||
# Pass section address to addr2line and strip absolute paths
|
||||
# from the output:
|
||||
local args="--functions --pretty-print --inlines --exe=$objfile"
|
||||
[[ $is_vmlinux = 0 ]] && args="$args --section=$sec_name"
|
||||
local output=$(${ADDR2LINE} $args $addr | sed "s; $dir_prefix\(\./\)*; ;")
|
||||
[[ -z $output ]] && continue
|
||||
|
||||
# Default output (non --list):
|
||||
if [[ $LIST = 0 ]]; then
|
||||
echo "$file_lines" | while read -r line
|
||||
echo "$output" | while read -r line
|
||||
do
|
||||
echo $line
|
||||
done
|
||||
DONE=1;
|
||||
return
|
||||
continue
|
||||
fi
|
||||
|
||||
# show each line with context
|
||||
echo "$file_lines" | while read -r line
|
||||
# For --list, show each line with its corresponding source code:
|
||||
echo "$output" | while read -r line
|
||||
do
|
||||
echo
|
||||
echo $line
|
||||
@ -184,12 +254,12 @@ __faddr2line() {
|
||||
n1=$[$n-5]
|
||||
n2=$[$n+5]
|
||||
f=$(echo $line | sed 's/.*at \(.\+\):.*/\1/g')
|
||||
awk 'NR>=strtonum("'$n1'") && NR<=strtonum("'$n2'") { if (NR=='$n') printf(">%d<", NR); else printf(" %d ", NR); printf("\t%s\n", $0)}' $f
|
||||
${AWK} 'NR>=strtonum("'$n1'") && NR<=strtonum("'$n2'") { if (NR=='$n') printf(">%d<", NR); else printf(" %d ", NR); printf("\t%s\n", $0)}' $f
|
||||
done
|
||||
|
||||
DONE=1
|
||||
|
||||
done < <(${NM} -n $objfile | awk -v fn=$func -v end=$file_end '$3 == fn { found=1; line=$0; start=$1; next } found == 1 { found=0; print line, "0x"$1 } END {if (found == 1) print line, end; }')
|
||||
done < <(${READELF} --symbols --wide $objfile | ${AWK} -v fn=$sym_name '$4 == "FUNC" && $8 == fn')
|
||||
}
|
||||
|
||||
[[ $# -lt 2 ]] && usage
|
||||
@ -202,6 +272,8 @@ LIST=0
|
||||
[[ ! -f $objfile ]] && die "can't find objfile $objfile"
|
||||
shift
|
||||
|
||||
${READELF} --section-headers --wide $objfile | ${GREP} -q '\.debug_info' || die "CONFIG_DEBUG_INFO not enabled"
|
||||
|
||||
DIR_PREFIX=supercalifragilisticexpialidocious
|
||||
find_dir_prefix $objfile
|
||||
|
||||
|
@ -46,44 +46,6 @@ config GCC_PLUGIN_LATENT_ENTROPY
|
||||
* https://grsecurity.net/
|
||||
* https://pax.grsecurity.net/
|
||||
|
||||
config GCC_PLUGIN_RANDSTRUCT
|
||||
bool "Randomize layout of sensitive kernel structures"
|
||||
select MODVERSIONS if MODULES
|
||||
help
|
||||
If you say Y here, the layouts of structures that are entirely
|
||||
function pointers (and have not been manually annotated with
|
||||
__no_randomize_layout), or structures that have been explicitly
|
||||
marked with __randomize_layout, will be randomized at compile-time.
|
||||
This can introduce the requirement of an additional information
|
||||
exposure vulnerability for exploits targeting these structure
|
||||
types.
|
||||
|
||||
Enabling this feature will introduce some performance impact,
|
||||
slightly increase memory usage, and prevent the use of forensic
|
||||
tools like Volatility against the system (unless the kernel
|
||||
source tree isn't cleaned after kernel installation).
|
||||
|
||||
The seed used for compilation is located at
|
||||
scripts/gcc-plugins/randomize_layout_seed.h. It remains after
|
||||
a make clean to allow for external modules to be compiled with
|
||||
the existing seed and will be removed by a make mrproper or
|
||||
make distclean.
|
||||
|
||||
This plugin was ported from grsecurity/PaX. More information at:
|
||||
* https://grsecurity.net/
|
||||
* https://pax.grsecurity.net/
|
||||
|
||||
config GCC_PLUGIN_RANDSTRUCT_PERFORMANCE
|
||||
bool "Use cacheline-aware structure randomization"
|
||||
depends on GCC_PLUGIN_RANDSTRUCT
|
||||
depends on !COMPILE_TEST # do not reduce test coverage
|
||||
help
|
||||
If you say Y here, the RANDSTRUCT randomization will make a
|
||||
best effort at restricting randomization to cacheline-sized
|
||||
groups of elements. It will further not randomize bitfields
|
||||
in structures. This reduces the performance hit of RANDSTRUCT
|
||||
at the cost of weakened randomization.
|
||||
|
||||
config GCC_PLUGIN_ARM_SSP_PER_TASK
|
||||
bool
|
||||
depends on GCC_PLUGINS && ARM
|
||||
|
@ -1,12 +1,17 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
$(obj)/randomize_layout_plugin.so: $(objtree)/$(obj)/randomize_layout_seed.h
|
||||
quiet_cmd_create_randomize_layout_seed = GENSEED $@
|
||||
$(obj)/randomize_layout_plugin.so: $(obj)/randomize_layout_seed.h
|
||||
quiet_cmd_create_randomize_layout_seed = SEEDHDR $@
|
||||
cmd_create_randomize_layout_seed = \
|
||||
$(CONFIG_SHELL) $(srctree)/$(src)/gen-random-seed.sh $@ $(objtree)/include/generated/randomize_layout_hash.h
|
||||
$(objtree)/$(obj)/randomize_layout_seed.h: FORCE
|
||||
SEED=$$(cat $(filter-out FORCE,$^) </dev/null); \
|
||||
echo '/*' > $@; \
|
||||
echo ' * This file is automatically generated. Keep it private.' >> $@; \
|
||||
echo ' * Exposing this value will expose the layout of randomized structures.' >> $@; \
|
||||
echo ' */' >> $@; \
|
||||
echo "const char *randstruct_seed = \"$$SEED\";" >> $@
|
||||
$(obj)/randomize_layout_seed.h: $(objtree)/scripts/basic/randstruct.seed FORCE
|
||||
$(call if_changed,create_randomize_layout_seed)
|
||||
targets += randomize_layout_seed.h randomize_layout_hash.h
|
||||
targets += randomize_layout_seed.h
|
||||
|
||||
# Build rules for plugins
|
||||
#
|
||||
@ -23,6 +28,7 @@ GCC_PLUGINS_DIR = $(shell $(CC) -print-file-name=plugin)
|
||||
|
||||
plugin_cxxflags = -Wp,-MMD,$(depfile) $(KBUILD_HOSTCXXFLAGS) -fPIC \
|
||||
-include $(srctree)/include/linux/compiler-version.h \
|
||||
-DPLUGIN_VERSION=$(call stringify,$(KERNELVERSION)) \
|
||||
-I $(GCC_PLUGINS_DIR)/include -I $(obj) -std=gnu++11 \
|
||||
-fno-rtti -fno-exceptions -fasynchronous-unwind-tables \
|
||||
-ggdb -Wno-narrowing -Wno-unused-variable \
|
||||
|
@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright 2012-2016 by the PaX Team <pageexec@freemail.hu>
|
||||
* Copyright 2016 by Emese Revfy <re.emese@gmail.com>
|
||||
* Licensed under the GPL v2
|
||||
*
|
||||
* Note: the choice of the license means that the compilation process is
|
||||
* NOT 'eligible' as defined by gcc's library exception to the GPL v3,
|
||||
@ -82,7 +82,7 @@ __visible int plugin_is_GPL_compatible;
|
||||
static GTY(()) tree latent_entropy_decl;
|
||||
|
||||
static struct plugin_info latent_entropy_plugin_info = {
|
||||
.version = "201606141920vanilla",
|
||||
.version = PLUGIN_VERSION,
|
||||
.help = "disable\tturn off latent entropy instrumentation\n",
|
||||
};
|
||||
|
||||
|
@ -34,29 +34,11 @@ __visible int plugin_is_GPL_compatible;
|
||||
static int performance_mode;
|
||||
|
||||
static struct plugin_info randomize_layout_plugin_info = {
|
||||
.version = "201402201816vanilla",
|
||||
.version = PLUGIN_VERSION,
|
||||
.help = "disable\t\t\tdo not activate plugin\n"
|
||||
"performance-mode\tenable cacheline-aware layout randomization\n"
|
||||
};
|
||||
|
||||
struct whitelist_entry {
|
||||
const char *pathname;
|
||||
const char *lhs;
|
||||
const char *rhs;
|
||||
};
|
||||
|
||||
static const struct whitelist_entry whitelist[] = {
|
||||
/* NIU overloads mapping with page struct */
|
||||
{ "drivers/net/ethernet/sun/niu.c", "page", "address_space" },
|
||||
/* unix_skb_parms via UNIXCB() buffer */
|
||||
{ "net/unix/af_unix.c", "unix_skb_parms", "char" },
|
||||
/* big_key payload.data struct splashing */
|
||||
{ "security/keys/big_key.c", "path", "void *" },
|
||||
/* walk struct security_hook_heads as an array of struct hlist_head */
|
||||
{ "security/security.c", "hlist_head", "security_hook_heads" },
|
||||
{ }
|
||||
};
|
||||
|
||||
/* from old Linux dcache.h */
|
||||
static inline unsigned long
|
||||
partial_name_hash(unsigned long c, unsigned long prevhash)
|
||||
@ -742,60 +724,6 @@ static void handle_local_var_initializers(void)
|
||||
}
|
||||
}
|
||||
|
||||
static bool type_name_eq(gimple stmt, const_tree type_tree, const char *wanted_name)
|
||||
{
|
||||
const char *type_name;
|
||||
|
||||
if (type_tree == NULL_TREE)
|
||||
return false;
|
||||
|
||||
switch (TREE_CODE(type_tree)) {
|
||||
case RECORD_TYPE:
|
||||
type_name = TYPE_NAME_POINTER(type_tree);
|
||||
break;
|
||||
case INTEGER_TYPE:
|
||||
if (TYPE_PRECISION(type_tree) == CHAR_TYPE_SIZE)
|
||||
type_name = "char";
|
||||
else {
|
||||
INFORM(gimple_location(stmt), "found non-char INTEGER_TYPE cast comparison: %qT\n", type_tree);
|
||||
debug_tree(type_tree);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case POINTER_TYPE:
|
||||
if (TREE_CODE(TREE_TYPE(type_tree)) == VOID_TYPE) {
|
||||
type_name = "void *";
|
||||
break;
|
||||
} else {
|
||||
INFORM(gimple_location(stmt), "found non-void POINTER_TYPE cast comparison %qT\n", type_tree);
|
||||
debug_tree(type_tree);
|
||||
return false;
|
||||
}
|
||||
default:
|
||||
INFORM(gimple_location(stmt), "unhandled cast comparison: %qT\n", type_tree);
|
||||
debug_tree(type_tree);
|
||||
return false;
|
||||
}
|
||||
|
||||
return strcmp(type_name, wanted_name) == 0;
|
||||
}
|
||||
|
||||
static bool whitelisted_cast(gimple stmt, const_tree lhs_tree, const_tree rhs_tree)
|
||||
{
|
||||
const struct whitelist_entry *entry;
|
||||
expanded_location xloc = expand_location(gimple_location(stmt));
|
||||
|
||||
for (entry = whitelist; entry->pathname; entry++) {
|
||||
if (!strstr(xloc.file, entry->pathname))
|
||||
continue;
|
||||
|
||||
if (type_name_eq(stmt, lhs_tree, entry->lhs) && type_name_eq(stmt, rhs_tree, entry->rhs))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* iterate over all statements to find "bad" casts:
|
||||
* those where the address of the start of a structure is cast
|
||||
@ -872,10 +800,7 @@ static unsigned int find_bad_casts_execute(void)
|
||||
#ifndef __DEBUG_PLUGIN
|
||||
if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(ptr_lhs_type)))
|
||||
#endif
|
||||
{
|
||||
if (!whitelisted_cast(stmt, ptr_lhs_type, ptr_rhs_type))
|
||||
MISMATCH(gimple_location(stmt), "rhs", ptr_lhs_type, ptr_rhs_type);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -898,10 +823,7 @@ static unsigned int find_bad_casts_execute(void)
|
||||
#ifndef __DEBUG_PLUGIN
|
||||
if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(op0_type)))
|
||||
#endif
|
||||
{
|
||||
if (!whitelisted_cast(stmt, ptr_lhs_type, op0_type))
|
||||
MISMATCH(gimple_location(stmt), "op0", ptr_lhs_type, op0_type);
|
||||
}
|
||||
} else {
|
||||
const_tree ssa_name_var = SSA_NAME_VAR(rhs1);
|
||||
/* skip bogus type casts introduced by container_of */
|
||||
@ -911,11 +833,8 @@ static unsigned int find_bad_casts_execute(void)
|
||||
#ifndef __DEBUG_PLUGIN
|
||||
if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(ptr_rhs_type)))
|
||||
#endif
|
||||
{
|
||||
if (!whitelisted_cast(stmt, ptr_lhs_type, ptr_rhs_type))
|
||||
MISMATCH(gimple_location(stmt), "ssa", ptr_lhs_type, ptr_rhs_type);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ __visible int plugin_is_GPL_compatible;
|
||||
tree sancov_fndecl;
|
||||
|
||||
static struct plugin_info sancov_plugin_info = {
|
||||
.version = "20160402",
|
||||
.version = PLUGIN_VERSION,
|
||||
.help = "sancov plugin\n",
|
||||
};
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright 2011-2017 by the PaX Team <pageexec@freemail.hu>
|
||||
* Modified by Alexander Popov <alex.popov@linux.com>
|
||||
* Licensed under the GPL v2
|
||||
*
|
||||
* Note: the choice of the license means that the compilation process is
|
||||
* NOT 'eligible' as defined by gcc's library exception to the GPL v3,
|
||||
@ -44,7 +44,7 @@ static bool verbose = false;
|
||||
static GTY(()) tree track_function_decl;
|
||||
|
||||
static struct plugin_info stackleak_plugin_info = {
|
||||
.version = "201707101337",
|
||||
.version = PLUGIN_VERSION,
|
||||
.help = "track-min-size=nn\ttrack stack for functions with a stack frame size >= nn bytes\n"
|
||||
"arch=target_arch\tspecify target build arch\n"
|
||||
"disable\t\tdo not activate the plugin\n"
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright 2013-2017 by PaX Team <pageexec@freemail.hu>
|
||||
* Licensed under the GPL v2
|
||||
*
|
||||
* Note: the choice of the license means that the compilation process is
|
||||
* NOT 'eligible' as defined by gcc's library exception to the GPL v3,
|
||||
@ -37,7 +37,7 @@
|
||||
__visible int plugin_is_GPL_compatible;
|
||||
|
||||
static struct plugin_info structleak_plugin_info = {
|
||||
.version = "20190125vanilla",
|
||||
.version = PLUGIN_VERSION,
|
||||
.help = "disable\tdo not activate plugin\n"
|
||||
"byref\tinit structs passed by reference\n"
|
||||
"byref-all\tinit anything passed by reference\n"
|
||||
|
@ -24,9 +24,9 @@ class LxConfigDump(gdb.Command):
|
||||
filename = arg
|
||||
|
||||
try:
|
||||
py_config_ptr = gdb.parse_and_eval("kernel_config_data + 8")
|
||||
py_config_size = gdb.parse_and_eval(
|
||||
"sizeof(kernel_config_data) - 1 - 8 * 2")
|
||||
py_config_ptr = gdb.parse_and_eval("&kernel_config_data")
|
||||
py_config_ptr_end = gdb.parse_and_eval("&kernel_config_data_end")
|
||||
py_config_size = py_config_ptr_end - py_config_ptr
|
||||
except gdb.error as e:
|
||||
raise gdb.GdbError("Can't find config, enable CONFIG_IKCONFIG?")
|
||||
|
||||
|
@ -22,7 +22,6 @@ prb_desc_type = utils.CachedType("struct prb_desc")
|
||||
prb_desc_ring_type = utils.CachedType("struct prb_desc_ring")
|
||||
prb_data_ring_type = utils.CachedType("struct prb_data_ring")
|
||||
printk_ringbuffer_type = utils.CachedType("struct printk_ringbuffer")
|
||||
atomic_long_type = utils.CachedType("atomic_long_t")
|
||||
|
||||
class LxDmesg(gdb.Command):
|
||||
"""Print Linux kernel log buffer."""
|
||||
@ -68,8 +67,6 @@ class LxDmesg(gdb.Command):
|
||||
off = prb_data_ring_type.get_type()['data'].bitpos // 8
|
||||
text_data_addr = utils.read_ulong(text_data_ring, off)
|
||||
|
||||
counter_off = atomic_long_type.get_type()['counter'].bitpos // 8
|
||||
|
||||
sv_off = prb_desc_type.get_type()['state_var'].bitpos // 8
|
||||
|
||||
off = prb_desc_type.get_type()['text_blk_lpos'].bitpos // 8
|
||||
@ -89,9 +86,9 @@ class LxDmesg(gdb.Command):
|
||||
|
||||
# read in tail and head descriptor ids
|
||||
off = prb_desc_ring_type.get_type()['tail_id'].bitpos // 8
|
||||
tail_id = utils.read_u64(desc_ring, off + counter_off)
|
||||
tail_id = utils.read_atomic_long(desc_ring, off)
|
||||
off = prb_desc_ring_type.get_type()['head_id'].bitpos // 8
|
||||
head_id = utils.read_u64(desc_ring, off + counter_off)
|
||||
head_id = utils.read_atomic_long(desc_ring, off)
|
||||
|
||||
did = tail_id
|
||||
while True:
|
||||
@ -102,7 +99,7 @@ class LxDmesg(gdb.Command):
|
||||
desc = utils.read_memoryview(inf, desc_addr + desc_off, desc_sz).tobytes()
|
||||
|
||||
# skip non-committed record
|
||||
state = 3 & (utils.read_u64(desc, sv_off + counter_off) >> desc_flags_shift)
|
||||
state = 3 & (utils.read_atomic_long(desc, sv_off) >> desc_flags_shift)
|
||||
if state != desc_committed and state != desc_finalized:
|
||||
if did == head_id:
|
||||
break
|
||||
|
@ -180,7 +180,7 @@ lx-symbols command."""
|
||||
self.breakpoint.delete()
|
||||
self.breakpoint = None
|
||||
self.breakpoint = LoadModuleBreakpoint(
|
||||
"kernel/module.c:do_init_module", self)
|
||||
"kernel/module/main.c:do_init_module", self)
|
||||
else:
|
||||
gdb.write("Note: symbol update on module loading not supported "
|
||||
"with this gdb version\n")
|
||||
|
@ -35,13 +35,12 @@ class CachedType:
|
||||
|
||||
|
||||
long_type = CachedType("long")
|
||||
|
||||
atomic_long_type = CachedType("atomic_long_t")
|
||||
|
||||
def get_long_type():
|
||||
global long_type
|
||||
return long_type.get_type()
|
||||
|
||||
|
||||
def offset_of(typeobj, field):
|
||||
element = gdb.Value(0).cast(typeobj)
|
||||
return int(str(element[field].address).split()[0], 16)
|
||||
@ -129,6 +128,17 @@ def read_ulong(buffer, offset):
|
||||
else:
|
||||
return read_u32(buffer, offset)
|
||||
|
||||
atomic_long_counter_offset = atomic_long_type.get_type()['counter'].bitpos
|
||||
atomic_long_counter_sizeof = atomic_long_type.get_type()['counter'].type.sizeof
|
||||
|
||||
def read_atomic_long(buffer, offset):
|
||||
global atomic_long_counter_offset
|
||||
global atomic_long_counter_sizeof
|
||||
|
||||
if atomic_long_counter_sizeof == 8:
|
||||
return read_u64(buffer, offset + atomic_long_counter_offset)
|
||||
else:
|
||||
return read_u32(buffer, offset + atomic_long_counter_offset)
|
||||
|
||||
target_arch = None
|
||||
|
||||
|
@ -13,7 +13,7 @@
|
||||
|
||||
import os
|
||||
|
||||
sys.path.insert(0, os.path.dirname(__file__) + "/scripts/gdb")
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)) + "/scripts/gdb")
|
||||
|
||||
try:
|
||||
gdb.parse_and_eval("0")
|
||||
|
@ -2,13 +2,10 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
# Create an autoksyms.h header file from the list of all module's needed symbols
|
||||
# as recorded on the second line of *.mod files and the user-provided symbol
|
||||
# whitelist.
|
||||
# as recorded in *.usyms files and the user-provided symbol whitelist.
|
||||
|
||||
set -e
|
||||
|
||||
output_file="$1"
|
||||
|
||||
# Use "make V=1" to debug this script.
|
||||
case "$KBUILD_VERBOSE" in
|
||||
*1*)
|
||||
@ -16,6 +13,15 @@ case "$KBUILD_VERBOSE" in
|
||||
;;
|
||||
esac
|
||||
|
||||
read_modorder=
|
||||
|
||||
if [ "$1" = --modorder ]; then
|
||||
shift
|
||||
read_modorder=1
|
||||
fi
|
||||
|
||||
output_file="$1"
|
||||
|
||||
needed_symbols=
|
||||
|
||||
# Special case for modversions (see modpost.c)
|
||||
@ -41,10 +47,8 @@ cat > "$output_file" << EOT
|
||||
|
||||
EOT
|
||||
|
||||
[ -f modules.order ] && modlist=modules.order || modlist=/dev/null
|
||||
|
||||
{
|
||||
sed 's/ko$/mod/' $modlist | xargs -n1 sed -n -e '2p'
|
||||
[ -n "${read_modorder}" ] && sed 's/ko$/usyms/' modules.order | xargs cat
|
||||
echo "$needed_symbols"
|
||||
[ -n "$ksym_wl" ] && cat "$ksym_wl"
|
||||
} | sed -e 's/ /\n/g' | sed -n -e '/^$/!p' |
|
||||
@ -52,4 +56,7 @@ EOT
|
||||
# point addresses.
|
||||
sed -e 's/^\.//' |
|
||||
sort -u |
|
||||
# Ignore __this_module. It's not an exported symbol, and will be resolved
|
||||
# when the final .ko's are linked.
|
||||
grep -v '^__this_module$' |
|
||||
sed -e 's/\(.*\)/#define __KSYM_\1 1/' >> "$output_file"
|
||||
|
@ -33,7 +33,7 @@ char *cur_filename;
|
||||
int in_source_file;
|
||||
|
||||
static int flag_debug, flag_dump_defs, flag_reference, flag_dump_types,
|
||||
flag_preserve, flag_warnings, flag_rel_crcs;
|
||||
flag_preserve, flag_warnings;
|
||||
|
||||
static int errors;
|
||||
static int nsyms;
|
||||
@ -680,11 +680,7 @@ void export_symbol(const char *name)
|
||||
if (flag_dump_defs)
|
||||
fputs(">\n", debugfile);
|
||||
|
||||
/* Used as a linker script. */
|
||||
printf(!flag_rel_crcs ? "__crc_%s = 0x%08lx;\n" :
|
||||
"SECTIONS { .rodata : ALIGN(4) { "
|
||||
"__crc_%s = .; LONG(0x%08lx); } }\n",
|
||||
name, crc);
|
||||
printf("#SYMVER %s 0x%08lx\n", name, crc);
|
||||
}
|
||||
}
|
||||
|
||||
@ -733,7 +729,6 @@ static void genksyms_usage(void)
|
||||
" -q, --quiet Disable warnings (default)\n"
|
||||
" -h, --help Print this message\n"
|
||||
" -V, --version Print the release version\n"
|
||||
" -R, --relative-crc Emit section relative symbol CRCs\n"
|
||||
#else /* __GNU_LIBRARY__ */
|
||||
" -s Select symbol prefix\n"
|
||||
" -d Increment the debug level (repeatable)\n"
|
||||
@ -745,7 +740,6 @@ static void genksyms_usage(void)
|
||||
" -q Disable warnings (default)\n"
|
||||
" -h Print this message\n"
|
||||
" -V Print the release version\n"
|
||||
" -R Emit section relative symbol CRCs\n"
|
||||
#endif /* __GNU_LIBRARY__ */
|
||||
, stderr);
|
||||
}
|
||||
@ -766,14 +760,13 @@ int main(int argc, char **argv)
|
||||
{"preserve", 0, 0, 'p'},
|
||||
{"version", 0, 0, 'V'},
|
||||
{"help", 0, 0, 'h'},
|
||||
{"relative-crc", 0, 0, 'R'},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
while ((o = getopt_long(argc, argv, "s:dwqVDr:T:phR",
|
||||
while ((o = getopt_long(argc, argv, "s:dwqVDr:T:ph",
|
||||
&long_opts[0], NULL)) != EOF)
|
||||
#else /* __GNU_LIBRARY__ */
|
||||
while ((o = getopt(argc, argv, "s:dwqVDr:T:phR")) != EOF)
|
||||
while ((o = getopt(argc, argv, "s:dwqVDr:T:ph")) != EOF)
|
||||
#endif /* __GNU_LIBRARY__ */
|
||||
switch (o) {
|
||||
case 'd':
|
||||
@ -813,9 +806,6 @@ int main(int argc, char **argv)
|
||||
case 'h':
|
||||
genksyms_usage();
|
||||
return 0;
|
||||
case 'R':
|
||||
flag_rel_crcs = 1;
|
||||
break;
|
||||
default:
|
||||
genksyms_usage();
|
||||
return 1;
|
||||
|
@ -981,11 +981,11 @@ __END__
|
||||
|
||||
=head1 NAME
|
||||
|
||||
abi_book.pl - parse the Linux ABI files and produce a ReST book.
|
||||
get_abi.pl - parse the Linux ABI files and produce a ReST book.
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
B<abi_book.pl> [--debug <level>] [--enable-lineno] [--man] [--help]
|
||||
B<get_abi.pl> [--debug <level>] [--enable-lineno] [--man] [--help]
|
||||
[--(no-)rst-source] [--dir=<dir>] [--show-hints]
|
||||
[--search-string <regex>]
|
||||
<COMMAND> [<ARGUMENT>]
|
||||
|
@ -1,4 +1,4 @@
|
||||
#!/usr/bin/perl
|
||||
#!/usr/bin/env perl
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
use strict;
|
||||
|
@ -983,6 +983,7 @@ sub get_maintainers {
|
||||
}
|
||||
|
||||
foreach my $email (@file_emails) {
|
||||
$email = mailmap_email($email);
|
||||
my ($name, $address) = parse_email($email);
|
||||
|
||||
my $tmp_email = format_email($name, $address, $email_usename);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user