提交 2034563c 编写于 作者: L Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild-fixes

* git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild-fixes:
  kbuild: fix kbuild.txt typos
  kbuild: print usage with no arguments in scripts/config
  Revert "kbuild: strip generated symbols from *.ko"
......@@ -3,7 +3,7 @@ Environment variables
KCPPFLAGS
--------------------------------------------------
Additional options to pass when preprocessing. The preprocessing options
will be used in all cases where kbuild do preprocessing including
will be used in all cases where kbuild does preprocessing including
building C files and assembler files.
KAFLAGS
......@@ -16,7 +16,7 @@ Additional options to the C compiler.
KBUILD_VERBOSE
--------------------------------------------------
Set the kbuild verbosity. Can be assinged same values as "V=...".
Set the kbuild verbosity. Can be assigned same values as "V=...".
See make help for the full list.
Setting "V=..." takes precedence over KBUILD_VERBOSE.
......@@ -35,14 +35,14 @@ KBUILD_OUTPUT
--------------------------------------------------
Specify the output directory when building the kernel.
The output directory can also be specificed using "O=...".
Setting "O=..." takes precedence over KBUILD_OUTPUT
Setting "O=..." takes precedence over KBUILD_OUTPUT.
ARCH
--------------------------------------------------
Set ARCH to the architecture to be built.
In most cases the name of the architecture is the same as the
directory name found in the arch/ directory.
But some architectures suach as x86 and sparc has aliases.
But some architectures such as x86 and sparc have aliases.
x86: i386 for 32 bit, x86_64 for 64 bit
sparc: sparc for 32 bit, sparc64 for 64 bit
......@@ -63,7 +63,7 @@ CF is often used on the command-line like this:
INSTALL_PATH
--------------------------------------------------
INSTALL_PATH specifies where to place the updated kernel and system map
images. Default is /boot, but you can set it to other values
images. Default is /boot, but you can set it to other values.
MODLIB
......@@ -90,7 +90,7 @@ INSTALL_MOD_STRIP will used as the options to the strip command.
INSTALL_FW_PATH
--------------------------------------------------
INSTALL_FW_PATH specify where to install the firmware blobs.
INSTALL_FW_PATH specifies where to install the firmware blobs.
The default value is:
$(INSTALL_MOD_PATH)/lib/firmware
......@@ -99,7 +99,7 @@ The value can be overridden in which case the default value is ignored.
INSTALL_HDR_PATH
--------------------------------------------------
INSTALL_HDR_PATH specify where to install user space headers when
INSTALL_HDR_PATH specifies where to install user space headers when
executing "make headers_*".
The default value is:
......@@ -112,22 +112,23 @@ The value can be overridden in which case the default value is ignored.
KBUILD_MODPOST_WARN
--------------------------------------------------
KBUILD_MODPOST_WARN can be set to avoid error out in case of undefined
symbols in the final module linking stage.
KBUILD_MODPOST_WARN can be set to avoid errors in case of undefined
symbols in the final module linking stage. It changes such errors
into warnings.
KBUILD_MODPOST_FINAL
KBUILD_MODPOST_NOFINAL
--------------------------------------------------
KBUILD_MODPOST_NOFINAL can be set to skip the final link of modules.
This is solely usefull to speed up test compiles.
This is solely useful to speed up test compiles.
KBUILD_EXTRA_SYMBOLS
--------------------------------------------------
For modules use symbols from another modules.
For modules that use symbols from other modules.
See more details in modules.txt.
ALLSOURCE_ARCHS
--------------------------------------------------
For tags/TAGS/cscope targets, you can specify more than one archs
to be included in the databases, separated by blankspace. e.g.
For tags/TAGS/cscope targets, you can specify more than one arch
to be included in the databases, separated by blank space. E.g.:
$ make ALLSOURCE_ARCHS="x86 mips arm" tags
......@@ -610,25 +610,20 @@ export INSTALL_PATH ?= /boot
MODLIB = $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
export MODLIB
strip-symbols := $(srctree)/scripts/strip-symbols \
$(wildcard $(srctree)/arch/$(ARCH)/scripts/strip-symbols)
#
# INSTALL_MOD_STRIP, if defined, will cause modules to be stripped while
# they get installed. If INSTALL_MOD_STRIP is '1', then the default
# options (see below) will be used. Otherwise, INSTALL_MOD_STRIP will
# be used as the option(s) to the objcopy command.
# INSTALL_MOD_STRIP, if defined, will cause modules to be
# stripped after they are installed. If INSTALL_MOD_STRIP is '1', then
# the default option --strip-debug will be used. Otherwise,
# INSTALL_MOD_STRIP will used as the options to the strip command.
ifdef INSTALL_MOD_STRIP
ifeq ($(INSTALL_MOD_STRIP),1)
mod_strip_cmd = $(OBJCOPY) --strip-debug
ifeq ($(CONFIG_KALLSYMS_ALL),$(CONFIG_KALLSYMS_STRIP_GENERATED))
mod_strip_cmd += --wildcard $(addprefix --strip-symbols ,$(strip-symbols))
endif
mod_strip_cmd = $(STRIP) --strip-debug
else
mod_strip_cmd = $(OBJCOPY) $(INSTALL_MOD_STRIP)
mod_strip_cmd = $(STRIP) $(INSTALL_MOD_STRIP)
endif # INSTALL_MOD_STRIP=1
else
mod_strip_cmd = false
mod_strip_cmd = true
endif # INSTALL_MOD_STRIP
export mod_strip_cmd
......@@ -758,7 +753,6 @@ last_kallsyms := 2
endif
kallsyms.o := .tmp_kallsyms$(last_kallsyms).o
kallsyms.h := $(wildcard include/config/kallsyms/*.h) $(wildcard include/config/kallsyms/*/*.h)
define verify_kallsyms
$(Q)$(if $($(quiet)cmd_sysmap), \
......@@ -783,41 +777,24 @@ endef
# Generate .S file with all kernel symbols
quiet_cmd_kallsyms = KSYM $@
cmd_kallsyms = { test $* -eq 0 || $(NM) -n $<; } \
| $(KALLSYMS) $(if $(CONFIG_KALLSYMS_ALL),--all-symbols) >$@
quiet_cmd_kstrip = STRIP $@
cmd_kstrip = $(OBJCOPY) --wildcard $(addprefix --strip$(if $(CONFIG_RELOCATABLE),-unneeded)-symbols ,$(filter %/scripts/strip-symbols,$^)) $< $@
cmd_kallsyms = $(NM) -n $< | $(KALLSYMS) \
$(if $(CONFIG_KALLSYMS_ALL),--all-symbols) > $@
$(foreach n,0 1 2 3,.tmp_kallsyms$(n).o): KBUILD_AFLAGS += -Wa,--strip-local-absolute
$(foreach n,0 1 2 3,.tmp_kallsyms$(n).o): %.o: %.S scripts FORCE
.tmp_kallsyms1.o .tmp_kallsyms2.o .tmp_kallsyms3.o: %.o: %.S scripts FORCE
$(call if_changed_dep,as_o_S)
ifeq ($(CONFIG_KALLSYMS_STRIP_GENERATED),y)
strip-ext := .stripped
endif
.tmp_kallsyms%.S: .tmp_vmlinux%$(strip-ext) $(KALLSYMS) $(kallsyms.h)
.tmp_kallsyms%.S: .tmp_vmlinux% $(KALLSYMS)
$(call cmd,kallsyms)
# make -jN seems to have problems with intermediate files, see bug #3330.
.SECONDARY: $(foreach n,1 2 3,.tmp_vmlinux$(n).stripped)
.tmp_vmlinux%.stripped: .tmp_vmlinux% $(strip-symbols) $(kallsyms.h)
$(call cmd,kstrip)
ifneq ($(CONFIG_DEBUG_INFO),y)
.tmp_vmlinux%: LDFLAGS_vmlinux += -S
endif
# .tmp_vmlinux1 must be complete except kallsyms, so update vmlinux version
.tmp_vmlinux%: $(vmlinux-lds) $(vmlinux-all) FORCE
$(if $(filter 1,$*),$(call if_changed_rule,ksym_ld),$(call if_changed,vmlinux__))
.tmp_vmlinux1: $(vmlinux-lds) $(vmlinux-all) FORCE
$(call if_changed_rule,ksym_ld)
.tmp_vmlinux0$(strip-ext):
$(Q)echo "placeholder" >$@
.tmp_vmlinux2: $(vmlinux-lds) $(vmlinux-all) .tmp_kallsyms1.o FORCE
$(call if_changed,vmlinux__)
.tmp_vmlinux1: .tmp_kallsyms0.o
.tmp_vmlinux2: .tmp_kallsyms1.o
.tmp_vmlinux3: .tmp_kallsyms2.o
.tmp_vmlinux3: $(vmlinux-lds) $(vmlinux-all) .tmp_kallsyms2.o FORCE
$(call if_changed,vmlinux__)
# Needs to visit scripts/ before $(KALLSYMS) can be used.
$(KALLSYMS): scripts ;
......
......@@ -725,13 +725,6 @@ config KALLSYMS_ALL
Say N.
config KALLSYMS_STRIP_GENERATED
bool "Strip machine generated symbols from kallsyms"
depends on KALLSYMS_ALL
default y
help
Say N if you want kallsyms to retain even machine generated symbols.
config KALLSYMS_EXTRA_PASS
bool "Do an extra kallsyms pass"
depends on KALLSYMS
......
......@@ -30,19 +30,20 @@
#define all_var 0
#endif
extern const unsigned long kallsyms_addresses[];
extern const u8 kallsyms_names[];
/* These will be re-linked against their real values during the second link stage */
extern const unsigned long kallsyms_addresses[] __attribute__((weak));
extern const u8 kallsyms_names[] __attribute__((weak));
/* tell the compiler that the count isn't in the small data section if the arch
* has one (eg: FRV)
*/
extern const unsigned long kallsyms_num_syms
__attribute__((__section__(".rodata")));
__attribute__((weak, section(".rodata")));
extern const u8 kallsyms_token_table[];
extern const u16 kallsyms_token_index[];
extern const u8 kallsyms_token_table[] __attribute__((weak));
extern const u16 kallsyms_token_index[] __attribute__((weak));
extern const unsigned long kallsyms_markers[];
extern const unsigned long kallsyms_markers[] __attribute__((weak));
static inline int is_kernel_inittext(unsigned long addr)
{
......@@ -167,6 +168,9 @@ static unsigned long get_symbol_pos(unsigned long addr,
unsigned long symbol_start = 0, symbol_end = 0;
unsigned long i, low, high, mid;
/* This kernel should never had been booted. */
BUG_ON(!kallsyms_addresses);
/* do a binary search on the sorted kallsyms_addresses array */
low = 0;
high = kallsyms_num_syms;
......
......@@ -151,16 +151,16 @@ cmd_cc_i_c = $(CPP) $(c_flags) -o $@ $<
$(obj)/%.i: $(src)/%.c FORCE
$(call if_changed_dep,cc_i_c)
cmd_genksyms = \
cmd_gensymtypes = \
$(CPP) -D__GENKSYMS__ $(c_flags) $< | \
$(GENKSYMS) -T $@ -A -a $(ARCH) \
$(GENKSYMS) -T $@ -a $(ARCH) \
$(if $(KBUILD_PRESERVE),-p) \
$(if $(1),-r $(firstword $(wildcard $(@:.symtypes=.symref) /dev/null)))
quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
cmd_cc_symtypes_c = \
set -e; \
$(call cmd_genksyms, true) >/dev/null; \
$(call cmd_gensymtypes, true) >/dev/null; \
test -s $@ || rm -f $@
$(obj)/%.symtypes : $(src)/%.c FORCE
......@@ -177,38 +177,28 @@ cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
else
# When module versioning is enabled the following steps are executed:
# o compile a .tmp_<file>.s from <file>.c
# o if .tmp_<file>.s doesn't contain a __ksymtab version, i.e. does
# not export symbols, we just assemble .tmp_<file>.s to <file>.o and
# o compile a .tmp_<file>.o from <file>.c
# o if .tmp_<file>.o doesn't contain a __ksymtab version, i.e. does
# not export symbols, we just rename .tmp_<file>.o to <file>.o and
# are 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 assembly source
# o assemble <file>.o from .tmp_<file>.s forcing inclusion of directives
# defining the actual values of __crc_*, followed by objcopy-ing them
# to force these symbols to be local to permit stripping them later.
s_file = $(@D)/.tmp_$(@F:.o=.s)
v_file = $(@D)/.tmp_$(@F:.o=.v)
tmp_o_file = $(@D)/.tmp_$(@F)
no_g_c_flags = $(filter-out -g%,$(c_flags))
cmd_cc_o_c = $(CC) $(c_flags) -S -o $(s_file) $<
# that they are usable as a linker script
# o generate <file>.o from .tmp_<file>.o using the linker to
# replace the unresolved symbols __crc_exported_symbol with
# the actual value of the checksum generated by genksyms
cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<
cmd_modversions = \
if grep -q __ksymtab $(s_file); then \
if $(call cmd_genksyms, $(KBUILD_SYMTYPES)) > $(v_file) \
&& $(CC) $(no_g_c_flags) -c -Wa,$(v_file) \
-o $(tmp_o_file) $(s_file) \
&& $(OBJCOPY) -L '__crc_*' -L '___crc_*' -w \
$(tmp_o_file) $@; \
then \
: ; \
else \
rm -f $@; exit 1; \
fi; \
if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \
$(call cmd_gensymtypes, $(KBUILD_SYMTYPES)) \
> $(@D)/.tmp_$(@F:.o=.ver); \
\
$(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \
-T $(@D)/.tmp_$(@F:.o=.ver); \
rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver); \
else \
rm -f $(v_file); \
$(CC) $(no_g_c_flags) -c -o $@ $(s_file); \
mv -f $(@D)/.tmp_$(@F) $@; \
fi;
endif
......@@ -225,12 +215,7 @@ define rule_cc_o_c
$(cmd_record_mcount) \
scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' > \
$(dot-target).tmp; \
if [ -r $(@D)/.tmp_$(@F:.o=.v) ]; then \
echo >> $(dot-target).tmp; \
echo '$@: $(GENKSYMS)' >> $(dot-target).tmp; \
echo '$(GENKSYMS):: ;' >> $(dot-target).tmp; \
fi; \
rm -f $(depfile) $(@D)/.tmp_$(@F:.o=.?); \
rm -f $(depfile); \
mv -f $(dot-target).tmp $(dot-target).cmd
endef
......
......@@ -17,8 +17,7 @@ __modinst: $(modules)
@:
quiet_cmd_modules_install = INSTALL $@
cmd_modules_install = mkdir -p $(2); \
$(mod_strip_cmd) $@ $(2)/$(notdir $@) || cp $@ $(2)
cmd_modules_install = mkdir -p $(2); cp $@ $(2) ; $(mod_strip_cmd) $(2)/$(notdir $@)
# Modules built outside the kernel source tree go into extra by default
INSTALL_MOD_DIR ?= extra
......
......@@ -60,6 +60,10 @@ else
FN=.config
fi
if [ "$1" = "" ] ; then
usage
fi
while [ "$1" != "" ] ; do
CMD="$1"
shift
......
......@@ -43,7 +43,7 @@ int cur_line = 1;
char *cur_filename;
static int flag_debug, flag_dump_defs, flag_reference, flag_dump_types,
flag_preserve, flag_warnings, flag_asm;
flag_preserve, flag_warnings;
static const char *arch = "";
static const char *mod_prefix = "";
......@@ -610,11 +610,8 @@ void export_symbol(const char *name)
if (flag_dump_defs)
fputs(">\n", debugfile);
/* Used as assembly source or a linker script. */
printf(flag_asm
? ".equiv %s__crc_%s, %#08lx\n"
: "%s__crc_%s = %#08lx ;\n",
mod_prefix, name, crc);
/* Used as a linker script. */
printf("%s__crc_%s = 0x%08lx ;\n", mod_prefix, name, crc);
}
}
......@@ -651,10 +648,9 @@ void error_with_pos(const char *fmt, ...)
static void genksyms_usage(void)
{
fputs("Usage:\n" "genksyms [-aAdDTwqhV] > /path/to/.tmp_obj.ver\n" "\n"
fputs("Usage:\n" "genksyms [-adDTwqhV] > /path/to/.tmp_obj.ver\n" "\n"
#ifdef __GNU_LIBRARY__
" -a, --arch Select architecture\n"
" -A, --asm Generate assembly rather than linker script\n"
" -d, --debug Increment the debug level (repeatable)\n"
" -D, --dump Dump expanded symbol defs (for debugging only)\n"
" -r, --reference file Read reference symbols from a file\n"
......@@ -666,7 +662,6 @@ static void genksyms_usage(void)
" -V, --version Print the release version\n"
#else /* __GNU_LIBRARY__ */
" -a Select architecture\n"
" -A Generate assembly rather than linker script\n"
" -d Increment the debug level (repeatable)\n"
" -D Dump expanded symbol defs (for debugging only)\n"
" -r file Read reference symbols from a file\n"
......@@ -688,7 +683,6 @@ int main(int argc, char **argv)
#ifdef __GNU_LIBRARY__
struct option long_opts[] = {
{"arch", 1, 0, 'a'},
{"asm", 0, 0, 'A'},
{"debug", 0, 0, 'd'},
{"warnings", 0, 0, 'w'},
{"quiet", 0, 0, 'q'},
......@@ -701,10 +695,10 @@ int main(int argc, char **argv)
{0, 0, 0, 0}
};
while ((o = getopt_long(argc, argv, "a:dwqVADr:T:ph",
while ((o = getopt_long(argc, argv, "a:dwqVDr:T:ph",
&long_opts[0], NULL)) != EOF)
#else /* __GNU_LIBRARY__ */
while ((o = getopt(argc, argv, "a:dwqVADr:T:ph")) != EOF)
while ((o = getopt(argc, argv, "a:dwqVDr:T:ph")) != EOF)
#endif /* __GNU_LIBRARY__ */
switch (o) {
case 'a':
......@@ -722,9 +716,6 @@ int main(int argc, char **argv)
case 'V':
fputs("genksyms version 2.5.60\n", stderr);
break;
case 'A':
flag_asm = 1;
break;
case 'D':
flag_dump_defs = 1;
break;
......
/* ANSI-C code produced by gperf version 3.0.1 */
/* ANSI-C code produced by gperf version 3.0.2 */
/* Command-line: gperf -L ANSI-C -a -C -E -g -H is_reserved_hash -k '1,3,$' -N is_reserved_word -p -t scripts/genksyms/keywords.gperf */
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
......@@ -32,7 +32,7 @@
#line 3 "scripts/genksyms/keywords.gperf"
struct resword { const char *name; int token; };
/* maximum key range = 64, duplicates = 0 */
/* maximum key range = 62, duplicates = 0 */
#ifdef __GNUC__
__inline
......@@ -46,32 +46,32 @@ is_reserved_hash (register const char *str, register unsigned int len)
{
static const unsigned char asso_values[] =
{
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 0,
67, 67, 67, 67, 67, 67, 15, 67, 67, 67,
0, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 0, 67, 0, 67, 5,
25, 20, 15, 30, 67, 15, 67, 67, 10, 0,
10, 40, 20, 67, 10, 5, 0, 10, 15, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67, 67, 67, 67, 67,
67, 67, 67, 67, 67, 67
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 5,
65, 65, 65, 65, 65, 65, 35, 65, 65, 65,
0, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 0, 65, 0, 65, 5,
20, 15, 10, 30, 65, 15, 65, 65, 20, 0,
10, 35, 20, 65, 10, 5, 0, 10, 5, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65
};
return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]] + asso_values[(unsigned char)str[len - 1]];
}
......@@ -84,119 +84,116 @@ is_reserved_word (register const char *str, register unsigned int len)
{
enum
{
TOTAL_KEYWORDS = 45,
TOTAL_KEYWORDS = 43,
MIN_WORD_LENGTH = 3,
MAX_WORD_LENGTH = 24,
MIN_HASH_VALUE = 3,
MAX_HASH_VALUE = 66
MAX_HASH_VALUE = 64
};
static const struct resword wordlist[] =
{
{""}, {""}, {""},
#line 28 "scripts/genksyms/keywords.gperf"
#line 26 "scripts/genksyms/keywords.gperf"
{"asm", ASM_KEYW},
{""},
#line 10 "scripts/genksyms/keywords.gperf"
#line 8 "scripts/genksyms/keywords.gperf"
{"__asm", ASM_KEYW},
{""},
#line 11 "scripts/genksyms/keywords.gperf"
#line 9 "scripts/genksyms/keywords.gperf"
{"__asm__", ASM_KEYW},
{""}, {""},
#line 54 "scripts/genksyms/keywords.gperf"
#line 52 "scripts/genksyms/keywords.gperf"
{"__typeof__", TYPEOF_KEYW},
{""},
#line 14 "scripts/genksyms/keywords.gperf"
#line 12 "scripts/genksyms/keywords.gperf"
{"__const", CONST_KEYW},
#line 13 "scripts/genksyms/keywords.gperf"
#line 11 "scripts/genksyms/keywords.gperf"
{"__attribute__", ATTRIBUTE_KEYW},
#line 15 "scripts/genksyms/keywords.gperf"
#line 13 "scripts/genksyms/keywords.gperf"
{"__const__", CONST_KEYW},
#line 20 "scripts/genksyms/keywords.gperf"
#line 18 "scripts/genksyms/keywords.gperf"
{"__signed__", SIGNED_KEYW},
#line 46 "scripts/genksyms/keywords.gperf"
#line 44 "scripts/genksyms/keywords.gperf"
{"static", STATIC_KEYW},
{""},
#line 41 "scripts/genksyms/keywords.gperf"
#line 20 "scripts/genksyms/keywords.gperf"
{"__volatile__", VOLATILE_KEYW},
#line 39 "scripts/genksyms/keywords.gperf"
{"int", INT_KEYW},
#line 34 "scripts/genksyms/keywords.gperf"
#line 32 "scripts/genksyms/keywords.gperf"
{"char", CHAR_KEYW},
#line 35 "scripts/genksyms/keywords.gperf"
#line 33 "scripts/genksyms/keywords.gperf"
{"const", CONST_KEYW},
#line 47 "scripts/genksyms/keywords.gperf"
#line 45 "scripts/genksyms/keywords.gperf"
{"struct", STRUCT_KEYW},
#line 26 "scripts/genksyms/keywords.gperf"
#line 24 "scripts/genksyms/keywords.gperf"
{"__restrict__", RESTRICT_KEYW},
#line 27 "scripts/genksyms/keywords.gperf"
{"restrict", RESTRICT_KEYW},
#line 7 "scripts/genksyms/keywords.gperf"
{"EXPORT_SYMBOL_GPL_FUTURE", EXPORT_SYMBOL_KEYW},
#line 18 "scripts/genksyms/keywords.gperf"
{"__inline__", INLINE_KEYW},
{""},
#line 22 "scripts/genksyms/keywords.gperf"
{"__volatile__", VOLATILE_KEYW},
#line 5 "scripts/genksyms/keywords.gperf"
{"EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW},
#line 25 "scripts/genksyms/keywords.gperf"
{"restrict", RESTRICT_KEYW},
#line 23 "scripts/genksyms/keywords.gperf"
{"_restrict", RESTRICT_KEYW},
{""},
#line 12 "scripts/genksyms/keywords.gperf"
{"__attribute", ATTRIBUTE_KEYW},
#line 6 "scripts/genksyms/keywords.gperf"
{"EXPORT_SYMBOL_GPL", EXPORT_SYMBOL_KEYW},
#line 16 "scripts/genksyms/keywords.gperf"
{"__inline__", INLINE_KEYW},
#line 10 "scripts/genksyms/keywords.gperf"
{"__attribute", ATTRIBUTE_KEYW},
{""},
#line 14 "scripts/genksyms/keywords.gperf"
{"__extension__", EXTENSION_KEYW},
#line 37 "scripts/genksyms/keywords.gperf"
#line 35 "scripts/genksyms/keywords.gperf"
{"enum", ENUM_KEYW},
#line 8 "scripts/genksyms/keywords.gperf"
{"EXPORT_UNUSED_SYMBOL", EXPORT_SYMBOL_KEYW},
#line 38 "scripts/genksyms/keywords.gperf"
#line 19 "scripts/genksyms/keywords.gperf"
{"__volatile", VOLATILE_KEYW},
#line 36 "scripts/genksyms/keywords.gperf"
{"extern", EXTERN_KEYW},
{""},
#line 19 "scripts/genksyms/keywords.gperf"
#line 17 "scripts/genksyms/keywords.gperf"
{"__signed", SIGNED_KEYW},
#line 9 "scripts/genksyms/keywords.gperf"
{"EXPORT_UNUSED_SYMBOL_GPL", EXPORT_SYMBOL_KEYW},
#line 49 "scripts/genksyms/keywords.gperf"
{"union", UNION_KEYW},
#line 53 "scripts/genksyms/keywords.gperf"
#line 7 "scripts/genksyms/keywords.gperf"
{"EXPORT_SYMBOL_GPL_FUTURE", EXPORT_SYMBOL_KEYW},
{""},
#line 51 "scripts/genksyms/keywords.gperf"
{"typeof", TYPEOF_KEYW},
#line 48 "scripts/genksyms/keywords.gperf"
#line 46 "scripts/genksyms/keywords.gperf"
{"typedef", TYPEDEF_KEYW},
#line 17 "scripts/genksyms/keywords.gperf"
#line 15 "scripts/genksyms/keywords.gperf"
{"__inline", INLINE_KEYW},
#line 33 "scripts/genksyms/keywords.gperf"
#line 31 "scripts/genksyms/keywords.gperf"
{"auto", AUTO_KEYW},
#line 21 "scripts/genksyms/keywords.gperf"
{"__volatile", VOLATILE_KEYW},
#line 47 "scripts/genksyms/keywords.gperf"
{"union", UNION_KEYW},
{""}, {""},
#line 50 "scripts/genksyms/keywords.gperf"
#line 48 "scripts/genksyms/keywords.gperf"
{"unsigned", UNSIGNED_KEYW},
{""},
#line 44 "scripts/genksyms/keywords.gperf"
#line 49 "scripts/genksyms/keywords.gperf"
{"void", VOID_KEYW},
#line 42 "scripts/genksyms/keywords.gperf"
{"short", SHORT_KEYW},
#line 40 "scripts/genksyms/keywords.gperf"
{""}, {""},
#line 50 "scripts/genksyms/keywords.gperf"
{"volatile", VOLATILE_KEYW},
{""},
#line 37 "scripts/genksyms/keywords.gperf"
{"float", FLOAT_KEYW},
#line 34 "scripts/genksyms/keywords.gperf"
{"double", DOUBLE_KEYW},
{""},
#line 5 "scripts/genksyms/keywords.gperf"
{"EXPORT_SYMBOL", EXPORT_SYMBOL_KEYW},
{""}, {""},
#line 38 "scripts/genksyms/keywords.gperf"
{"inline", INLINE_KEYW},
#line 6 "scripts/genksyms/keywords.gperf"
{"EXPORT_SYMBOL_GPL", EXPORT_SYMBOL_KEYW},
#line 41 "scripts/genksyms/keywords.gperf"
{"register", REGISTER_KEYW},
{""},
#line 52 "scripts/genksyms/keywords.gperf"
{"volatile", VOLATILE_KEYW},
#line 42 "scripts/genksyms/keywords.gperf"
{"long", LONG_KEYW},
#line 24 "scripts/genksyms/keywords.gperf"
#line 22 "scripts/genksyms/keywords.gperf"
{"_Bool", BOOL_KEYW},
{""}, {""},
#line 43 "scripts/genksyms/keywords.gperf"
{"register", REGISTER_KEYW},
#line 51 "scripts/genksyms/keywords.gperf"
{"void", VOID_KEYW},
#line 39 "scripts/genksyms/keywords.gperf"
{"float", FLOAT_KEYW},
#line 36 "scripts/genksyms/keywords.gperf"
{"double", DOUBLE_KEYW},
{""}, {""}, {""}, {""},
#line 45 "scripts/genksyms/keywords.gperf"
{"signed", SIGNED_KEYW}
{"signed", SIGNED_KEYW},
{""}, {""},
#line 40 "scripts/genksyms/keywords.gperf"
{"long", LONG_KEYW}
};
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
......
......@@ -5,8 +5,6 @@ struct resword { const char *name; int token; }
EXPORT_SYMBOL, EXPORT_SYMBOL_KEYW
EXPORT_SYMBOL_GPL, EXPORT_SYMBOL_KEYW
EXPORT_SYMBOL_GPL_FUTURE, EXPORT_SYMBOL_KEYW
EXPORT_UNUSED_SYMBOL, EXPORT_SYMBOL_KEYW
EXPORT_UNUSED_SYMBOL_GPL, EXPORT_SYMBOL_KEYW
__asm, ASM_KEYW
__asm__, ASM_KEYW
__attribute, ATTRIBUTE_KEYW
......
......@@ -130,9 +130,18 @@ static int read_symbol(FILE *in, struct sym_entry *s)
static int symbol_valid(struct sym_entry *s)
{
/* Symbols which vary between passes. Passes 1 and 2 must have
* identical symbol lists.
* identical symbol lists. The kallsyms_* symbols below are only added
* after pass 1, they would be included in pass 2 when --all-symbols is
* specified so exclude them to get a stable symbol list.
*/
static char *special_symbols[] = {
"kallsyms_addresses",
"kallsyms_num_syms",
"kallsyms_names",
"kallsyms_markers",
"kallsyms_token_table",
"kallsyms_token_index",
/* Exclude linker generated symbols which vary between passes */
"_SDA_BASE_", /* ppc */
"_SDA2_BASE_", /* ppc */
......@@ -164,9 +173,7 @@ static int symbol_valid(struct sym_entry *s)
}
/* Exclude symbols which vary between passes. */
if (strstr((char *)s->sym + offset, "_compiled.") ||
strncmp((char*)s->sym + offset, "__compound_literal.", 19) == 0 ||
strncmp((char*)s->sym + offset, "__compound_literal$", 19) == 0)
if (strstr((char *)s->sym + offset, "_compiled."))
return 0;
for (i = 0; special_symbols[i]; i++)
......@@ -543,10 +550,8 @@ int main(int argc, char **argv)
usage();
read_map(stdin);
if (table_cnt) {
sort_symbols();
optimize_token_table();
}
sort_symbols();
optimize_token_table();
write_src();
return 0;
......
......@@ -37,6 +37,9 @@
# readprofile starts reading symbols when _stext is found, and
# continue until it finds a symbol which is not either of 'T', 't',
# 'W' or 'w'.
# 'W' or 'w'. __crc_ are 'A' and placed in the middle
# so we just ignore them to let readprofile continue to work.
# (At least sparc64 has __crc_ in the middle).
$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)' > $2
$NM -n $1 | grep -v '\( [aNUw] \)\|\( \$[adt]\)' > $2
<*>
*.h
__compound_literal[$.][0-9]*
__crc_[a-zA-Z_]*
__exitcall_[a-zA-Z_]*
__func__[$.][0-9]*
__FUNCTION__[$.][0-9]*
gcc[0-9]_compiled[$.]
__initcall_[a-zA-Z_]*
__kcrctab_[a-zA-Z_]*
__kstrtab_[a-zA-Z_]*
__ksymtab_[a-zA-Z_]*
__mod_[a-zA-Z_]*[0-9]
__module_depends
__param_[a-zA-Z_]*
__pci_fixup_*PCI_ANY_IDPCI_ANY_ID*
__pci_fixup_*PCI_ANY_IDPCI_DEVICE_ID_*
__pci_fixup_*PCI_VENDOR_ID_*PCI_ANY_ID*
__pci_fixup_*PCI_VENDOR_ID_*PCI_DEVICE_ID_*
__PRETTY_FUNCTION__[$.][0-9]*
__setup_[a-zA-Z_]*
____versions
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册