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
 static int compare_names(const void *a, const void *b)
 {
        int ret;
-       char sa_namebuf[KSYM_NAME_LEN];
-       char sb_namebuf[KSYM_NAME_LEN];
        const struct sym_entry *sa = *(const struct sym_entry **)a;
        const struct sym_entry *sb = *(const struct sym_entry **)b;
 
-       expand_symbol(sa->sym, sa->len, sa_namebuf);
-       expand_symbol(sb->sym, sb->len, sb_namebuf);
-       cleanup_symbol_name(s_name(sa_namebuf));
-       cleanup_symbol_name(s_name(sb_namebuf));
-       ret = strcmp(s_name(sa_namebuf), s_name(sb_namebuf));
+       ret = strcmp(sym_name(sa), sym_name(sb));
        if (!ret) {
                if (sa->addr > sb->addr)
                        return 1;
        }
        printf("\n");
 
+       /*
+        * Now that we wrote out the compressed symbol names, restore the
+        * original names, which are needed in some of the later steps.
+        */
+       for (i = 0; i < table_cnt; i++) {
+               expand_symbol(table[i]->sym, table[i]->len, buf);
+               strcpy((char *)table[i]->sym, buf);
+       }
+
        output_label("kallsyms_markers");
        for (i = 0; i < ((table_cnt + 255) >> 8); i++)
                printf("\t.long\t%u\n", markers[i]);
                                        table[i]->addr);
                                exit(EXIT_FAILURE);
                        }
-                       expand_symbol(table[i]->sym, table[i]->len, buf);
-                       printf("\t.long\t%#x    /* %s */\n", (int)offset, buf);
+                       printf("\t.long\t%#x    /* %s */\n", (int)offset, table[i]->sym);
                } else if (!symbol_absolute(table[i])) {
                        output_address(table[i]->addr);
                } else {
                printf("\n");
        }
 
+       if (lto_clang)
+               for (i = 0; i < table_cnt; i++)
+                       cleanup_symbol_name((char *)table[i]->sym);
+
        sort_symbols_by_name();
        output_label("kallsyms_seqs_of_names");
        for (i = 0; i < table_cnt; i++)