diff options
| author | Masahiro Yamada <yamada.masahiro@socionext.com> | 2019-11-24 01:04:39 +0900 | 
|---|---|---|
| committer | Masahiro Yamada <yamada.masahiro@socionext.com> | 2019-11-25 21:04:57 +0900 | 
| commit | a41333e06acd1b37f3a3248fb90cd417218f9439 (patch) | |
| tree | f47e4b1f90d14e677f345c47ba612fd50e5fc3dc | |
| parent | 4bfe2b7816a6e97fba7b4125166b33db4b31d29d (diff) | |
| download | talos-op-linux-a41333e06acd1b37f3a3248fb90cd417218f9439.tar.gz talos-op-linux-a41333e06acd1b37f3a3248fb90cd417218f9439.zip  | |
scripts/kallsyms: skip ignored symbols very early
Unless the address range matters, symbols can be ignored earlier,
which avoids unneeded memory allocation.
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
| -rw-r--r-- | scripts/kallsyms.c | 113 | 
1 files changed, 62 insertions, 51 deletions
diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c index 056bde436540..843615c1d384 100644 --- a/scripts/kallsyms.c +++ b/scripts/kallsyms.c @@ -18,6 +18,7 @@   *   */ +#include <stdbool.h>  #include <stdio.h>  #include <stdlib.h>  #include <string.h> @@ -79,6 +80,64 @@ static char *sym_name(const struct sym_entry *s)  	return (char *)s->sym + 1;  } +static bool is_ignored_symbol(const char *name, char type) +{ +	static const char * const ignored_symbols[] = { +		/* +		 * Symbols which vary between passes. Passes 1 and 2 must have +		 * 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. +		 */ +		"kallsyms_addresses", +		"kallsyms_offsets", +		"kallsyms_relative_base", +		"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 */ +		NULL +	}; + +	static const char * const ignored_prefixes[] = { +		"__crc_",		/* modversions */ +		"__efistub_",		/* arm64 EFI stub namespace */ +		NULL +	}; + +	static const char * const ignored_suffixes[] = { +		"_from_arm",		/* arm */ +		"_from_thumb",		/* arm */ +		"_veneer",		/* arm */ +		NULL +	}; + +	const char * const *p; + +	/* Exclude symbols which vary between passes. */ +	for (p = ignored_symbols; *p; p++) +		if (!strcmp(name, *p)) +			return true; + +	for (p = ignored_prefixes; *p; p++) +		if (!strncmp(name, *p, strlen(*p))) +			return true; + +	for (p = ignored_suffixes; *p; p++) { +		int l = strlen(name) - strlen(*p); + +		if (l >= 0 && !strcmp(name + l, *p)) +			return true; +	} + +	return false; +} +  static int check_symbol_range(const char *sym, unsigned long long addr,  			      struct addr_range *ranges, int entries)  { @@ -118,6 +177,9 @@ static int read_symbol(FILE *in, struct sym_entry *s)  		return -1;  	} +	if (is_ignored_symbol(sym, stype)) +		return -1; +  	/* Ignore most absolute/undefined (?) symbols. */  	if (strcmp(sym, "_text") == 0)  		_text = s->addr; @@ -188,38 +250,6 @@ static int symbol_in_range(const struct sym_entry *s,  static int symbol_valid(const struct sym_entry *s)  { -	/* Symbols which vary between passes.  Passes 1 and 2 must have -	 * 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 const char * const special_symbols[] = { -		"kallsyms_addresses", -		"kallsyms_offsets", -		"kallsyms_relative_base", -		"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 */ -		NULL }; - -	static const char * const special_prefixes[] = { -		"__crc_",		/* modversions */ -		"__efistub_",		/* arm64 EFI stub namespace */ -		NULL }; - -	static const char * const special_suffixes[] = { -		"_veneer",		/* arm */ -		"_from_arm",		/* arm */ -		"_from_thumb",		/* arm */ -		NULL }; - -	int i;  	const char *name = sym_name(s);  	/* if --all-symbols is not specified, then symbols outside the text @@ -241,25 +271,6 @@ static int symbol_valid(const struct sym_entry *s)  			return 0;  	} -	/* Exclude symbols which vary between passes. */ -	for (i = 0; special_symbols[i]; i++) -		if (strcmp(name, special_symbols[i]) == 0) -			return 0; - -	for (i = 0; special_prefixes[i]; i++) { -		int l = strlen(special_prefixes[i]); - -		if (strncmp(name, special_prefixes[i], l) == 0) -			return 0; -	} - -	for (i = 0; special_suffixes[i]; i++) { -		int l = strlen(name) - strlen(special_suffixes[i]); - -		if (l >= 0 && strcmp(name + l, special_suffixes[i]) == 0) -			return 0; -	} -  	return 1;  }  | 

