aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/kallsyms.c
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/kallsyms.c')
-rw-r--r--scripts/kallsyms.c37
1 files changed, 34 insertions, 3 deletions
diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c
index 8fb87003d5d3..c912137f80e2 100644
--- a/scripts/kallsyms.c
+++ b/scripts/kallsyms.c
@@ -31,14 +31,13 @@
31 31
32#define KSYM_NAME_LEN 128 32#define KSYM_NAME_LEN 128
33 33
34
35struct sym_entry { 34struct sym_entry {
36 unsigned long long addr; 35 unsigned long long addr;
37 unsigned int len; 36 unsigned int len;
37 unsigned int start_pos;
38 unsigned char *sym; 38 unsigned char *sym;
39}; 39};
40 40
41
42static struct sym_entry *table; 41static struct sym_entry *table;
43static unsigned int table_size, table_cnt; 42static unsigned int table_size, table_cnt;
44static unsigned long long _text, _stext, _etext, _sinittext, _einittext; 43static unsigned long long _text, _stext, _etext, _sinittext, _einittext;
@@ -198,8 +197,10 @@ static void read_map(FILE *in)
198 exit (1); 197 exit (1);
199 } 198 }
200 } 199 }
201 if (read_symbol(in, &table[table_cnt]) == 0) 200 if (read_symbol(in, &table[table_cnt]) == 0) {
201 table[table_cnt].start_pos = table_cnt;
202 table_cnt++; 202 table_cnt++;
203 }
203 } 204 }
204} 205}
205 206
@@ -502,6 +503,35 @@ static void optimize_token_table(void)
502 optimize_result(); 503 optimize_result();
503} 504}
504 505
506static int compare_symbols(const void *a, const void *b)
507{
508 const struct sym_entry *sa;
509 const struct sym_entry *sb;
510 int wa, wb;
511
512 sa = a;
513 sb = b;
514
515 /* sort by address first */
516 if (sa->addr > sb->addr)
517 return 1;
518 if (sa->addr < sb->addr)
519 return -1;
520
521 /* sort by "weakness" type */
522 wa = (sa->sym[0] == 'w') || (sa->sym[0] == 'W');
523 wb = (sb->sym[0] == 'w') || (sb->sym[0] == 'W');
524 if (wa != wb)
525 return wa - wb;
526
527 /* sort by initial order, so that other symbols are left undisturbed */
528 return sa->start_pos - sb->start_pos;
529}
530
531static void sort_symbols(void)
532{
533 qsort(table, table_cnt, sizeof(struct sym_entry), compare_symbols);
534}
505 535
506int main(int argc, char **argv) 536int main(int argc, char **argv)
507{ 537{
@@ -523,6 +553,7 @@ int main(int argc, char **argv)
523 usage(); 553 usage();
524 554
525 read_map(stdin); 555 read_map(stdin);
556 sort_symbols();
526 optimize_token_table(); 557 optimize_token_table();
527 write_src(); 558 write_src();
528 559