提交 da9e82b3 编写于 作者: L Linus Torvalds

Merge branch 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6

* 'kbuild' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6:
  modpost: support objects with more than 64k sections
  trivial: fix a typo in a filename
  frv: clean up arch/frv/Makefile
  kbuild: allow assignment to {A,C}FLAGS_KERNEL on the command line
  kbuild: allow assignment to {A,C,LD}FLAGS_MODULE on the command line
  Kbuild: Add option to set -femit-struct-debug-baseonly
  Makefile: "make kernelrelease" should show the correct full kernel version
  Makefile.build: make KBUILD_SYMTYPES work again
...@@ -22,11 +22,33 @@ building C files and assembler files. ...@@ -22,11 +22,33 @@ building C files and assembler files.
KAFLAGS KAFLAGS
-------------------------------------------------- --------------------------------------------------
Additional options to the assembler. Additional options to the assembler (for built-in and modules).
AFLAGS_MODULE
--------------------------------------------------
Addtional module specific options to use for $(AS).
AFLAGS_KERNEL
--------------------------------------------------
Addtional options for $(AS) when used for assembler
code for code that is compiled as built-in.
KCFLAGS KCFLAGS
-------------------------------------------------- --------------------------------------------------
Additional options to the C compiler. Additional options to the C compiler (for built-in and modules).
CFLAGS_KERNEL
--------------------------------------------------
Addtional options for $(CC) when used to compile
code that is compiled as built-in.
CFLAGS_MODULE
--------------------------------------------------
Addtional module specific options to use for $(CC).
LDFLAGS_MODULE
--------------------------------------------------
Additional options used for $(LD) when linking modules.
KBUILD_VERBOSE KBUILD_VERBOSE
-------------------------------------------------- --------------------------------------------------
......
...@@ -921,16 +921,33 @@ When kbuild executes, the following steps are followed (roughly): ...@@ -921,16 +921,33 @@ When kbuild executes, the following steps are followed (roughly):
The first example utilises the trick that a config option expands The first example utilises the trick that a config option expands
to 'y' when selected. to 'y' when selected.
CFLAGS_KERNEL $(CC) options specific for built-in KBUILD_AFLAGS_KERNEL $(AS) options specific for built-in
$(CFLAGS_KERNEL) contains extra C compiler flags used to compile $(KBUILD_AFLAGS_KERNEL) contains extra C compiler flags used to compile
resident kernel code. resident kernel code.
CFLAGS_MODULE $(CC) options specific for modules KBUILD_AFLAGS_MODULE Options for $(AS) when building modules
$(CFLAGS_MODULE) contains extra C compiler flags used to compile code $(KBUILD_AFLAGS_MODULE) is used to add arch specific options that
for loadable kernel modules. are used for $(AS).
From commandline AFLAGS_MODULE shall be used (see kbuild.txt).
KBUILD_CFLAGS_KERNEL $(CC) options specific for built-in
$(KBUILD_CFLAGS_KERNEL) contains extra C compiler flags used to compile
resident kernel code.
KBUILD_CFLAGS_MODULE Options for $(CC) when building modules
$(KBUILD_CFLAGS_MODULE) is used to add arch specific options that
are used for $(CC).
From commandline CFLAGS_MODULE shall be used (see kbuild.txt).
KBUILD_LDFLAGS_MODULE Options for $(LD) when linking modules
$(KBUILD_LDFLAGS_MODULE) is used to add arch specific options
used when linking modules. This is often a linker script.
From commandline LDFLAGS_MODULE shall be used (see kbuild.txt).
--- 6.2 Add prerequisites to archprepare: --- 6.2 Add prerequisites to archprepare:
......
...@@ -332,10 +332,9 @@ CHECK = sparse ...@@ -332,10 +332,9 @@ CHECK = sparse
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \ CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
-Wbitwise -Wno-return-void $(CF) -Wbitwise -Wno-return-void $(CF)
MODFLAGS = -DMODULE CFLAGS_MODULE =
CFLAGS_MODULE = $(MODFLAGS) AFLAGS_MODULE =
AFLAGS_MODULE = $(MODFLAGS) LDFLAGS_MODULE =
LDFLAGS_MODULE = -T $(srctree)/scripts/module-common.lds
CFLAGS_KERNEL = CFLAGS_KERNEL =
AFLAGS_KERNEL = AFLAGS_KERNEL =
CFLAGS_GCOV = -fprofile-arcs -ftest-coverage CFLAGS_GCOV = -fprofile-arcs -ftest-coverage
...@@ -354,7 +353,12 @@ KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ ...@@ -354,7 +353,12 @@ KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
-Werror-implicit-function-declaration \ -Werror-implicit-function-declaration \
-Wno-format-security \ -Wno-format-security \
-fno-delete-null-pointer-checks -fno-delete-null-pointer-checks
KBUILD_AFLAGS_KERNEL :=
KBUILD_CFLAGS_KERNEL :=
KBUILD_AFLAGS := -D__ASSEMBLY__ KBUILD_AFLAGS := -D__ASSEMBLY__
KBUILD_AFLAGS_MODULE := -DMODULE
KBUILD_CFLAGS_MODULE := -DMODULE
KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
# Read KERNELRELEASE from include/config/kernel.release (if it exists) # Read KERNELRELEASE from include/config/kernel.release (if it exists)
KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null) KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
...@@ -369,6 +373,8 @@ export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS ...@@ -369,6 +373,8 @@ export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS
export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV
export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE
export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE
export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
# When compiling out-of-tree modules, put MODVERDIR in the module # When compiling out-of-tree modules, put MODVERDIR in the module
# tree rather than in the kernel tree. The kernel tree might # tree rather than in the kernel tree. The kernel tree might
...@@ -414,7 +420,7 @@ endif ...@@ -414,7 +420,7 @@ endif
no-dot-config-targets := clean mrproper distclean \ no-dot-config-targets := clean mrproper distclean \
cscope TAGS tags help %docs check% \ cscope TAGS tags help %docs check% \
include/linux/version.h headers_% \ include/linux/version.h headers_% \
kernelrelease kernelversion kernelversion
config-targets := 0 config-targets := 0
mixed-targets := 0 mixed-targets := 0
...@@ -557,6 +563,10 @@ KBUILD_CFLAGS += -g ...@@ -557,6 +563,10 @@ KBUILD_CFLAGS += -g
KBUILD_AFLAGS += -gdwarf-2 KBUILD_AFLAGS += -gdwarf-2
endif endif
ifdef CONFIG_DEBUG_INFO_REDUCED
KBUILD_CFLAGS += $(call cc-option, -femit-struct-debug-baseonly)
endif
ifdef CONFIG_FUNCTION_TRACER ifdef CONFIG_FUNCTION_TRACER
KBUILD_CFLAGS += -pg KBUILD_CFLAGS += -pg
endif endif
...@@ -603,7 +613,7 @@ endif ...@@ -603,7 +613,7 @@ endif
# Use --build-id when available. # Use --build-id when available.
LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\ LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
$(call cc-ldoption, -Wl$(comma)--build-id,)) $(call cc-ldoption, -Wl$(comma)--build-id,))
LDFLAGS_MODULE += $(LDFLAGS_BUILD_ID) KBUILD_LDFLAGS_MODULE += $(LDFLAGS_BUILD_ID)
LDFLAGS_vmlinux += $(LDFLAGS_BUILD_ID) LDFLAGS_vmlinux += $(LDFLAGS_BUILD_ID)
ifeq ($(CONFIG_STRIP_ASM_SYMS),y) ifeq ($(CONFIG_STRIP_ASM_SYMS),y)
...@@ -1393,9 +1403,9 @@ checkstack: ...@@ -1393,9 +1403,9 @@ checkstack:
$(OBJDUMP) -d vmlinux $$(find . -name '*.ko') | \ $(OBJDUMP) -d vmlinux $$(find . -name '*.ko') | \
$(PERL) $(src)/scripts/checkstack.pl $(CHECKSTACK_ARCH) $(PERL) $(src)/scripts/checkstack.pl $(CHECKSTACK_ARCH)
kernelrelease: kernelrelease: include/config/kernel.release
$(if $(wildcard include/config/kernel.release), $(Q)echo $(KERNELRELEASE), \ @echo $(KERNELRELEASE)
$(error kernelrelease not valid - run 'make prepare' to update it))
kernelversion: kernelversion:
@echo $(KERNELVERSION) @echo $(KERNELVERSION)
...@@ -1472,6 +1482,7 @@ cmd_crmodverdir = $(Q)mkdir -p $(MODVERDIR) \ ...@@ -1472,6 +1482,7 @@ cmd_crmodverdir = $(Q)mkdir -p $(MODVERDIR) \
$(if $(KBUILD_MODULES),; rm -f $(MODVERDIR)/*) $(if $(KBUILD_MODULES),; rm -f $(MODVERDIR)/*)
a_flags = -Wp,-MD,$(depfile) $(KBUILD_AFLAGS) $(AFLAGS_KERNEL) \ a_flags = -Wp,-MD,$(depfile) $(KBUILD_AFLAGS) $(AFLAGS_KERNEL) \
$(KBUILD_AFLAGS_KERNEL) \
$(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(KBUILD_CPPFLAGS) \ $(NOSTDINC_FLAGS) $(LINUXINCLUDE) $(KBUILD_CPPFLAGS) \
$(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(basetarget).o) $(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(basetarget).o)
......
...@@ -13,7 +13,7 @@ KBUILD_DEFCONFIG := atstk1002_defconfig ...@@ -13,7 +13,7 @@ KBUILD_DEFCONFIG := atstk1002_defconfig
KBUILD_CFLAGS += -pipe -fno-builtin -mno-pic KBUILD_CFLAGS += -pipe -fno-builtin -mno-pic
KBUILD_AFLAGS += -mrelax -mno-pic KBUILD_AFLAGS += -mrelax -mno-pic
CFLAGS_MODULE += -mno-relax KBUILD_CFLAGS_MODULE += -mno-relax
LDFLAGS_vmlinux += --relax LDFLAGS_vmlinux += --relax
cpuflags-$(CONFIG_PLATFORM_AT32AP) += -march=ap cpuflags-$(CONFIG_PLATFORM_AT32AP) += -march=ap
......
...@@ -18,8 +18,8 @@ ifeq ($(CONFIG_ROMKERNEL),y) ...@@ -18,8 +18,8 @@ ifeq ($(CONFIG_ROMKERNEL),y)
KBUILD_CFLAGS += -mlong-calls KBUILD_CFLAGS += -mlong-calls
endif endif
KBUILD_AFLAGS += $(call cc-option,-mno-fdpic) KBUILD_AFLAGS += $(call cc-option,-mno-fdpic)
CFLAGS_MODULE += -mlong-calls KBUILD_CFLAGS_MODULE += -mlong-calls
LDFLAGS_MODULE += -m elf32bfin KBUILD_LDFLAGS_MODULE += -m elf32bfin
KALLSYMS += --symbol-prefix=_ KALLSYMS += --symbol-prefix=_
KBUILD_DEFCONFIG := BF537-STAMP_defconfig KBUILD_DEFCONFIG := BF537-STAMP_defconfig
......
...@@ -23,20 +23,14 @@ ...@@ -23,20 +23,14 @@
# Copyright (C) 1994 by Hamish Macdonald # Copyright (C) 1994 by Hamish Macdonald
# #
CCSPECS := $(shell $(CC) -v 2>&1 | grep "^Reading specs from " | head -1 | cut -c20-)
CCDIR := $(strip $(patsubst %/specs,%,$(CCSPECS)))
CPUCLASS := fr400
# test for cross compiling
COMPILE_ARCH = $(shell uname -m)
ifdef CONFIG_MMU ifdef CONFIG_MMU
UTS_SYSNAME = -DUTS_SYSNAME=\"Linux\" UTS_SYSNAME = -DUTS_SYSNAME=\"Linux\"
else else
UTS_SYSNAME = -DUTS_SYSNAME=\"uClinux\" UTS_SYSNAME = -DUTS_SYSNAME=\"uClinux\"
endif endif
ARCHMODFLAGS += -G0 -mlong-calls KBUILD_AFLAGS_MODULE += -G0 -mlong-calls
KBUILD_CFLAGS_MODULE += -G0 -mlong-calls
ifdef CONFIG_GPREL_DATA_8 ifdef CONFIG_GPREL_DATA_8
KBUILD_CFLAGS += -G8 KBUILD_CFLAGS += -G8
...@@ -54,7 +48,6 @@ endif ...@@ -54,7 +48,6 @@ endif
ifdef CONFIG_GC_SECTIONS ifdef CONFIG_GC_SECTIONS
KBUILD_CFLAGS += -ffunction-sections -fdata-sections KBUILD_CFLAGS += -ffunction-sections -fdata-sections
LINKFLAGS += --gc-sections
endif endif
ifndef CONFIG_FRAME_POINTER ifndef CONFIG_FRAME_POINTER
...@@ -64,16 +57,13 @@ endif ...@@ -64,16 +57,13 @@ endif
ifdef CONFIG_CPU_FR451_COMPILE ifdef CONFIG_CPU_FR451_COMPILE
KBUILD_CFLAGS += -mcpu=fr450 KBUILD_CFLAGS += -mcpu=fr450
KBUILD_AFLAGS += -mcpu=fr450 KBUILD_AFLAGS += -mcpu=fr450
ASFLAGS += -mcpu=fr450
else else
ifdef CONFIG_CPU_FR551_COMPILE ifdef CONFIG_CPU_FR551_COMPILE
KBUILD_CFLAGS += -mcpu=fr550 KBUILD_CFLAGS += -mcpu=fr550
KBUILD_AFLAGS += -mcpu=fr550 KBUILD_AFLAGS += -mcpu=fr550
ASFLAGS += -mcpu=fr550
else else
KBUILD_CFLAGS += -mcpu=fr400 KBUILD_CFLAGS += -mcpu=fr400
KBUILD_AFLAGS += -mcpu=fr400 KBUILD_AFLAGS += -mcpu=fr400
ASFLAGS += -mcpu=fr400
endif endif
endif endif
...@@ -83,14 +73,12 @@ endif ...@@ -83,14 +73,12 @@ endif
KBUILD_CFLAGS += -mno-fdpic -mgpr-32 -msoft-float -mno-media KBUILD_CFLAGS += -mno-fdpic -mgpr-32 -msoft-float -mno-media
KBUILD_CFLAGS += -ffixed-fcc3 -ffixed-cc3 -ffixed-gr15 -ffixed-icc2 KBUILD_CFLAGS += -ffixed-fcc3 -ffixed-cc3 -ffixed-gr15 -ffixed-icc2
KBUILD_AFLAGS += -mno-fdpic KBUILD_AFLAGS += -mno-fdpic
ASFLAGS += -mno-fdpic
# make sure the .S files get compiled with debug info # make sure the .S files get compiled with debug info
# and disable optimisations that are unhelpful whilst debugging # and disable optimisations that are unhelpful whilst debugging
ifdef CONFIG_DEBUG_INFO ifdef CONFIG_DEBUG_INFO
#KBUILD_CFLAGS += -O1 #KBUILD_CFLAGS += -O1
KBUILD_AFLAGS += -Wa,--gdwarf2 KBUILD_AFLAGS += -Wa,--gdwarf2
ASFLAGS += -Wa,--gdwarf2
endif endif
head-y := arch/frv/kernel/head.o arch/frv/kernel/init_task.o head-y := arch/frv/kernel/head.o arch/frv/kernel/init_task.o
...@@ -105,11 +93,5 @@ all: Image ...@@ -105,11 +93,5 @@ all: Image
Image: vmlinux Image: vmlinux
$(Q)$(MAKE) $(build)=arch/frv/boot $@ $(Q)$(MAKE) $(build)=arch/frv/boot $@
bootstrap:
$(Q)$(MAKEBOOT) bootstrap
archclean: archclean:
$(Q)$(MAKE) $(clean)=arch/frv/boot $(Q)$(MAKE) $(clean)=arch/frv/boot
archdep: scripts/mkdep symlinks
$(Q)$(MAKE) $(build)=arch/frv/boot dep
...@@ -22,13 +22,13 @@ CHECKFLAGS += -m64 -D__ia64=1 -D__ia64__=1 -D_LP64 -D__LP64__ ...@@ -22,13 +22,13 @@ CHECKFLAGS += -m64 -D__ia64=1 -D__ia64__=1 -D_LP64 -D__LP64__
OBJCOPYFLAGS := --strip-all OBJCOPYFLAGS := --strip-all
LDFLAGS_vmlinux := -static LDFLAGS_vmlinux := -static
LDFLAGS_MODULE += -T $(srctree)/arch/ia64/module.lds KBUILD_LDFLAGS_MODULE += -T $(srctree)/arch/ia64/module.lds
AFLAGS_KERNEL := -mconstant-gp KBUILD_AFLAGS_KERNEL := -mconstant-gp
EXTRA := EXTRA :=
cflags-y := -pipe $(EXTRA) -ffixed-r13 -mfixed-range=f12-f15,f32-f127 \ cflags-y := -pipe $(EXTRA) -ffixed-r13 -mfixed-range=f12-f15,f32-f127 \
-falign-functions=32 -frename-registers -fno-optimize-sibling-calls -falign-functions=32 -frename-registers -fno-optimize-sibling-calls
CFLAGS_KERNEL := -mconstant-gp KBUILD_CFLAGS_KERNEL := -mconstant-gp
GAS_STATUS = $(shell $(srctree)/arch/ia64/scripts/check-gas "$(CC)" "$(OBJDUMP)") GAS_STATUS = $(shell $(srctree)/arch/ia64/scripts/check-gas "$(CC)" "$(OBJDUMP)")
KBUILD_CPPFLAGS += $(shell $(srctree)/arch/ia64/scripts/toolchain-flags "$(CC)" "$(OBJDUMP)" "$(READELF)") KBUILD_CPPFLAGS += $(shell $(srctree)/arch/ia64/scripts/toolchain-flags "$(CC)" "$(OBJDUMP)" "$(READELF)")
......
...@@ -12,8 +12,8 @@ OBJCOPYFLAGS := -O binary -R .note -R .comment -S ...@@ -12,8 +12,8 @@ OBJCOPYFLAGS := -O binary -R .note -R .comment -S
LDFLAGS_vmlinux := LDFLAGS_vmlinux :=
KBUILD_CFLAGS += -pipe -fno-schedule-insns KBUILD_CFLAGS += -pipe -fno-schedule-insns
CFLAGS_KERNEL += -mmodel=medium KBUILD_CFLAGS_KERNEL += -mmodel=medium
CFLAGS_MODULE += -mmodel=large KBUILD_CFLAGS_MODULE += -mmodel=large
ifdef CONFIG_CHIP_VDEC2 ifdef CONFIG_CHIP_VDEC2
cflags-$(CONFIG_ISA_M32R2) += -DNO_FPU -Wa,-bitinst cflags-$(CONFIG_ISA_M32R2) += -DNO_FPU -Wa,-bitinst
......
...@@ -18,7 +18,7 @@ KBUILD_DEFCONFIG := multi_defconfig ...@@ -18,7 +18,7 @@ KBUILD_DEFCONFIG := multi_defconfig
# override top level makefile # override top level makefile
AS += -m68020 AS += -m68020
LDFLAGS := -m m68kelf LDFLAGS := -m m68kelf
LDFLAGS_MODULE += -T $(srctree)/arch/m68k/kernel/module.lds KBUILD_LDFLAGS_MODULE += -T $(srctree)/arch/m68k/kernel/module.lds
ifneq ($(SUBARCH),$(ARCH)) ifneq ($(SUBARCH),$(ARCH))
ifeq ($(CROSS_COMPILE),) ifeq ($(CROSS_COMPILE),)
CROSS_COMPILE := $(call cc-cross-prefix, \ CROSS_COMPILE := $(call cc-cross-prefix, \
......
...@@ -93,7 +93,8 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlinuz ...@@ -93,7 +93,8 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlinuz
cflags-y += -G 0 -mno-abicalls -fno-pic -pipe cflags-y += -G 0 -mno-abicalls -fno-pic -pipe
cflags-y += -msoft-float cflags-y += -msoft-float
LDFLAGS_vmlinux += -G 0 -static -n -nostdlib LDFLAGS_vmlinux += -G 0 -static -n -nostdlib
MODFLAGS += -mlong-calls KBUILD_AFLAGS_MODULE += -mlong-calls
KBUILD_CFLAGS_MODULE += -mlong-calls
cflags-y += -ffreestanding cflags-y += -ffreestanding
...@@ -165,7 +166,8 @@ cflags-$(CONFIG_CPU_DADDI_WORKAROUNDS) += $(call cc-option,-mno-daddi,) ...@@ -165,7 +166,8 @@ cflags-$(CONFIG_CPU_DADDI_WORKAROUNDS) += $(call cc-option,-mno-daddi,)
ifdef CONFIG_CPU_SB1 ifdef CONFIG_CPU_SB1
ifdef CONFIG_SB1_PASS_1_WORKAROUNDS ifdef CONFIG_SB1_PASS_1_WORKAROUNDS
MODFLAGS += -msb1-pass1-workarounds KBUILD_AFLAGS_MODULE += -msb1-pass1-workarounds
KBUILD_CFLAGS_MODULE += -msb1-pass1-workarounds
endif endif
endif endif
......
...@@ -94,7 +94,7 @@ else ...@@ -94,7 +94,7 @@ else
endif endif
endif endif
LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
ifeq ($(CONFIG_TUNE_CELL),y) ifeq ($(CONFIG_TUNE_CELL),y)
KBUILD_CFLAGS += $(call cc-option,-mtune=cell) KBUILD_CFLAGS += $(call cc-option,-mtune=cell)
......
...@@ -24,7 +24,8 @@ CHECKFLAGS += -D__s390__ -msize-long ...@@ -24,7 +24,8 @@ CHECKFLAGS += -D__s390__ -msize-long
else else
LD_BFD := elf64-s390 LD_BFD := elf64-s390
LDFLAGS := -m elf64_s390 LDFLAGS := -m elf64_s390
MODFLAGS += -fpic -D__PIC__ KBUILD_AFLAGS_MODULE += -fpic -D__PIC__
KBUILD_CFLAGS_MODULE += -fpic -D__PIC__
KBUILD_CFLAGS += -m64 KBUILD_CFLAGS += -m64
KBUILD_AFLAGS += -m64 KBUILD_AFLAGS += -m64
UTS_MACHINE := s390x UTS_MACHINE := s390x
......
...@@ -20,7 +20,8 @@ cflags-y += -G0 -pipe -mel -mnhwloop -D__SCOREEL__ \ ...@@ -20,7 +20,8 @@ cflags-y += -G0 -pipe -mel -mnhwloop -D__SCOREEL__ \
# #
KBUILD_AFLAGS += $(cflags-y) KBUILD_AFLAGS += $(cflags-y)
KBUILD_CFLAGS += $(cflags-y) KBUILD_CFLAGS += $(cflags-y)
MODFLAGS += -mlong-calls KBUILD_AFLAGS_MODULE += -mlong-calls
KBUILD_CFLAGS_MODULE += -mlong-calls
LDFLAGS += --oformat elf32-littlescore LDFLAGS += --oformat elf32-littlescore
LDFLAGS_vmlinux += -G0 -static -nostdlib LDFLAGS_vmlinux += -G0 -static -nostdlib
......
...@@ -628,6 +628,19 @@ config DEBUG_INFO ...@@ -628,6 +628,19 @@ config DEBUG_INFO
If unsure, say N. If unsure, say N.
config DEBUG_INFO_REDUCED
bool "Reduce debugging information"
depends on DEBUG_INFO
help
If you say Y here gcc is instructed to generate less debugging
information for structure types. This means that tools that
need full debugging information (like kgdb or systemtap) won't
be happy. But if you merely need debugging information to
resolve line numbers there is no loss. Advantage is that
build directory object sizes shrink dramatically over a full
DEBUG_INFO build and compile times are reduced too.
Only works with newer gcc versions.
config DEBUG_VM config DEBUG_VM
bool "Debug VM" bool "Debug VM"
depends on DEBUG_KERNEL depends on DEBUG_KERNEL
......
...@@ -115,7 +115,10 @@ endif ...@@ -115,7 +115,10 @@ endif
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# Default is built-in, unless we know otherwise # Default is built-in, unless we know otherwise
modkern_cflags = $(if $(part-of-module), $(CFLAGS_MODULE), $(CFLAGS_KERNEL)) modkern_cflags = \
$(if $(part-of-module), \
$(KBUILD_CFLAGS_MODULE) $(CFLAGS_MODULE), \
$(KBUILD_CFLAGS_KERNEL) $(CFLAGS_KERNEL))
quiet_modtag := $(empty) $(empty) quiet_modtag := $(empty) $(empty)
$(real-objs-m) : part-of-module := y $(real-objs-m) : part-of-module := y
...@@ -156,14 +159,14 @@ $(obj)/%.i: $(src)/%.c FORCE ...@@ -156,14 +159,14 @@ $(obj)/%.i: $(src)/%.c FORCE
cmd_gensymtypes = \ cmd_gensymtypes = \
$(CPP) -D__GENKSYMS__ $(c_flags) $< | \ $(CPP) -D__GENKSYMS__ $(c_flags) $< | \
$(GENKSYMS) -T $@ -a $(ARCH) \ $(GENKSYMS) $(if $(1), -T $(2)) -a $(ARCH) \
$(if $(KBUILD_PRESERVE),-p) \ $(if $(KBUILD_PRESERVE),-p) \
$(if $(1),-r $(firstword $(wildcard $(@:.symtypes=.symref) /dev/null))) -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@ quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
cmd_cc_symtypes_c = \ cmd_cc_symtypes_c = \
set -e; \ set -e; \
$(call cmd_gensymtypes, true) >/dev/null; \ $(call cmd_gensymtypes,true,$@) >/dev/null; \
test -s $@ || rm -f $@ test -s $@ || rm -f $@
$(obj)/%.symtypes : $(src)/%.c FORCE $(obj)/%.symtypes : $(src)/%.c FORCE
...@@ -192,16 +195,16 @@ else ...@@ -192,16 +195,16 @@ else
# the actual value of the checksum generated by genksyms # the actual value of the checksum generated by genksyms
cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $< cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<
cmd_modversions = \ cmd_modversions = \
if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \ if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \
$(call cmd_gensymtypes, $(KBUILD_SYMTYPES)) \ $(call cmd_gensymtypes,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
> $(@D)/.tmp_$(@F:.o=.ver); \ > $(@D)/.tmp_$(@F:.o=.ver); \
\ \
$(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \ $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \
-T $(@D)/.tmp_$(@F:.o=.ver); \ -T $(@D)/.tmp_$(@F:.o=.ver); \
rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver); \ rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver); \
else \ else \
mv -f $(@D)/.tmp_$(@F) $@; \ mv -f $(@D)/.tmp_$(@F) $@; \
fi; fi;
endif endif
...@@ -248,10 +251,10 @@ $(obj)/%.lst: $(src)/%.c FORCE ...@@ -248,10 +251,10 @@ $(obj)/%.lst: $(src)/%.c FORCE
# Compile assembler sources (.S) # Compile assembler sources (.S)
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
modkern_aflags := $(AFLAGS_KERNEL) modkern_aflags := $(KBUILD_AFLAGS_KERNEL) $(AFLAGS_KERNEL)
$(real-objs-m) : modkern_aflags := $(AFLAGS_MODULE) $(real-objs-m) : modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
$(real-objs-m:.o=.s): modkern_aflags := $(AFLAGS_MODULE) $(real-objs-m:.o=.s): modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
quiet_cmd_as_s_S = CPP $(quiet_modtag) $@ quiet_cmd_as_s_S = CPP $(quiet_modtag) $@
cmd_as_s_S = $(CPP) $(a_flags) -o $@ $< cmd_as_s_S = $(CPP) $(a_flags) -o $@ $<
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
# - See include/linux/module.h for more details # - See include/linux/module.h for more details
# Step 4 is solely used to allow module versioning in external modules, # Step 4 is solely used to allow module versioning in external modules,
# where the CRC of each module is retrieved from the Module.symers file. # where the CRC of each module is retrieved from the Module.symvers file.
# KBUILD_MODPOST_WARN can be set to avoid error out in case of undefined # KBUILD_MODPOST_WARN can be set to avoid error out in case of undefined
# symbols in the final module linking stage # symbols in the final module linking stage
...@@ -107,7 +107,7 @@ $(modules:.ko=.mod.c): __modpost ; ...@@ -107,7 +107,7 @@ $(modules:.ko=.mod.c): __modpost ;
modname = $(notdir $(@:.mod.o=)) modname = $(notdir $(@:.mod.o=))
quiet_cmd_cc_o_c = CC $@ quiet_cmd_cc_o_c = CC $@
cmd_cc_o_c = $(CC) $(c_flags) $(CFLAGS_MODULE) \ cmd_cc_o_c = $(CC) $(c_flags) $(KBUILD_CFLAGS_MODULE) $(CFLAGS_MODULE) \
-c -o $@ $< -c -o $@ $<
$(modules:.ko=.mod.o): %.mod.o: %.mod.c FORCE $(modules:.ko=.mod.o): %.mod.o: %.mod.c FORCE
...@@ -117,8 +117,9 @@ targets += $(modules:.ko=.mod.o) ...@@ -117,8 +117,9 @@ targets += $(modules:.ko=.mod.o)
# Step 6), final link of the modules # Step 6), final link of the modules
quiet_cmd_ld_ko_o = LD [M] $@ quiet_cmd_ld_ko_o = LD [M] $@
cmd_ld_ko_o = $(LD) -r $(LDFLAGS) $(LDFLAGS_MODULE) -o $@ \ cmd_ld_ko_o = $(LD) -r $(LDFLAGS) \
$(filter-out FORCE,$^) $(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE) \
-o $@ $(filter-out FORCE,$^)
$(modules): %.ko :%.o %.mod.o FORCE $(modules): %.ko :%.o %.mod.o FORCE
$(call if_changed,ld_ko_o) $(call if_changed,ld_ko_o)
......
...@@ -884,16 +884,16 @@ void handle_moddevtable(struct module *mod, struct elf_info *info, ...@@ -884,16 +884,16 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
char *zeros = NULL; char *zeros = NULL;
/* We're looking for a section relative symbol */ /* We're looking for a section relative symbol */
if (!sym->st_shndx || sym->st_shndx >= info->hdr->e_shnum) if (!sym->st_shndx || get_secindex(info, sym) >= info->num_sections)
return; return;
/* Handle all-NULL symbols allocated into .bss */ /* Handle all-NULL symbols allocated into .bss */
if (info->sechdrs[sym->st_shndx].sh_type & SHT_NOBITS) { if (info->sechdrs[get_secindex(info, sym)].sh_type & SHT_NOBITS) {
zeros = calloc(1, sym->st_size); zeros = calloc(1, sym->st_size);
symval = zeros; symval = zeros;
} else { } else {
symval = (void *)info->hdr symval = (void *)info->hdr
+ info->sechdrs[sym->st_shndx].sh_offset + info->sechdrs[get_secindex(info, sym)].sh_offset
+ sym->st_value; + sym->st_value;
} }
......
...@@ -253,7 +253,7 @@ static enum export export_no(const char *s) ...@@ -253,7 +253,7 @@ static enum export export_no(const char *s)
return export_unknown; return export_unknown;
} }
static enum export export_from_sec(struct elf_info *elf, Elf_Section sec) static enum export export_from_sec(struct elf_info *elf, unsigned int sec)
{ {
if (sec == elf->export_sec) if (sec == elf->export_sec)
return export_plain; return export_plain;
...@@ -373,6 +373,8 @@ static int parse_elf(struct elf_info *info, const char *filename) ...@@ -373,6 +373,8 @@ static int parse_elf(struct elf_info *info, const char *filename)
Elf_Ehdr *hdr; Elf_Ehdr *hdr;
Elf_Shdr *sechdrs; Elf_Shdr *sechdrs;
Elf_Sym *sym; Elf_Sym *sym;
const char *secstrings;
unsigned int symtab_idx = ~0U, symtab_shndx_idx = ~0U;
hdr = grab_file(filename, &info->size); hdr = grab_file(filename, &info->size);
if (!hdr) { if (!hdr) {
...@@ -417,8 +419,27 @@ static int parse_elf(struct elf_info *info, const char *filename) ...@@ -417,8 +419,27 @@ static int parse_elf(struct elf_info *info, const char *filename)
return 0; return 0;
} }
if (hdr->e_shnum == 0) {
/*
* There are more than 64k sections,
* read count from .sh_size.
* note: it doesn't need shndx2secindex()
*/
info->num_sections = TO_NATIVE(sechdrs[0].sh_size);
}
else {
info->num_sections = hdr->e_shnum;
}
if (hdr->e_shstrndx == SHN_XINDEX) {
info->secindex_strings =
shndx2secindex(TO_NATIVE(sechdrs[0].sh_link));
}
else {
info->secindex_strings = hdr->e_shstrndx;
}
/* Fix endianness in section headers */ /* Fix endianness in section headers */
for (i = 0; i < hdr->e_shnum; i++) { for (i = 0; i < info->num_sections; i++) {
sechdrs[i].sh_name = TO_NATIVE(sechdrs[i].sh_name); sechdrs[i].sh_name = TO_NATIVE(sechdrs[i].sh_name);
sechdrs[i].sh_type = TO_NATIVE(sechdrs[i].sh_type); sechdrs[i].sh_type = TO_NATIVE(sechdrs[i].sh_type);
sechdrs[i].sh_flags = TO_NATIVE(sechdrs[i].sh_flags); sechdrs[i].sh_flags = TO_NATIVE(sechdrs[i].sh_flags);
...@@ -431,9 +452,8 @@ static int parse_elf(struct elf_info *info, const char *filename) ...@@ -431,9 +452,8 @@ static int parse_elf(struct elf_info *info, const char *filename)
sechdrs[i].sh_entsize = TO_NATIVE(sechdrs[i].sh_entsize); sechdrs[i].sh_entsize = TO_NATIVE(sechdrs[i].sh_entsize);
} }
/* Find symbol table. */ /* Find symbol table. */
for (i = 1; i < hdr->e_shnum; i++) { secstrings = (void *)hdr + sechdrs[info->secindex_strings].sh_offset;
const char *secstrings for (i = 1; i < info->num_sections; i++) {
= (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;
const char *secname; const char *secname;
int nobits = sechdrs[i].sh_type == SHT_NOBITS; int nobits = sechdrs[i].sh_type == SHT_NOBITS;
...@@ -461,14 +481,26 @@ static int parse_elf(struct elf_info *info, const char *filename) ...@@ -461,14 +481,26 @@ static int parse_elf(struct elf_info *info, const char *filename)
else if (strcmp(secname, "__ksymtab_gpl_future") == 0) else if (strcmp(secname, "__ksymtab_gpl_future") == 0)
info->export_gpl_future_sec = i; info->export_gpl_future_sec = i;
if (sechdrs[i].sh_type != SHT_SYMTAB) if (sechdrs[i].sh_type == SHT_SYMTAB) {
continue; unsigned int sh_link_idx;
symtab_idx = i;
info->symtab_start = (void *)hdr +
sechdrs[i].sh_offset;
info->symtab_stop = (void *)hdr +
sechdrs[i].sh_offset + sechdrs[i].sh_size;
sh_link_idx = shndx2secindex(sechdrs[i].sh_link);
info->strtab = (void *)hdr +
sechdrs[sh_link_idx].sh_offset;
}
info->symtab_start = (void *)hdr + sechdrs[i].sh_offset; /* 32bit section no. table? ("more than 64k sections") */
info->symtab_stop = (void *)hdr + sechdrs[i].sh_offset if (sechdrs[i].sh_type == SHT_SYMTAB_SHNDX) {
+ sechdrs[i].sh_size; symtab_shndx_idx = i;
info->strtab = (void *)hdr + info->symtab_shndx_start = (void *)hdr +
sechdrs[sechdrs[i].sh_link].sh_offset; sechdrs[i].sh_offset;
info->symtab_shndx_stop = (void *)hdr +
sechdrs[i].sh_offset + sechdrs[i].sh_size;
}
} }
if (!info->symtab_start) if (!info->symtab_start)
fatal("%s has no symtab?\n", filename); fatal("%s has no symtab?\n", filename);
...@@ -480,6 +512,21 @@ static int parse_elf(struct elf_info *info, const char *filename) ...@@ -480,6 +512,21 @@ static int parse_elf(struct elf_info *info, const char *filename)
sym->st_value = TO_NATIVE(sym->st_value); sym->st_value = TO_NATIVE(sym->st_value);
sym->st_size = TO_NATIVE(sym->st_size); sym->st_size = TO_NATIVE(sym->st_size);
} }
if (symtab_shndx_idx != ~0U) {
Elf32_Word *p;
if (symtab_idx !=
shndx2secindex(sechdrs[symtab_shndx_idx].sh_link))
fatal("%s: SYMTAB_SHNDX has bad sh_link: %u!=%u\n",
filename,
shndx2secindex(sechdrs[symtab_shndx_idx].sh_link),
symtab_idx);
/* Fix endianness */
for (p = info->symtab_shndx_start; p < info->symtab_shndx_stop;
p++)
*p = TO_NATIVE(*p);
}
return 1; return 1;
} }
...@@ -519,7 +566,7 @@ static void handle_modversions(struct module *mod, struct elf_info *info, ...@@ -519,7 +566,7 @@ static void handle_modversions(struct module *mod, struct elf_info *info,
Elf_Sym *sym, const char *symname) Elf_Sym *sym, const char *symname)
{ {
unsigned int crc; unsigned int crc;
enum export export = export_from_sec(info, sym->st_shndx); enum export export = export_from_sec(info, get_secindex(info, sym));
switch (sym->st_shndx) { switch (sym->st_shndx) {
case SHN_COMMON: case SHN_COMMON:
...@@ -661,19 +708,19 @@ static const char *sym_name(struct elf_info *elf, Elf_Sym *sym) ...@@ -661,19 +708,19 @@ static const char *sym_name(struct elf_info *elf, Elf_Sym *sym)
return "(unknown)"; return "(unknown)";
} }
static const char *sec_name(struct elf_info *elf, int shndx) static const char *sec_name(struct elf_info *elf, int secindex)
{ {
Elf_Shdr *sechdrs = elf->sechdrs; Elf_Shdr *sechdrs = elf->sechdrs;
return (void *)elf->hdr + return (void *)elf->hdr +
elf->sechdrs[elf->hdr->e_shstrndx].sh_offset + elf->sechdrs[elf->secindex_strings].sh_offset +
sechdrs[shndx].sh_name; sechdrs[secindex].sh_name;
} }
static const char *sech_name(struct elf_info *elf, Elf_Shdr *sechdr) static const char *sech_name(struct elf_info *elf, Elf_Shdr *sechdr)
{ {
return (void *)elf->hdr + return (void *)elf->hdr +
elf->sechdrs[elf->hdr->e_shstrndx].sh_offset + elf->sechdrs[elf->secindex_strings].sh_offset +
sechdr->sh_name; sechdr->sh_name;
} }
/* if sym is empty or point to a string /* if sym is empty or point to a string
...@@ -1052,11 +1099,14 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr, ...@@ -1052,11 +1099,14 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
Elf_Sym *near = NULL; Elf_Sym *near = NULL;
Elf64_Sword distance = 20; Elf64_Sword distance = 20;
Elf64_Sword d; Elf64_Sword d;
unsigned int relsym_secindex;
if (relsym->st_name != 0) if (relsym->st_name != 0)
return relsym; return relsym;
relsym_secindex = get_secindex(elf, relsym);
for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) { for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
if (sym->st_shndx != relsym->st_shndx) if (get_secindex(elf, sym) != relsym_secindex)
continue; continue;
if (ELF_ST_TYPE(sym->st_info) == STT_SECTION) if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
continue; continue;
...@@ -1118,9 +1168,9 @@ static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr, ...@@ -1118,9 +1168,9 @@ static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr,
for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) { for (sym = elf->symtab_start; sym < elf->symtab_stop; sym++) {
const char *symsec; const char *symsec;
if (sym->st_shndx >= SHN_LORESERVE) if (is_shndx_special(sym->st_shndx))
continue; continue;
symsec = sec_name(elf, sym->st_shndx); symsec = sec_name(elf, get_secindex(elf, sym));
if (strcmp(symsec, sec) != 0) if (strcmp(symsec, sec) != 0)
continue; continue;
if (!is_valid_name(elf, sym)) if (!is_valid_name(elf, sym))
...@@ -1316,7 +1366,7 @@ static void check_section_mismatch(const char *modname, struct elf_info *elf, ...@@ -1316,7 +1366,7 @@ static void check_section_mismatch(const char *modname, struct elf_info *elf,
const char *tosec; const char *tosec;
const struct sectioncheck *mismatch; const struct sectioncheck *mismatch;
tosec = sec_name(elf, sym->st_shndx); tosec = sec_name(elf, get_secindex(elf, sym));
mismatch = section_mismatch(fromsec, tosec); mismatch = section_mismatch(fromsec, tosec);
if (mismatch) { if (mismatch) {
Elf_Sym *to; Elf_Sym *to;
...@@ -1344,7 +1394,7 @@ static unsigned int *reloc_location(struct elf_info *elf, ...@@ -1344,7 +1394,7 @@ static unsigned int *reloc_location(struct elf_info *elf,
Elf_Shdr *sechdr, Elf_Rela *r) Elf_Shdr *sechdr, Elf_Rela *r)
{ {
Elf_Shdr *sechdrs = elf->sechdrs; Elf_Shdr *sechdrs = elf->sechdrs;
int section = sechdr->sh_info; int section = shndx2secindex(sechdr->sh_info);
return (void *)elf->hdr + sechdrs[section].sh_offset + return (void *)elf->hdr + sechdrs[section].sh_offset +
r->r_offset - sechdrs[section].sh_addr; r->r_offset - sechdrs[section].sh_addr;
...@@ -1452,7 +1502,7 @@ static void section_rela(const char *modname, struct elf_info *elf, ...@@ -1452,7 +1502,7 @@ static void section_rela(const char *modname, struct elf_info *elf,
r.r_addend = TO_NATIVE(rela->r_addend); r.r_addend = TO_NATIVE(rela->r_addend);
sym = elf->symtab_start + r_sym; sym = elf->symtab_start + r_sym;
/* Skip special sections */ /* Skip special sections */
if (sym->st_shndx >= SHN_LORESERVE) if (is_shndx_special(sym->st_shndx))
continue; continue;
check_section_mismatch(modname, elf, &r, sym, fromsec); check_section_mismatch(modname, elf, &r, sym, fromsec);
} }
...@@ -1510,7 +1560,7 @@ static void section_rel(const char *modname, struct elf_info *elf, ...@@ -1510,7 +1560,7 @@ static void section_rel(const char *modname, struct elf_info *elf,
} }
sym = elf->symtab_start + r_sym; sym = elf->symtab_start + r_sym;
/* Skip special sections */ /* Skip special sections */
if (sym->st_shndx >= SHN_LORESERVE) if (is_shndx_special(sym->st_shndx))
continue; continue;
check_section_mismatch(modname, elf, &r, sym, fromsec); check_section_mismatch(modname, elf, &r, sym, fromsec);
} }
...@@ -1535,7 +1585,7 @@ static void check_sec_ref(struct module *mod, const char *modname, ...@@ -1535,7 +1585,7 @@ static void check_sec_ref(struct module *mod, const char *modname,
Elf_Shdr *sechdrs = elf->sechdrs; Elf_Shdr *sechdrs = elf->sechdrs;
/* Walk through all sections */ /* Walk through all sections */
for (i = 0; i < elf->hdr->e_shnum; i++) { for (i = 0; i < elf->num_sections; i++) {
check_section(modname, elf, &elf->sechdrs[i]); check_section(modname, elf, &elf->sechdrs[i]);
/* We want to process only relocation sections and not .init */ /* We want to process only relocation sections and not .init */
if (sechdrs[i].sh_type == SHT_RELA) if (sechdrs[i].sh_type == SHT_RELA)
......
...@@ -129,8 +129,51 @@ struct elf_info { ...@@ -129,8 +129,51 @@ struct elf_info {
const char *strtab; const char *strtab;
char *modinfo; char *modinfo;
unsigned int modinfo_len; unsigned int modinfo_len;
/* support for 32bit section numbers */
unsigned int num_sections; /* max_secindex + 1 */
unsigned int secindex_strings;
/* if Nth symbol table entry has .st_shndx = SHN_XINDEX,
* take shndx from symtab_shndx_start[N] instead */
Elf32_Word *symtab_shndx_start;
Elf32_Word *symtab_shndx_stop;
}; };
static inline int is_shndx_special(unsigned int i)
{
return i != SHN_XINDEX && i >= SHN_LORESERVE && i <= SHN_HIRESERVE;
}
/* shndx is in [0..SHN_LORESERVE) U (SHN_HIRESERVE, 0xfffffff], thus:
* shndx == 0 <=> sechdrs[0]
* ......
* shndx == SHN_LORESERVE-1 <=> sechdrs[SHN_LORESERVE-1]
* shndx == SHN_HIRESERVE+1 <=> sechdrs[SHN_LORESERVE]
* shndx == SHN_HIRESERVE+2 <=> sechdrs[SHN_LORESERVE+1]
* ......
* fyi: sym->st_shndx is uint16, SHN_LORESERVE = ff00, SHN_HIRESERVE = ffff,
* so basically we map 0000..feff -> 0000..feff
* ff00..ffff -> (you are a bad boy, dont do it)
* 10000..xxxx -> ff00..(xxxx-0x100)
*/
static inline unsigned int shndx2secindex(unsigned int i)
{
if (i <= SHN_HIRESERVE)
return i;
return i - (SHN_HIRESERVE + 1 - SHN_LORESERVE);
}
/* Accessor for sym->st_shndx, hides ugliness of "64k sections" */
static inline unsigned int get_secindex(const struct elf_info *info,
const Elf_Sym *sym)
{
if (sym->st_shndx != SHN_XINDEX)
return sym->st_shndx;
return shndx2secindex(info->symtab_shndx_start[sym -
info->symtab_start]);
}
/* file2alias.c */ /* file2alias.c */
extern unsigned int cross_build; extern unsigned int cross_build;
void handle_moddevtable(struct module *mod, struct elf_info *info, void handle_moddevtable(struct module *mod, struct elf_info *info,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册