]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
scripts/kallsyms: skip ignored symbols very early
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Sat, 23 Nov 2019 16:04:39 +0000 (01:04 +0900)
committerMasahiro Yamada <yamada.masahiro@socionext.com>
Mon, 25 Nov 2019 12:04:57 +0000 (21:04 +0900)
Unless the address range matters, symbols can be ignored earlier,
which avoids unneeded memory allocation.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
scripts/kallsyms.c

index 056bde4365409ec4bbd59bedb52b6996a1f85970..843615c1d384e1067973af38073d5986c24ab568 100644 (file)
@@ -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;
 }