mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
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>
This commit is contained in:
parent
4bfe2b7816
commit
a41333e06a
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user