Commit 8715ee75 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'kbuild-v4.18' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild

Pull Kbuild updates from Masahiro Yamada:

 - improve fixdep to coalesce consecutive slashes in dep-files

 - fix some issues of the maintainer string generation in deb-pkg script

 - remove unused CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX and clean-up
   several tools and linker scripts

 - clean-up modpost

 - allow to enable the dead code/data elimination for PowerPC in EXPERT
   mode

 - improve two coccinelle scripts for better performance

 - pass endianness and machine size flags to sparse for all architecture

 - misc fixes

* tag 'kbuild-v4.18' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild: (25 commits)
  kbuild: add machine size to CHECKFLAGS
  kbuild: add endianness flag to CHEKCFLAGS
  kbuild: $(CHECK) doesnt need NOSTDINC_FLAGS twice
  scripts: Fixed printf format mismatch
  scripts/tags.sh: use `find` for $ALLSOURCE_ARCHS generation
  coccinelle: deref_null: improve performance
  coccinelle: mini_lock: improve performance
  powerpc: Allow LD_DEAD_CODE_DATA_ELIMINATION to be selected
  kbuild: Allow LD_DEAD_CODE_DATA_ELIMINATION to be selectable if enabled
  kbuild: LD_DEAD_CODE_DATA_ELIMINATION no -ffunction-sections/-fdata-sections for module build
  kbuild: Fix asm-generic/vmlinux.lds.h for LD_DEAD_CODE_DATA_ELIMINATION
  modpost: constify *modname function argument where possible
  modpost: remove redundant is_vmlinux() test
  modpost: use strstarts() helper more widely
  modpost: pass struct elf_info pointer to get_modinfo()
  checkpatch: remove VMLINUX_SYMBOL() check
  vmlinux.lds.h: remove no-op macro VMLINUX_SYMBOL()
  kbuild: remove CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX
  export.h: remove code for prefixing symbols with underscore
  depmod.sh: remove symbol prefix support
  ...
parents 126f7051 1f2f01b1
...@@ -802,13 +802,12 @@ KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once) ...@@ -802,13 +802,12 @@ KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once)
endif endif
ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
KBUILD_CFLAGS += $(call cc-option,-ffunction-sections,) KBUILD_CFLAGS_KERNEL += $(call cc-option,-ffunction-sections,)
KBUILD_CFLAGS += $(call cc-option,-fdata-sections,) KBUILD_CFLAGS_KERNEL += $(call cc-option,-fdata-sections,)
endif endif
# arch Makefile may override CC so keep this after arch Makefile is included # arch Makefile may override CC so keep this after arch Makefile is included
NOSTDINC_FLAGS += -nostdinc -isystem $(call shell-cached,$(CC) -print-file-name=include) NOSTDINC_FLAGS += -nostdinc -isystem $(call shell-cached,$(CC) -print-file-name=include)
CHECKFLAGS += $(NOSTDINC_FLAGS)
# warn about C99 declaration after statement # warn about C99 declaration after statement
KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,) KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
...@@ -878,6 +877,12 @@ ifeq ($(CONFIG_STRIP_ASM_SYMS),y) ...@@ -878,6 +877,12 @@ ifeq ($(CONFIG_STRIP_ASM_SYMS),y)
LDFLAGS_vmlinux += $(call ld-option, -X,) LDFLAGS_vmlinux += $(call ld-option, -X,)
endif endif
# insure the checker run with the right endianness
CHECKFLAGS += $(if $(CONFIG_CPU_BIG_ENDIAN),-mbig-endian,-mlittle-endian)
# the checker needs the correct machine size
CHECKFLAGS += $(if $(CONFIG_64BIT),-m64,-m32)
# Default kernel image to build when no specific target is given. # Default kernel image to build when no specific target is given.
# KBUILD_IMAGE may be overruled on the command line or # KBUILD_IMAGE may be overruled on the command line or
# set in the environment # set in the environment
...@@ -1763,7 +1768,7 @@ quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN $(wildcard $(rm-files)) ...@@ -1763,7 +1768,7 @@ quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN $(wildcard $(rm-files))
# Run depmod only if we have System.map and depmod is executable # Run depmod only if we have System.map and depmod is executable
quiet_cmd_depmod = DEPMOD $(KERNELRELEASE) quiet_cmd_depmod = DEPMOD $(KERNELRELEASE)
cmd_depmod = $(CONFIG_SHELL) $(srctree)/scripts/depmod.sh $(DEPMOD) \ cmd_depmod = $(CONFIG_SHELL) $(srctree)/scripts/depmod.sh $(DEPMOD) \
$(KERNELRELEASE) "$(patsubst y,_,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX))" $(KERNELRELEASE)
# Create temporary dir for module support files # Create temporary dir for module support files
# clean it up only when building all modules # clean it up only when building all modules
......
...@@ -597,21 +597,6 @@ config CC_STACKPROTECTOR_AUTO ...@@ -597,21 +597,6 @@ config CC_STACKPROTECTOR_AUTO
endchoice endchoice
config LD_DEAD_CODE_DATA_ELIMINATION
bool
help
Select this if the architecture wants to do dead code and
data elimination with the linker by compiling with
-ffunction-sections -fdata-sections and linking with
--gc-sections.
This requires that the arch annotates or otherwise protects
its external entry points from being discarded. Linker scripts
must also merge .text.*, .data.*, and .bss.* correctly into
output sections. Care must be taken not to pull in unrelated
sections (e.g., '.text.init'). Typically '.' in section names
is used to distinguish them from label names / C identifiers.
config HAVE_ARCH_WITHIN_STACK_FRAMES config HAVE_ARCH_WITHIN_STACK_FRAMES
bool bool
help help
...@@ -687,12 +672,6 @@ config MODULES_USE_ELF_REL ...@@ -687,12 +672,6 @@ config MODULES_USE_ELF_REL
Modules only use ELF REL relocations. Modules with ELF RELA Modules only use ELF REL relocations. Modules with ELF RELA
relocations will give an error. relocations will give an error.
config HAVE_UNDERSCORE_SYMBOL_PREFIX
bool
help
Some architectures generate an _ in front of C symbols; things like
module loading and assembly files need to know about this.
config HAVE_IRQ_EXIT_ON_IRQ_STACK config HAVE_IRQ_EXIT_ON_IRQ_STACK
bool bool
help help
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
NM := $(NM) -B NM := $(NM) -B
LDFLAGS_vmlinux := -static -N #-relax LDFLAGS_vmlinux := -static -N #-relax
CHECKFLAGS += -D__alpha__ -m64 CHECKFLAGS += -D__alpha__
cflags-y := -pipe -mno-fp-regs -ffixed-8 cflags-y := -pipe -mno-fp-regs -ffixed-8
cflags-y += $(call cc-option, -fno-jump-tables) cflags-y += $(call cc-option, -fno-jump-tables)
......
...@@ -135,7 +135,7 @@ endif ...@@ -135,7 +135,7 @@ endif
KBUILD_CFLAGS +=$(CFLAGS_ABI) $(CFLAGS_ISA) $(arch-y) $(tune-y) $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) -msoft-float -Uarm KBUILD_CFLAGS +=$(CFLAGS_ABI) $(CFLAGS_ISA) $(arch-y) $(tune-y) $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) -msoft-float -Uarm
KBUILD_AFLAGS +=$(CFLAGS_ABI) $(AFLAGS_ISA) $(arch-y) $(tune-y) -include asm/unified.h -msoft-float KBUILD_AFLAGS +=$(CFLAGS_ABI) $(AFLAGS_ISA) $(arch-y) $(tune-y) -include asm/unified.h -msoft-float
CHECKFLAGS += -D__arm__ -m32 CHECKFLAGS += -D__arm__
#Default value #Default value
head-y := arch/arm/kernel/head$(MMUEXT).o head-y := arch/arm/kernel/head$(MMUEXT).o
......
...@@ -78,7 +78,7 @@ LDFLAGS += -maarch64linux ...@@ -78,7 +78,7 @@ LDFLAGS += -maarch64linux
UTS_MACHINE := aarch64 UTS_MACHINE := aarch64
endif endif
CHECKFLAGS += -D__aarch64__ -m64 CHECKFLAGS += -D__aarch64__
ifeq ($(CONFIG_ARM64_MODULE_PLTS),y) ifeq ($(CONFIG_ARM64_MODULE_PLTS),y)
KBUILD_LDFLAGS_MODULE += -T $(srctree)/arch/arm64/kernel/module.lds KBUILD_LDFLAGS_MODULE += -T $(srctree)/arch/arm64/kernel/module.lds
......
...@@ -18,7 +18,7 @@ READELF := $(CROSS_COMPILE)readelf ...@@ -18,7 +18,7 @@ READELF := $(CROSS_COMPILE)readelf
export AWK export AWK
CHECKFLAGS += -m64 -D__ia64=1 -D__ia64__=1 -D_LP64 -D__LP64__ CHECKFLAGS += -D__ia64=1 -D__ia64__=1 -D_LP64 -D__LP64__
OBJCOPYFLAGS := --strip-all OBJCOPYFLAGS := --strip-all
LDFLAGS_vmlinux := -static LDFLAGS_vmlinux := -static
......
...@@ -309,9 +309,6 @@ ifdef CONFIG_MIPS ...@@ -309,9 +309,6 @@ ifdef CONFIG_MIPS
CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \ CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \
egrep -vw '__GNUC_(|MINOR_|PATCHLEVEL_)_' | \ egrep -vw '__GNUC_(|MINOR_|PATCHLEVEL_)_' | \
sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/" -e 's/\$$/&&/g') sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/" -e 's/\$$/&&/g')
ifdef CONFIG_64BIT
CHECKFLAGS += -m64
endif
endif endif
OBJCOPYFLAGS += --remove-section=.reginfo OBJCOPYFLAGS += --remove-section=.reginfo
......
...@@ -25,7 +25,6 @@ LDFLAGS_vmlinux := ...@@ -25,7 +25,6 @@ LDFLAGS_vmlinux :=
LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name) LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name)
KBUILD_CFLAGS += -pipe -ffixed-r10 -D__linux__ KBUILD_CFLAGS += -pipe -ffixed-r10 -D__linux__
CHECKFLAGS += -mbig-endian
ifeq ($(CONFIG_OPENRISC_HAVE_INST_MUL),y) ifeq ($(CONFIG_OPENRISC_HAVE_INST_MUL),y)
KBUILD_CFLAGS += $(call cc-option,-mhard-mul) KBUILD_CFLAGS += $(call cc-option,-mhard-mul)
......
...@@ -22,13 +22,13 @@ KBUILD_IMAGE := vmlinuz ...@@ -22,13 +22,13 @@ KBUILD_IMAGE := vmlinuz
KBUILD_DEFCONFIG := default_defconfig KBUILD_DEFCONFIG := default_defconfig
NM = sh $(srctree)/arch/parisc/nm NM = sh $(srctree)/arch/parisc/nm
CHECKFLAGS += -D__hppa__=1 -mbig-endian CHECKFLAGS += -D__hppa__=1
LIBGCC = $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name) LIBGCC = $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name)
export LIBGCC export LIBGCC
ifdef CONFIG_64BIT ifdef CONFIG_64BIT
UTS_MACHINE := parisc64 UTS_MACHINE := parisc64
CHECKFLAGS += -D__LP64__=1 -m64 CHECKFLAGS += -D__LP64__=1
CC_ARCHES = hppa64 CC_ARCHES = hppa64
LD_BFD := elf64-hppa-linux LD_BFD := elf64-hppa-linux
else # 32-bit else # 32-bit
......
...@@ -198,6 +198,7 @@ config PPC ...@@ -198,6 +198,7 @@ config PPC
select HAVE_KPROBES select HAVE_KPROBES
select HAVE_KPROBES_ON_FTRACE select HAVE_KPROBES_ON_FTRACE
select HAVE_KRETPROBES select HAVE_KRETPROBES
select HAVE_LD_DEAD_CODE_DATA_ELIMINATION
select HAVE_LIVEPATCH if HAVE_DYNAMIC_FTRACE_WITH_REGS select HAVE_LIVEPATCH if HAVE_DYNAMIC_FTRACE_WITH_REGS
select HAVE_MEMBLOCK select HAVE_MEMBLOCK
select HAVE_MEMBLOCK_NODE_MAP select HAVE_MEMBLOCK_NODE_MAP
......
...@@ -89,7 +89,7 @@ SECTIONS ...@@ -89,7 +89,7 @@ SECTIONS
*/ */
.text BLOCK(0) : AT(ADDR(.text) - LOAD_OFFSET) { .text BLOCK(0) : AT(ADDR(.text) - LOAD_OFFSET) {
#ifdef CONFIG_LD_HEAD_STUB_CATCH #ifdef CONFIG_LD_HEAD_STUB_CATCH
*(.linker_stub_catch); KEEP(*(.linker_stub_catch));
. = . ; . = . ;
#endif #endif
...@@ -98,7 +98,7 @@ SECTIONS ...@@ -98,7 +98,7 @@ SECTIONS
ALIGN_FUNCTION(); ALIGN_FUNCTION();
#endif #endif
/* careful! __ftr_alt_* sections need to be close to .text */ /* careful! __ftr_alt_* sections need to be close to .text */
*(.text.hot .text .text.fixup .text.unlikely .fixup __ftr_alt_* .ref.text); *(.text.hot TEXT_MAIN .text.fixup .text.unlikely .fixup __ftr_alt_* .ref.text);
SCHED_TEXT SCHED_TEXT
CPUIDLE_TEXT CPUIDLE_TEXT
LOCK_TEXT LOCK_TEXT
...@@ -184,10 +184,10 @@ SECTIONS ...@@ -184,10 +184,10 @@ SECTIONS
.init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) {
INIT_DATA INIT_DATA
__vtop_table_begin = .; __vtop_table_begin = .;
*(.vtop_fixup); KEEP(*(.vtop_fixup));
__vtop_table_end = .; __vtop_table_end = .;
__ptov_table_begin = .; __ptov_table_begin = .;
*(.ptov_fixup); KEEP(*(.ptov_fixup));
__ptov_table_end = .; __ptov_table_end = .;
} }
...@@ -208,26 +208,26 @@ SECTIONS ...@@ -208,26 +208,26 @@ SECTIONS
. = ALIGN(8); . = ALIGN(8);
__ftr_fixup : AT(ADDR(__ftr_fixup) - LOAD_OFFSET) { __ftr_fixup : AT(ADDR(__ftr_fixup) - LOAD_OFFSET) {
__start___ftr_fixup = .; __start___ftr_fixup = .;
*(__ftr_fixup) KEEP(*(__ftr_fixup))
__stop___ftr_fixup = .; __stop___ftr_fixup = .;
} }
. = ALIGN(8); . = ALIGN(8);
__mmu_ftr_fixup : AT(ADDR(__mmu_ftr_fixup) - LOAD_OFFSET) { __mmu_ftr_fixup : AT(ADDR(__mmu_ftr_fixup) - LOAD_OFFSET) {
__start___mmu_ftr_fixup = .; __start___mmu_ftr_fixup = .;
*(__mmu_ftr_fixup) KEEP(*(__mmu_ftr_fixup))
__stop___mmu_ftr_fixup = .; __stop___mmu_ftr_fixup = .;
} }
. = ALIGN(8); . = ALIGN(8);
__lwsync_fixup : AT(ADDR(__lwsync_fixup) - LOAD_OFFSET) { __lwsync_fixup : AT(ADDR(__lwsync_fixup) - LOAD_OFFSET) {
__start___lwsync_fixup = .; __start___lwsync_fixup = .;
*(__lwsync_fixup) KEEP(*(__lwsync_fixup))
__stop___lwsync_fixup = .; __stop___lwsync_fixup = .;
} }
#ifdef CONFIG_PPC64 #ifdef CONFIG_PPC64
. = ALIGN(8); . = ALIGN(8);
__fw_ftr_fixup : AT(ADDR(__fw_ftr_fixup) - LOAD_OFFSET) { __fw_ftr_fixup : AT(ADDR(__fw_ftr_fixup) - LOAD_OFFSET) {
__start___fw_ftr_fixup = .; __start___fw_ftr_fixup = .;
*(__fw_ftr_fixup) KEEP(*(__fw_ftr_fixup))
__stop___fw_ftr_fixup = .; __stop___fw_ftr_fixup = .;
} }
#endif #endif
...@@ -240,7 +240,7 @@ SECTIONS ...@@ -240,7 +240,7 @@ SECTIONS
. = ALIGN(8); . = ALIGN(8);
.machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) { .machine.desc : AT(ADDR(.machine.desc) - LOAD_OFFSET) {
__machine_desc_start = . ; __machine_desc_start = . ;
*(.machine.desc) KEEP(*(.machine.desc))
__machine_desc_end = . ; __machine_desc_end = . ;
} }
#ifdef CONFIG_RELOCATABLE #ifdef CONFIG_RELOCATABLE
...@@ -288,7 +288,7 @@ SECTIONS ...@@ -288,7 +288,7 @@ SECTIONS
.data : AT(ADDR(.data) - LOAD_OFFSET) { .data : AT(ADDR(.data) - LOAD_OFFSET) {
DATA_DATA DATA_DATA
*(.data.rel*) *(.data.rel*)
*(.sdata) *(SDATA_MAIN)
*(.sdata2) *(.sdata2)
*(.got.plt) *(.got) *(.got.plt) *(.got)
*(.plt) *(.plt)
...@@ -303,7 +303,7 @@ SECTIONS ...@@ -303,7 +303,7 @@ SECTIONS
.opd : AT(ADDR(.opd) - LOAD_OFFSET) { .opd : AT(ADDR(.opd) - LOAD_OFFSET) {
__start_opd = .; __start_opd = .;
*(.opd) KEEP(*(.opd))
__end_opd = .; __end_opd = .;
} }
......
...@@ -18,7 +18,7 @@ KBUILD_CFLAGS += -m64 ...@@ -18,7 +18,7 @@ KBUILD_CFLAGS += -m64
KBUILD_AFLAGS += -m64 KBUILD_AFLAGS += -m64
UTS_MACHINE := s390x UTS_MACHINE := s390x
STACK_SIZE := 16384 STACK_SIZE := 16384
CHECKFLAGS += -D__s390__ -D__s390x__ -mbig-endian CHECKFLAGS += -D__s390__ -D__s390x__
export LD_BFD export LD_BFD
......
...@@ -39,7 +39,7 @@ else ...@@ -39,7 +39,7 @@ else
# sparc64 # sparc64
# #
CHECKFLAGS += -D__sparc__ -D__sparc_v9__ -D__arch64__ -m64 CHECKFLAGS += -D__sparc__ -D__sparc_v9__ -D__arch64__
LDFLAGS := -m elf64_sparc LDFLAGS := -m elf64_sparc
export BITS := 64 export BITS := 64
UTS_MACHINE := sparc64 UTS_MACHINE := sparc64
......
...@@ -94,7 +94,7 @@ ifeq ($(CONFIG_X86_32),y) ...@@ -94,7 +94,7 @@ ifeq ($(CONFIG_X86_32),y)
else else
BITS := 64 BITS := 64
UTS_MACHINE := x86_64 UTS_MACHINE := x86_64
CHECKFLAGS += -D__x86_64__ -m64 CHECKFLAGS += -D__x86_64__
biarch := -m64 biarch := -m64
KBUILD_AFLAGS += -m64 KBUILD_AFLAGS += -m64
......
...@@ -19,42 +19,32 @@ ...@@ -19,42 +19,32 @@
#define KCRC_ALIGN 4 #define KCRC_ALIGN 4
#endif #endif
#ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX
#define KSYM(name) _##name
#else
#define KSYM(name) name
#endif
/* /*
* note on .section use: @progbits vs %progbits nastiness doesn't matter, * note on .section use: @progbits vs %progbits nastiness doesn't matter,
* since we immediately emit into those sections anyway. * since we immediately emit into those sections anyway.
*/ */
.macro ___EXPORT_SYMBOL name,val,sec .macro ___EXPORT_SYMBOL name,val,sec
#ifdef CONFIG_MODULES #ifdef CONFIG_MODULES
.globl KSYM(__ksymtab_\name) .globl __ksymtab_\name
.section ___ksymtab\sec+\name,"a" .section ___ksymtab\sec+\name,"a"
.balign KSYM_ALIGN .balign KSYM_ALIGN
KSYM(__ksymtab_\name): __ksymtab_\name:
__put \val, KSYM(__kstrtab_\name) __put \val, __kstrtab_\name
.previous .previous
.section __ksymtab_strings,"a" .section __ksymtab_strings,"a"
KSYM(__kstrtab_\name): __kstrtab_\name:
#ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX
.asciz "_\name"
#else
.asciz "\name" .asciz "\name"
#endif
.previous .previous
#ifdef CONFIG_MODVERSIONS #ifdef CONFIG_MODVERSIONS
.section ___kcrctab\sec+\name,"a" .section ___kcrctab\sec+\name,"a"
.balign KCRC_ALIGN .balign KCRC_ALIGN
KSYM(__kcrctab_\name): __kcrctab_\name:
#if defined(CONFIG_MODULE_REL_CRCS) #if defined(CONFIG_MODULE_REL_CRCS)
.long KSYM(__crc_\name) - . .long __crc_\name - .
#else #else
.long KSYM(__crc_\name) .long __crc_\name
#endif #endif
.weak KSYM(__crc_\name) .weak __crc_\name
.previous .previous
#endif #endif
#endif #endif
...@@ -84,12 +74,12 @@ KSYM(__kcrctab_\name): ...@@ -84,12 +74,12 @@ KSYM(__kcrctab_\name):
#endif #endif
#define EXPORT_SYMBOL(name) \ #define EXPORT_SYMBOL(name) \
__EXPORT_SYMBOL(name, KSYM_FUNC(KSYM(name)),) __EXPORT_SYMBOL(name, KSYM_FUNC(name),)
#define EXPORT_SYMBOL_GPL(name) \ #define EXPORT_SYMBOL_GPL(name) \
__EXPORT_SYMBOL(name, KSYM_FUNC(KSYM(name)), _gpl) __EXPORT_SYMBOL(name, KSYM_FUNC(name), _gpl)
#define EXPORT_DATA_SYMBOL(name) \ #define EXPORT_DATA_SYMBOL(name) \
__EXPORT_SYMBOL(name, KSYM(name),) __EXPORT_SYMBOL(name, name,)
#define EXPORT_DATA_SYMBOL_GPL(name) \ #define EXPORT_DATA_SYMBOL_GPL(name) \
__EXPORT_SYMBOL(name, KSYM(name),_gpl) __EXPORT_SYMBOL(name, name,_gpl)
#endif #endif
This diff is collapsed.
...@@ -10,14 +10,8 @@ ...@@ -10,14 +10,8 @@
* hackers place grumpy comments in header files. * hackers place grumpy comments in header files.
*/ */
/* Some toolchains use a `_' prefix for all user symbols. */
#ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX
#define __VMLINUX_SYMBOL(x) _##x
#define __VMLINUX_SYMBOL_STR(x) "_" #x
#else
#define __VMLINUX_SYMBOL(x) x #define __VMLINUX_SYMBOL(x) x
#define __VMLINUX_SYMBOL_STR(x) #x #define __VMLINUX_SYMBOL_STR(x) #x
#endif
/* Indirect, so macros are expanded before pasting. */ /* Indirect, so macros are expanded before pasting. */
#define VMLINUX_SYMBOL(x) __VMLINUX_SYMBOL(x) #define VMLINUX_SYMBOL(x) __VMLINUX_SYMBOL(x)
...@@ -46,14 +40,14 @@ extern struct module __this_module; ...@@ -46,14 +40,14 @@ extern struct module __this_module;
#if defined(CONFIG_MODULE_REL_CRCS) #if defined(CONFIG_MODULE_REL_CRCS)
#define __CRC_SYMBOL(sym, sec) \ #define __CRC_SYMBOL(sym, sec) \
asm(" .section \"___kcrctab" sec "+" #sym "\", \"a\" \n" \ asm(" .section \"___kcrctab" sec "+" #sym "\", \"a\" \n" \
" .weak " VMLINUX_SYMBOL_STR(__crc_##sym) " \n" \ " .weak __crc_" #sym " \n" \
" .long " VMLINUX_SYMBOL_STR(__crc_##sym) " - . \n" \ " .long __crc_" #sym " - . \n" \
" .previous \n"); " .previous \n");
#else #else
#define __CRC_SYMBOL(sym, sec) \ #define __CRC_SYMBOL(sym, sec) \
asm(" .section \"___kcrctab" sec "+" #sym "\", \"a\" \n" \ asm(" .section \"___kcrctab" sec "+" #sym "\", \"a\" \n" \
" .weak " VMLINUX_SYMBOL_STR(__crc_##sym) " \n" \ " .weak __crc_" #sym " \n" \
" .long " VMLINUX_SYMBOL_STR(__crc_##sym) " \n" \ " .long __crc_" #sym " \n" \
" .previous \n"); " .previous \n");
#endif #endif
#else #else
...@@ -66,7 +60,7 @@ extern struct module __this_module; ...@@ -66,7 +60,7 @@ extern struct module __this_module;
__CRC_SYMBOL(sym, sec) \ __CRC_SYMBOL(sym, sec) \
static const char __kstrtab_##sym[] \ static const char __kstrtab_##sym[] \
__attribute__((section("__ksymtab_strings"), aligned(1))) \ __attribute__((section("__ksymtab_strings"), aligned(1))) \
= VMLINUX_SYMBOL_STR(sym); \ = #sym; \
static const struct kernel_symbol __ksymtab_##sym \ static const struct kernel_symbol __ksymtab_##sym \
__used \ __used \
__attribute__((section("___ksymtab" sec "+" #sym), used)) \ __attribute__((section("___ksymtab" sec "+" #sym), used)) \
......
...@@ -1038,6 +1038,33 @@ config CC_OPTIMIZE_FOR_SIZE ...@@ -1038,6 +1038,33 @@ config CC_OPTIMIZE_FOR_SIZE
endchoice endchoice
config HAVE_LD_DEAD_CODE_DATA_ELIMINATION
bool
help
This requires that the arch annotates or otherwise protects
its external entry points from being discarded. Linker scripts
must also merge .text.*, .data.*, and .bss.* correctly into
output sections. Care must be taken not to pull in unrelated
sections (e.g., '.text.init'). Typically '.' in section names
is used to distinguish them from label names / C identifiers.
config LD_DEAD_CODE_DATA_ELIMINATION
bool "Dead code and data elimination (EXPERIMENTAL)"
depends on HAVE_LD_DEAD_CODE_DATA_ELIMINATION
depends on EXPERT
help
Select this if the architecture wants to do dead code and
data elimination with the linker by compiling with
-ffunction-sections -fdata-sections, and linking with
--gc-sections.
This can reduce on disk and in-memory size of the kernel
code and static data, particularly for small configs and
on small systems. This has the possibility of introducing
silently broken kernel if the required annotations are not
present. This option is not well tested yet, so use at your
own risk.
config SYSCTL config SYSCTL
bool bool
......
...@@ -147,7 +147,6 @@ $(obj)/%.i: $(src)/%.c FORCE ...@@ -147,7 +147,6 @@ $(obj)/%.i: $(src)/%.c FORCE
cmd_gensymtypes_c = \ cmd_gensymtypes_c = \
$(CPP) -D__GENKSYMS__ $(c_flags) $< | \ $(CPP) -D__GENKSYMS__ $(c_flags) $< | \
$(GENKSYMS) $(if $(1), -T $(2)) \ $(GENKSYMS) $(if $(1), -T $(2)) \
$(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX)) \
$(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS)) \ $(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS)) \
$(if $(KBUILD_PRESERVE),-p) \ $(if $(KBUILD_PRESERVE),-p) \
-r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null)) -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
...@@ -355,7 +354,6 @@ cmd_gensymtypes_S = \ ...@@ -355,7 +354,6 @@ cmd_gensymtypes_S = \
sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ) | \ sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ) | \
$(CPP) -D__GENKSYMS__ $(c_flags) -xc - | \ $(CPP) -D__GENKSYMS__ $(c_flags) -xc - | \
$(GENKSYMS) $(if $(1), -T $(2)) \ $(GENKSYMS) $(if $(1), -T $(2)) \
$(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX)) \
$(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS)) \ $(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS)) \
$(if $(KBUILD_PRESERVE),-p) \ $(if $(KBUILD_PRESERVE),-p) \
-r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null)) -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
...@@ -487,15 +485,10 @@ targets += $(lib-target) ...@@ -487,15 +485,10 @@ targets += $(lib-target)
dummy-object = $(obj)/.lib_exports.o dummy-object = $(obj)/.lib_exports.o
ksyms-lds = $(dot-target).lds ksyms-lds = $(dot-target).lds
ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX
ref_prefix = EXTERN(_
else
ref_prefix = EXTERN(
endif
quiet_cmd_export_list = EXPORTS $@ quiet_cmd_export_list = EXPORTS $@
cmd_export_list = $(OBJDUMP) -h $< | \ cmd_export_list = $(OBJDUMP) -h $< | \
sed -ne '/___ksymtab/s/.*+\([^ ]*\).*/$(ref_prefix)\1)/p' >$(ksyms-lds);\ sed -ne '/___ksymtab/s/.*+\([^ ]*\).*/EXTERN(\1)/p' >$(ksyms-lds);\
rm -f $(dummy-object);\ rm -f $(dummy-object);\
echo | $(CC) $(a_flags) -c -o $(dummy-object) -x assembler -;\ echo | $(CC) $(a_flags) -c -o $(dummy-object) -x assembler -;\
$(LD) $(ld_flags) -r -o $@ -T $(ksyms-lds) $(dummy-object);\ $(LD) $(ld_flags) -r -o $@ -T $(ksyms-lds) $(dummy-object);\
......
...@@ -61,9 +61,6 @@ for mod in "$MODVERDIR"/*.mod; do ...@@ -61,9 +61,6 @@ for mod in "$MODVERDIR"/*.mod; do
sed -n -e '3{s/ /\n/g;/^$/!p;}' "$mod" sed -n -e '3{s/ /\n/g;/^$/!p;}' "$mod"
done | sort -u | done | sort -u |
while read sym; do while read sym; do
if [ -n "$CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX" ]; then
sym="${sym#_}"
fi
echo "#define __KSYM_${sym} 1" echo "#define __KSYM_${sym} 1"
done >> "$new_ksyms_file" done >> "$new_ksyms_file"
......
...@@ -115,7 +115,7 @@ static void usage(void) ...@@ -115,7 +115,7 @@ static void usage(void)
*/ */
static void print_dep(const char *m, int slen, const char *dir) static void print_dep(const char *m, int slen, const char *dir)
{ {
int c, i; int c, prev_c = '/', i;
printf(" $(wildcard %s/", dir); printf(" $(wildcard %s/", dir);
for (i = 0; i < slen; i++) { for (i = 0; i < slen; i++) {
...@@ -124,7 +124,9 @@ static void print_dep(const char *m, int slen, const char *dir) ...@@ -124,7 +124,9 @@ static void print_dep(const char *m, int slen, const char *dir)
c = '/'; c = '/';
else else
c = tolower(c); c = tolower(c);
putchar(c); if (c != '/' || prev_c != '/')
putchar(c);
prev_c = c;
} }
printf(".h) \\\n"); printf(".h) \\\n");
} }
......
...@@ -5121,16 +5121,6 @@ sub process { ...@@ -5121,16 +5121,6 @@ sub process {
} }
} }
# make sure symbols are always wrapped with VMLINUX_SYMBOL() ...
# all assignments may have only one of the following with an assignment:
# .
# ALIGN(...)
# VMLINUX_SYMBOL(...)
if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {
WARN("MISSING_VMLINUX_SYMBOL",
"vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr);
}
# check for redundant bracing round if etc # check for redundant bracing round if etc
if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) { if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
my ($level, $endln, @chunks) = my ($level, $endln, @chunks) =
......
...@@ -67,12 +67,14 @@ identifier lock,unlock; ...@@ -67,12 +67,14 @@ identifier lock,unlock;
@@ @@
*lock(E1@p,...); *lock(E1@p,...);
<+... when != E1 ... when != E1
when any
if (...) { if (...) {
... when != E1 ... when != E1
* return@r ...; * return@r ...;
} }
...+> ... when != E1
when any
*unlock@up(E1,...); *unlock@up(E1,...);
@script:python depends on org@ @script:python depends on org@
......
...@@ -14,18 +14,10 @@ virtual context ...@@ -14,18 +14,10 @@ virtual context
virtual org virtual org
virtual report virtual report
@ifm@
expression *E;
statement S1,S2;
position p1;
@@
if@p1 ((E == NULL && ...) || ...) S1 else S2
// The following two rules are separate, because both can match a single // The following two rules are separate, because both can match a single
// expression in different ways // expression in different ways
@pr1 expression@ @pr1 expression@
expression *ifm.E; expression E;
identifier f; identifier f;
position p1; position p1;
@@ @@
...@@ -33,7 +25,7 @@ position p1; ...@@ -33,7 +25,7 @@ position p1;
(E != NULL && ...) ? <+...E->f@p1...+> : ... (E != NULL && ...) ? <+...E->f@p1...+> : ...
@pr2 expression@ @pr2 expression@
expression *ifm.E; expression E;
identifier f; identifier f;
position p2; position p2;
@@ @@
...@@ -46,6 +38,14 @@ position p2; ...@@ -46,6 +38,14 @@ position p2;
sizeof(<+...E->f@p2...+>) sizeof(<+...E->f@p2...+>)
) )
@ifm@
expression *E;
statement S1,S2;
position p1;
@@
if@p1 ((E == NULL && ...) || ...) S1 else S2
// For org and report modes // For org and report modes
@r depends on !context && (org || report) exists@ @r depends on !context && (org || report) exists@
...@@ -212,16 +212,8 @@ else S3 ...@@ -212,16 +212,8 @@ else S3
// The following three rules are duplicates of ifm, pr1 and pr2 respectively. // The following three rules are duplicates of ifm, pr1 and pr2 respectively.
// It is need because the previous rule as already made a "change". // It is need because the previous rule as already made a "change".
@ifm1 depends on context && !org && !report@
expression *E;
statement S1,S2;
position p1;
@@
if@p1 ((E == NULL && ...) || ...) S1 else S2
@pr11 depends on context && !org && !report expression@ @pr11 depends on context && !org && !report expression@
expression *ifm1.E; expression E;
identifier f; identifier f;
position p1; position p1;
@@ @@
...@@ -229,7 +221,7 @@ position p1; ...@@ -229,7 +221,7 @@ position p1;
(E != NULL && ...) ? <+...E->f@p1...+> : ... (E != NULL && ...) ? <+...E->f@p1...+> : ...
@pr12 depends on context && !org && !report expression@ @pr12 depends on context && !org && !report expression@
expression *ifm1.E; expression E;
identifier f; identifier f;
position p2; position p2;
@@ @@
...@@ -242,6 +234,14 @@ position p2; ...@@ -242,6 +234,14 @@ position p2;
sizeof(<+...E->f@p2...+>) sizeof(<+...E->f@p2...+>)
) )
@ifm1 depends on context && !org && !report@
expression *E;
statement S1,S2;
position p1;
@@
if@p1 ((E == NULL && ...) || ...) S1 else S2
@depends on context && !org && !report exists@ @depends on context && !org && !report exists@
expression subE <= ifm1.E; expression subE <= ifm1.E;
expression *ifm1.E; expression *ifm1.E;
......
...@@ -3,36 +3,17 @@ ...@@ -3,36 +3,17 @@
# #
# A depmod wrapper used by the toplevel Makefile # A depmod wrapper used by the toplevel Makefile
if test $# -ne 3; then if test $# -ne 2; then
echo "Usage: $0 /sbin/depmod <kernelrelease> <symbolprefix>" >&2 echo "Usage: $0 /sbin/depmod <kernelrelease>" >&2
exit 1 exit 1
fi fi
DEPMOD=$1 DEPMOD=$1
KERNELRELEASE=$2 KERNELRELEASE=$2
SYMBOL_PREFIX=$3
if ! test -r System.map -a -x "$DEPMOD"; then if ! test -r System.map -a -x "$DEPMOD"; then
exit 0 exit 0
fi fi
# older versions of depmod don't support -P <symbol-prefix>
# support was added in module-init-tools 3.13
if test -n "$SYMBOL_PREFIX"; then
release=$("$DEPMOD" --version)
package=$(echo "$release" | cut -d' ' -f 1)
if test "$package" = "module-init-tools"; then
version=$(echo "$release" | cut -d' ' -f 2)
later=$(printf '%s\n' "$version" "3.13" | sort -V | tail -n 1)
if test "$later" != "$version"; then
# module-init-tools < 3.13, drop the symbol prefix
SYMBOL_PREFIX=""
fi
fi
if test -n "$SYMBOL_PREFIX"; then
SYMBOL_PREFIX="-P $SYMBOL_PREFIX"
fi
fi
# older versions of depmod require the version string to start with three # older versions of depmod require the version string to start with three
# numbers, so we cheat with a symlink here # numbers, so we cheat with a symlink here
depmod_hack_needed=true depmod_hack_needed=true
...@@ -55,7 +36,7 @@ set -- -ae -F System.map ...@@ -55,7 +36,7 @@ set -- -ae -F System.map
if test -n "$INSTALL_MOD_PATH"; then if test -n "$INSTALL_MOD_PATH"; then
set -- "$@" -b "$INSTALL_MOD_PATH" set -- "$@" -b "$INSTALL_MOD_PATH"
fi fi
"$DEPMOD" "$@" "$KERNELRELEASE" $SYMBOL_PREFIX "$DEPMOD" "$@" "$KERNELRELEASE"
ret=$? ret=$?
if $depmod_hack_needed; then if $depmod_hack_needed; then
......
...@@ -45,7 +45,6 @@ int in_source_file; ...@@ -45,7 +45,6 @@ int in_source_file;
static int flag_debug, flag_dump_defs, flag_reference, flag_dump_types, static int flag_debug, flag_dump_defs, flag_reference, flag_dump_types,
flag_preserve, flag_warnings, flag_rel_crcs; flag_preserve, flag_warnings, flag_rel_crcs;
static const char *mod_prefix = "";
static int errors; static int errors;
static int nsyms; static int nsyms;
...@@ -693,10 +692,10 @@ void export_symbol(const char *name) ...@@ -693,10 +692,10 @@ void export_symbol(const char *name)
fputs(">\n", debugfile); fputs(">\n", debugfile);
/* Used as a linker script. */ /* Used as a linker script. */
printf(!flag_rel_crcs ? "%s__crc_%s = 0x%08lx;\n" : printf(!flag_rel_crcs ? "__crc_%s = 0x%08lx;\n" :
"SECTIONS { .rodata : ALIGN(4) { " "SECTIONS { .rodata : ALIGN(4) { "
"%s__crc_%s = .; LONG(0x%08lx); } }\n", "__crc_%s = .; LONG(0x%08lx); } }\n",
mod_prefix, name, crc); name, crc);
} }
} }
...@@ -769,7 +768,6 @@ int main(int argc, char **argv) ...@@ -769,7 +768,6 @@ int main(int argc, char **argv)
#ifdef __GNU_LIBRARY__ #ifdef __GNU_LIBRARY__
struct option long_opts[] = { struct option long_opts[] = {
{"symbol-prefix", 1, 0, 's'},
{"debug", 0, 0, 'd'}, {"debug", 0, 0, 'd'},
{"warnings", 0, 0, 'w'}, {"warnings", 0, 0, 'w'},
{"quiet", 0, 0, 'q'}, {"quiet", 0, 0, 'q'},
...@@ -789,9 +787,6 @@ int main(int argc, char **argv) ...@@ -789,9 +787,6 @@ int main(int argc, char **argv)
while ((o = getopt(argc, argv, "s:dwqVDr:T:phR")) != EOF) while ((o = getopt(argc, argv, "s:dwqVDr:T:phR")) != EOF)
#endif /* __GNU_LIBRARY__ */ #endif /* __GNU_LIBRARY__ */
switch (o) { switch (o) {
case 's':
mod_prefix = optarg;
break;
case 'd': case 'd':
flag_debug++; flag_debug++;
break; break;
......
...@@ -62,7 +62,6 @@ static struct sym_entry *table; ...@@ -62,7 +62,6 @@ static struct sym_entry *table;
static unsigned int table_size, table_cnt; static unsigned int table_size, table_cnt;
static int all_symbols = 0; static int all_symbols = 0;
static int absolute_percpu = 0; static int absolute_percpu = 0;
static char symbol_prefix_char = '\0';
static int base_relative = 0; static int base_relative = 0;
int token_profit[0x10000]; int token_profit[0x10000];
...@@ -75,7 +74,6 @@ unsigned char best_table_len[256]; ...@@ -75,7 +74,6 @@ unsigned char best_table_len[256];
static void usage(void) static void usage(void)
{ {
fprintf(stderr, "Usage: kallsyms [--all-symbols] " fprintf(stderr, "Usage: kallsyms [--all-symbols] "
"[--symbol-prefix=<prefix char>] "
"[--base-relative] < in.map > out.S\n"); "[--base-relative] < in.map > out.S\n");
exit(1); exit(1);
} }
...@@ -113,28 +111,22 @@ static int check_symbol_range(const char *sym, unsigned long long addr, ...@@ -113,28 +111,22 @@ static int check_symbol_range(const char *sym, unsigned long long addr,
static int read_symbol(FILE *in, struct sym_entry *s) static int read_symbol(FILE *in, struct sym_entry *s)
{ {
char str[500]; char sym[500], stype;
char *sym, stype;
int rc; int rc;
rc = fscanf(in, "%llx %c %499s\n", &s->addr, &stype, str); rc = fscanf(in, "%llx %c %499s\n", &s->addr, &stype, sym);
if (rc != 3) { if (rc != 3) {
if (rc != EOF && fgets(str, 500, in) == NULL) if (rc != EOF && fgets(sym, 500, in) == NULL)
fprintf(stderr, "Read error or end of file.\n"); fprintf(stderr, "Read error or end of file.\n");
return -1; return -1;
} }
if (strlen(str) > KSYM_NAME_LEN) { if (strlen(sym) > KSYM_NAME_LEN) {
fprintf(stderr, "Symbol %s too long for kallsyms (%zu vs %d).\n" fprintf(stderr, "Symbol %s too long for kallsyms (%zu vs %d).\n"
"Please increase KSYM_NAME_LEN both in kernel and kallsyms.c\n", "Please increase KSYM_NAME_LEN both in kernel and kallsyms.c\n",
str, strlen(str), KSYM_NAME_LEN); sym, strlen(sym), KSYM_NAME_LEN);
return -1; return -1;
} }
sym = str;
/* skip prefix char */
if (symbol_prefix_char && str[0] == symbol_prefix_char)
sym++;
/* Ignore most absolute/undefined (?) symbols. */ /* Ignore most absolute/undefined (?) symbols. */
if (strcmp(sym, "_text") == 0) if (strcmp(sym, "_text") == 0)
_text = s->addr; _text = s->addr;
...@@ -155,7 +147,7 @@ static int read_symbol(FILE *in, struct sym_entry *s) ...@@ -155,7 +147,7 @@ static int read_symbol(FILE *in, struct sym_entry *s)
is_arm_mapping_symbol(sym)) is_arm_mapping_symbol(sym))
return -1; return -1;
/* exclude also MIPS ELF local symbols ($L123 instead of .L123) */ /* exclude also MIPS ELF local symbols ($L123 instead of .L123) */
else if (str[0] == '$') else if (sym[0] == '$')
return -1; return -1;
/* exclude debugging symbols */ /* exclude debugging symbols */
else if (stype == 'N' || stype == 'n') else if (stype == 'N' || stype == 'n')
...@@ -163,14 +155,14 @@ static int read_symbol(FILE *in, struct sym_entry *s) ...@@ -163,14 +155,14 @@ static int read_symbol(FILE *in, struct sym_entry *s)
/* include the type field in the symbol name, so that it gets /* include the type field in the symbol name, so that it gets
* compressed together */ * compressed together */
s->len = strlen(str) + 1; s->len = strlen(sym) + 1;
s->sym = malloc(s->len + 1); s->sym = malloc(s->len + 1);
if (!s->sym) { if (!s->sym) {
fprintf(stderr, "kallsyms failure: " fprintf(stderr, "kallsyms failure: "
"unable to allocate required amount of memory\n"); "unable to allocate required amount of memory\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
strcpy((char *)s->sym + 1, str); strcpy((char *)s->sym + 1, sym);
s->sym[0] = stype; s->sym[0] = stype;
s->percpu_absolute = 0; s->percpu_absolute = 0;
...@@ -233,11 +225,6 @@ static int symbol_valid(struct sym_entry *s) ...@@ -233,11 +225,6 @@ static int symbol_valid(struct sym_entry *s)
int i; int i;
char *sym_name = (char *)s->sym + 1; char *sym_name = (char *)s->sym + 1;
/* skip prefix char */
if (symbol_prefix_char && *sym_name == symbol_prefix_char)
sym_name++;
/* if --all-symbols is not specified, then symbols outside the text /* if --all-symbols is not specified, then symbols outside the text
* and inittext sections are discarded */ * and inittext sections are discarded */
if (!all_symbols) { if (!all_symbols) {
...@@ -302,15 +289,9 @@ static void read_map(FILE *in) ...@@ -302,15 +289,9 @@ static void read_map(FILE *in)
static void output_label(char *label) static void output_label(char *label)
{ {
if (symbol_prefix_char) printf(".globl %s\n", label);
printf(".globl %c%s\n", symbol_prefix_char, label);
else
printf(".globl %s\n", label);
printf("\tALGN\n"); printf("\tALGN\n");
if (symbol_prefix_char) printf("%s:\n", label);
printf("%c%s:\n", symbol_prefix_char, label);
else
printf("%s:\n", label);
} }
/* uncompress a compressed symbol. When this function is called, the best table /* uncompress a compressed symbol. When this function is called, the best table
...@@ -424,7 +405,7 @@ static void write_src(void) ...@@ -424,7 +405,7 @@ static void write_src(void)
} }
output_label("kallsyms_num_syms"); output_label("kallsyms_num_syms");
printf("\tPTR\t%d\n", table_cnt); printf("\tPTR\t%u\n", table_cnt);
printf("\n"); printf("\n");
/* table of offset markers, that give the offset in the compressed stream /* table of offset markers, that give the offset in the compressed stream
...@@ -768,13 +749,7 @@ int main(int argc, char **argv) ...@@ -768,13 +749,7 @@ int main(int argc, char **argv)
all_symbols = 1; all_symbols = 1;
else if (strcmp(argv[i], "--absolute-percpu") == 0) else if (strcmp(argv[i], "--absolute-percpu") == 0)
absolute_percpu = 1; absolute_percpu = 1;
else if (strncmp(argv[i], "--symbol-prefix=", 16) == 0) { else if (strcmp(argv[i], "--base-relative") == 0)
char *p = &argv[i][16];
/* skip quote */
if ((*p == '"' && *(p+2) == '"') || (*p == '\'' && *(p+2) == '\''))
p++;
symbol_prefix_char = *p;
} else if (strcmp(argv[i], "--base-relative") == 0)
base_relative = 1; base_relative = 1;
else else
usage(); usage();
......
...@@ -121,10 +121,6 @@ kallsyms() ...@@ -121,10 +121,6 @@ kallsyms()
info KSYM ${2} info KSYM ${2}
local kallsymopt; local kallsymopt;
if [ -n "${CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX}" ]; then
kallsymopt="${kallsymopt} --symbol-prefix=_"
fi
if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then
kallsymopt="${kallsymopt} --all-symbols" kallsymopt="${kallsymopt} --all-symbols"
fi fi
......
...@@ -19,9 +19,7 @@ ...@@ -19,9 +19,7 @@
#include <stdbool.h> #include <stdbool.h>
#include <errno.h> #include <errno.h>
#include "modpost.h" #include "modpost.h"
#include "../../include/generated/autoconf.h"
#include "../../include/linux/license.h" #include "../../include/linux/license.h"
#include "../../include/linux/export.h"
/* Are we using CONFIG_MODVERSIONS? */ /* Are we using CONFIG_MODVERSIONS? */
static int modversions = 0; static int modversions = 0;
...@@ -123,7 +121,7 @@ void *do_nofail(void *ptr, const char *expr) ...@@ -123,7 +121,7 @@ void *do_nofail(void *ptr, const char *expr)
/* A list of all modules we processed */ /* A list of all modules we processed */
static struct module *modules; static struct module *modules;
static struct module *find_module(char *modname) static struct module *find_module(const char *modname)
{ {
struct module *mod; struct module *mod;
...@@ -591,35 +589,32 @@ static void parse_elf_finish(struct elf_info *info) ...@@ -591,35 +589,32 @@ static void parse_elf_finish(struct elf_info *info)
static int ignore_undef_symbol(struct elf_info *info, const char *symname) static int ignore_undef_symbol(struct elf_info *info, const char *symname)
{ {
/* ignore __this_module, it will be resolved shortly */ /* ignore __this_module, it will be resolved shortly */
if (strcmp(symname, VMLINUX_SYMBOL_STR(__this_module)) == 0) if (strcmp(symname, "__this_module") == 0)
return 1; return 1;
/* ignore global offset table */ /* ignore global offset table */
if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0) if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0)
return 1; return 1;
if (info->hdr->e_machine == EM_PPC) if (info->hdr->e_machine == EM_PPC)
/* Special register function linked on all modules during final link of .ko */ /* Special register function linked on all modules during final link of .ko */
if (strncmp(symname, "_restgpr_", sizeof("_restgpr_") - 1) == 0 || if (strstarts(symname, "_restgpr_") ||
strncmp(symname, "_savegpr_", sizeof("_savegpr_") - 1) == 0 || strstarts(symname, "_savegpr_") ||
strncmp(symname, "_rest32gpr_", sizeof("_rest32gpr_") - 1) == 0 || strstarts(symname, "_rest32gpr_") ||
strncmp(symname, "_save32gpr_", sizeof("_save32gpr_") - 1) == 0 || strstarts(symname, "_save32gpr_") ||
strncmp(symname, "_restvr_", sizeof("_restvr_") - 1) == 0 || strstarts(symname, "_restvr_") ||
strncmp(symname, "_savevr_", sizeof("_savevr_") - 1) == 0) strstarts(symname, "_savevr_"))
return 1; return 1;
if (info->hdr->e_machine == EM_PPC64) if (info->hdr->e_machine == EM_PPC64)
/* Special register function linked on all modules during final link of .ko */ /* Special register function linked on all modules during final link of .ko */
if (strncmp(symname, "_restgpr0_", sizeof("_restgpr0_") - 1) == 0 || if (strstarts(symname, "_restgpr0_") ||
strncmp(symname, "_savegpr0_", sizeof("_savegpr0_") - 1) == 0 || strstarts(symname, "_savegpr0_") ||
strncmp(symname, "_restvr_", sizeof("_restvr_") - 1) == 0 || strstarts(symname, "_restvr_") ||
strncmp(symname, "_savevr_", sizeof("_savevr_") - 1) == 0 || strstarts(symname, "_savevr_") ||
strcmp(symname, ".TOC.") == 0) strcmp(symname, ".TOC.") == 0)
return 1; return 1;
/* Do not ignore this symbol */ /* Do not ignore this symbol */
return 0; return 0;
} }
#define CRC_PFX VMLINUX_SYMBOL_STR(__crc_)
#define KSYMTAB_PFX VMLINUX_SYMBOL_STR(__ksymtab_)
static void handle_modversions(struct module *mod, struct elf_info *info, static void handle_modversions(struct module *mod, struct elf_info *info,
Elf_Sym *sym, const char *symname) Elf_Sym *sym, const char *symname)
{ {
...@@ -628,13 +623,13 @@ static void handle_modversions(struct module *mod, struct elf_info *info, ...@@ -628,13 +623,13 @@ static void handle_modversions(struct module *mod, struct elf_info *info,
bool is_crc = false; bool is_crc = false;
if ((!is_vmlinux(mod->name) || mod->is_dot_o) && if ((!is_vmlinux(mod->name) || mod->is_dot_o) &&
strncmp(symname, "__ksymtab", 9) == 0) strstarts(symname, "__ksymtab"))
export = export_from_secname(info, get_secindex(info, sym)); export = export_from_secname(info, get_secindex(info, sym));
else else
export = export_from_sec(info, get_secindex(info, sym)); export = export_from_sec(info, get_secindex(info, sym));
/* CRC'd symbol */ /* CRC'd symbol */
if (strncmp(symname, CRC_PFX, strlen(CRC_PFX)) == 0) { if (strstarts(symname, "__crc_")) {
is_crc = true; is_crc = true;
crc = (unsigned int) sym->st_value; crc = (unsigned int) sym->st_value;
if (sym->st_shndx != SHN_UNDEF && sym->st_shndx != SHN_ABS) { if (sym->st_shndx != SHN_UNDEF && sym->st_shndx != SHN_ABS) {
...@@ -647,13 +642,13 @@ static void handle_modversions(struct module *mod, struct elf_info *info, ...@@ -647,13 +642,13 @@ static void handle_modversions(struct module *mod, struct elf_info *info,
info->sechdrs[sym->st_shndx].sh_addr : 0); info->sechdrs[sym->st_shndx].sh_addr : 0);
crc = *crcp; crc = *crcp;
} }
sym_update_crc(symname + strlen(CRC_PFX), mod, crc, sym_update_crc(symname + strlen("__crc_"), mod, crc,
export); export);
} }
switch (sym->st_shndx) { switch (sym->st_shndx) {
case SHN_COMMON: case SHN_COMMON:
if (!strncmp(symname, "__gnu_lto_", sizeof("__gnu_lto_")-1)) { if (strstarts(symname, "__gnu_lto_")) {
/* Should warn here, but modpost runs before the linker */ /* Should warn here, but modpost runs before the linker */
} else } else
warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name); warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name);
...@@ -685,15 +680,10 @@ static void handle_modversions(struct module *mod, struct elf_info *info, ...@@ -685,15 +680,10 @@ static void handle_modversions(struct module *mod, struct elf_info *info,
} }
#endif #endif
#ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX
if (symname[0] != '_')
break;
else
symname++;
#endif
if (is_crc) { if (is_crc) {
const char *e = is_vmlinux(mod->name) ?"":".ko"; const char *e = is_vmlinux(mod->name) ?"":".ko";
warn("EXPORT symbol \"%s\" [%s%s] version generation failed, symbol will not be versioned.\n", symname + strlen(CRC_PFX), mod->name, e); warn("EXPORT symbol \"%s\" [%s%s] version generation failed, symbol will not be versioned.\n",
symname + strlen("__crc_"), mod->name, e);
} }
mod->unres = alloc_symbol(symname, mod->unres = alloc_symbol(symname,
ELF_ST_BIND(sym->st_info) == STB_WEAK, ELF_ST_BIND(sym->st_info) == STB_WEAK,
...@@ -701,13 +691,13 @@ static void handle_modversions(struct module *mod, struct elf_info *info, ...@@ -701,13 +691,13 @@ static void handle_modversions(struct module *mod, struct elf_info *info,
break; break;
default: default:
/* All exported symbols */ /* All exported symbols */
if (strncmp(symname, KSYMTAB_PFX, strlen(KSYMTAB_PFX)) == 0) { if (strstarts(symname, "__ksymtab_")) {
sym_add_exported(symname + strlen(KSYMTAB_PFX), mod, sym_add_exported(symname + strlen("__ksymtab_"), mod,
export); export);
} }
if (strcmp(symname, VMLINUX_SYMBOL_STR(init_module)) == 0) if (strcmp(symname, "init_module") == 0)
mod->has_init = 1; mod->has_init = 1;
if (strcmp(symname, VMLINUX_SYMBOL_STR(cleanup_module)) == 0) if (strcmp(symname, "cleanup_module") == 0)
mod->has_cleanup = 1; mod->has_cleanup = 1;
break; break;
} }
...@@ -734,16 +724,17 @@ static char *next_string(char *string, unsigned long *secsize) ...@@ -734,16 +724,17 @@ static char *next_string(char *string, unsigned long *secsize)
return string; return string;
} }
static char *get_next_modinfo(void *modinfo, unsigned long modinfo_len, static char *get_next_modinfo(struct elf_info *info, const char *tag,
const char *tag, char *info) char *prev)
{ {
char *p; char *p;
unsigned int taglen = strlen(tag); unsigned int taglen = strlen(tag);
unsigned long size = modinfo_len; char *modinfo = info->modinfo;
unsigned long size = info->modinfo_len;
if (info) { if (prev) {
size -= info - (char *)modinfo; size -= prev - modinfo;
modinfo = next_string(info, &size); modinfo = next_string(prev, &size);
} }
for (p = modinfo; p; p = next_string(p, &size)) { for (p = modinfo; p; p = next_string(p, &size)) {
...@@ -753,11 +744,10 @@ static char *get_next_modinfo(void *modinfo, unsigned long modinfo_len, ...@@ -753,11 +744,10 @@ static char *get_next_modinfo(void *modinfo, unsigned long modinfo_len,
return NULL; return NULL;
} }
static char *get_modinfo(void *modinfo, unsigned long modinfo_len, static char *get_modinfo(struct elf_info *info, const char *tag)
const char *tag)
{ {
return get_next_modinfo(modinfo, modinfo_len, tag, NULL); return get_next_modinfo(info, tag, NULL);
} }
/** /**
...@@ -1181,13 +1171,13 @@ static int secref_whitelist(const struct sectioncheck *mismatch, ...@@ -1181,13 +1171,13 @@ static int secref_whitelist(const struct sectioncheck *mismatch,
/* Check for pattern 1 */ /* Check for pattern 1 */
if (match(tosec, init_data_sections) && if (match(tosec, init_data_sections) &&
match(fromsec, data_sections) && match(fromsec, data_sections) &&
(strncmp(fromsym, "__param", strlen("__param")) == 0)) strstarts(fromsym, "__param"))
return 0; return 0;
/* Check for pattern 1a */ /* Check for pattern 1a */
if (strcmp(tosec, ".init.text") == 0 && if (strcmp(tosec, ".init.text") == 0 &&
match(fromsec, data_sections) && match(fromsec, data_sections) &&
(strncmp(fromsym, "__param_ops_", strlen("__param_ops_")) == 0)) strstarts(fromsym, "__param_ops_"))
return 0; return 0;
/* Check for pattern 2 */ /* Check for pattern 2 */
...@@ -1542,8 +1532,7 @@ static void default_mismatch_handler(const char *modname, struct elf_info *elf, ...@@ -1542,8 +1532,7 @@ static void default_mismatch_handler(const char *modname, struct elf_info *elf,
from = find_elf_symbol2(elf, r->r_offset, fromsec); from = find_elf_symbol2(elf, r->r_offset, fromsec);
fromsym = sym_name(elf, from); fromsym = sym_name(elf, from);
if (!strncmp(fromsym, "reference___initcall", if (strstarts(fromsym, "reference___initcall"))
sizeof("reference___initcall")-1))
return; return;
tosec = sec_name(elf, get_secindex(elf, sym)); tosec = sec_name(elf, get_secindex(elf, sym));
...@@ -1940,7 +1929,7 @@ static char *remove_dot(char *s) ...@@ -1940,7 +1929,7 @@ static char *remove_dot(char *s)
return s; return s;
} }
static void read_symbols(char *modname) static void read_symbols(const char *modname)
{ {
const char *symname; const char *symname;
char *version; char *version;
...@@ -1961,7 +1950,7 @@ static void read_symbols(char *modname) ...@@ -1961,7 +1950,7 @@ static void read_symbols(char *modname)
mod->skip = 1; mod->skip = 1;
} }
license = get_modinfo(info.modinfo, info.modinfo_len, "license"); license = get_modinfo(&info, "license");
if (!license && !is_vmlinux(modname)) if (!license && !is_vmlinux(modname))
warn("modpost: missing MODULE_LICENSE() in %s\n" warn("modpost: missing MODULE_LICENSE() in %s\n"
"see include/linux/module.h for " "see include/linux/module.h for "
...@@ -1973,8 +1962,7 @@ static void read_symbols(char *modname) ...@@ -1973,8 +1962,7 @@ static void read_symbols(char *modname)
mod->gpl_compatible = 0; mod->gpl_compatible = 0;
break; break;
} }
license = get_next_modinfo(info.modinfo, info.modinfo_len, license = get_next_modinfo(&info, "license", license);
"license", license);
} }
for (sym = info.symtab_start; sym < info.symtab_stop; sym++) { for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
...@@ -1983,11 +1971,10 @@ static void read_symbols(char *modname) ...@@ -1983,11 +1971,10 @@ static void read_symbols(char *modname)
handle_modversions(mod, &info, sym, symname); handle_modversions(mod, &info, sym, symname);
handle_moddevtable(mod, &info, sym, symname); handle_moddevtable(mod, &info, sym, symname);
} }
if (!is_vmlinux(modname) || if (!is_vmlinux(modname) || vmlinux_section_warnings)
(is_vmlinux(modname) && vmlinux_section_warnings))
check_sec_ref(mod, modname, &info); check_sec_ref(mod, modname, &info);
version = get_modinfo(info.modinfo, info.modinfo_len, "version"); version = get_modinfo(&info, "version");
if (version) if (version)
maybe_frob_rcs_version(modname, version, info.modinfo, maybe_frob_rcs_version(modname, version, info.modinfo,
version - (char *)info.hdr); version - (char *)info.hdr);
...@@ -2174,9 +2161,7 @@ static void add_retpoline(struct buffer *b) ...@@ -2174,9 +2161,7 @@ static void add_retpoline(struct buffer *b)
static void add_staging_flag(struct buffer *b, const char *name) static void add_staging_flag(struct buffer *b, const char *name)
{ {
static const char *staging_dir = "drivers/staging"; if (strstarts(name, "drivers/staging"))
if (strncmp(staging_dir, name, strlen(staging_dir)) == 0)
buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n"); buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n");
} }
...@@ -2230,7 +2215,7 @@ static int add_versions(struct buffer *b, struct module *mod) ...@@ -2230,7 +2215,7 @@ static int add_versions(struct buffer *b, struct module *mod)
err = 1; err = 1;
break; break;
} }
buf_printf(b, "\t{ %#8x, __VMLINUX_SYMBOL_STR(%s) },\n", buf_printf(b, "\t{ %#8x, \"%s\" },\n",
s->crc, s->name); s->crc, s->name);
} }
......
...@@ -71,22 +71,21 @@ if [ "$ARCH" = "um" ] ; then ...@@ -71,22 +71,21 @@ if [ "$ARCH" = "um" ] ; then
packagename=user-mode-linux-$version packagename=user-mode-linux-$version
fi fi
# Try to determine maintainer and email values email=${DEBEMAIL-$EMAIL}
if [ -n "$DEBEMAIL" ]; then
email=$DEBEMAIL # use email string directly if it contains <email>
elif [ -n "$EMAIL" ]; then if echo $email | grep -q '<.*>'; then
email=$EMAIL maintainer=$email
else
email=$(id -nu)@$(hostname -f 2>/dev/null || hostname)
fi
if [ -n "$DEBFULLNAME" ]; then
name=$DEBFULLNAME
elif [ -n "$NAME" ]; then
name=$NAME
else else
name="Anonymous" # or construct the maintainer string
user=${KBUILD_BUILD_USER-$(id -nu)}
name=${DEBFULLNAME-$user}
if [ -z "$email" ]; then
buildhost=${KBUILD_BUILD_HOST-$(hostname -f 2>/dev/null || hostname)}
email="$user@$buildhost"
fi
maintainer="$name <$email>"
fi fi
maintainer="$name <$email>"
# Try to determine distribution # Try to determine distribution
if [ -n "$KDEB_CHANGELOG_DIST" ]; then if [ -n "$KDEB_CHANGELOG_DIST" ]; then
......
...@@ -500,7 +500,7 @@ do_file(char const *const fname) ...@@ -500,7 +500,7 @@ do_file(char const *const fname)
gpfx = 0; gpfx = 0;
switch (w2(ehdr->e_machine)) { switch (w2(ehdr->e_machine)) {
default: default:
fprintf(stderr, "unrecognized e_machine %d %s\n", fprintf(stderr, "unrecognized e_machine %u %s\n",
w2(ehdr->e_machine), fname); w2(ehdr->e_machine), fname);
fail_file(); fail_file();
break; break;
......
...@@ -441,7 +441,7 @@ static unsigned find_secsym_ndx(unsigned const txtndx, ...@@ -441,7 +441,7 @@ static unsigned find_secsym_ndx(unsigned const txtndx,
return symp - sym0; return symp - sym0;
} }
} }
fprintf(stderr, "Cannot find symbol for section %d: %s.\n", fprintf(stderr, "Cannot find symbol for section %u: %s.\n",
txtndx, txtname); txtndx, txtname);
fail_file(); fail_file();
} }
......
...@@ -28,20 +28,11 @@ fi ...@@ -28,20 +28,11 @@ fi
# ignore userspace tools # ignore userspace tools
ignore="$ignore ( -path ${tree}tools ) -prune -o" ignore="$ignore ( -path ${tree}tools ) -prune -o"
# Find all available archs
find_all_archs()
{
ALLSOURCE_ARCHS=""
for arch in `ls ${tree}arch`; do
ALLSOURCE_ARCHS="${ALLSOURCE_ARCHS} "${arch##\/}
done
}
# Detect if ALLSOURCE_ARCHS is set. If not, we assume SRCARCH # Detect if ALLSOURCE_ARCHS is set. If not, we assume SRCARCH
if [ "${ALLSOURCE_ARCHS}" = "" ]; then if [ "${ALLSOURCE_ARCHS}" = "" ]; then
ALLSOURCE_ARCHS=${SRCARCH} ALLSOURCE_ARCHS=${SRCARCH}
elif [ "${ALLSOURCE_ARCHS}" = "all" ]; then elif [ "${ALLSOURCE_ARCHS}" = "all" ]; then
find_all_archs ALLSOURCE_ARCHS=$(find ${tree}arch/ -mindepth 1 -maxdepth 1 -type d -printf '%f ')
fi fi
# find sources in arch/$ARCH # find sources in arch/$ARCH
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment