Skip to content

Commit

Permalink
scripts/kallsyms: skip ignored symbols very early
Browse files Browse the repository at this point in the history
Unless the address range matters, symbols can be ignored earlier,
which avoids unneeded memory allocation.

Signed-off-by: Masahiro Yamada <[email protected]>
  • Loading branch information
masahir0y committed Nov 25, 2019
1 parent 4bfe2b7 commit a41333e
Showing 1 changed file with 62 additions and 51 deletions.
113 changes: 62 additions & 51 deletions scripts/kallsyms.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
*
*/

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand All @@ -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;
}

Expand Down

0 comments on commit a41333e

Please sign in to comment.