summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scripts/kallsyms.c36
-rwxr-xr-xscripts/link-vmlinux.sh4
2 files changed, 38 insertions, 2 deletions
diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c
index df2d93fb0e8d..07ecf7e5c49f 100644
--- a/scripts/kallsyms.c
+++ b/scripts/kallsyms.c
@@ -78,6 +78,7 @@ static unsigned int table_size, table_cnt;
static int all_symbols;
static int absolute_percpu;
static int base_relative;
+static int lto_clang;
static int token_profit[0x10000];
@@ -89,7 +90,7 @@ static unsigned char best_table_len[256];
static void usage(void)
{
fprintf(stderr, "Usage: kallsyms [--all-symbols] [--absolute-percpu] "
- "[--base-relative] in.map > out.S\n");
+ "[--base-relative] [--lto-clang] in.map > out.S\n");
exit(1);
}
@@ -411,6 +412,34 @@ static int symbol_absolute(const struct sym_entry *s)
return s->percpu_absolute;
}
+static char * s_name(char *buf)
+{
+ /* Skip the symbol type */
+ return buf + 1;
+}
+
+static void cleanup_symbol_name(char *s)
+{
+ char *p;
+
+ if (!lto_clang)
+ return;
+
+ /*
+ * ASCII[.] = 2e
+ * ASCII[0-9] = 30,39
+ * ASCII[A-Z] = 41,5a
+ * ASCII[_] = 5f
+ * ASCII[a-z] = 61,7a
+ *
+ * As above, replacing '.' with '\0' does not affect the main sorting,
+ * but it helps us with subsorting.
+ */
+ p = strchr(s, '.');
+ if (p)
+ *p = '\0';
+}
+
static int compare_names(const void *a, const void *b)
{
int ret;
@@ -421,7 +450,9 @@ static int compare_names(const void *a, const void *b)
expand_symbol(sa->sym, sa->len, sa_namebuf);
expand_symbol(sb->sym, sb->len, sb_namebuf);
- ret = strcmp(&sa_namebuf[1], &sb_namebuf[1]);
+ cleanup_symbol_name(s_name(sa_namebuf));
+ cleanup_symbol_name(s_name(sb_namebuf));
+ ret = strcmp(s_name(sa_namebuf), s_name(sb_namebuf));
if (!ret) {
if (sa->addr > sb->addr)
return 1;
@@ -855,6 +886,7 @@ int main(int argc, char **argv)
{"all-symbols", no_argument, &all_symbols, 1},
{"absolute-percpu", no_argument, &absolute_percpu, 1},
{"base-relative", no_argument, &base_relative, 1},
+ {"lto-clang", no_argument, &lto_clang, 1},
{},
};
diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
index 918470d768e9..32e573943cf0 100755
--- a/scripts/link-vmlinux.sh
+++ b/scripts/link-vmlinux.sh
@@ -156,6 +156,10 @@ kallsyms()
kallsymopt="${kallsymopt} --base-relative"
fi
+ if is_enabled CONFIG_LTO_CLANG; then
+ kallsymopt="${kallsymopt} --lto-clang"
+ fi
+
info KSYMS ${2}
scripts/kallsyms ${kallsymopt} ${1} > ${2}
}