diff options
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/kallsyms.c | 37 |
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 | |||
35 | struct sym_entry { | 34 | struct 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 | |||
42 | static struct sym_entry *table; | 41 | static struct sym_entry *table; |
43 | static unsigned int table_size, table_cnt; | 42 | static unsigned int table_size, table_cnt; |
44 | static unsigned long long _text, _stext, _etext, _sinittext, _einittext; | 43 | static 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 | ||
506 | static 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 | |||
531 | static void sort_symbols(void) | ||
532 | { | ||
533 | qsort(table, table_cnt, sizeof(struct sym_entry), compare_symbols); | ||
534 | } | ||
505 | 535 | ||
506 | int main(int argc, char **argv) | 536 | int 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 | ||