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 | ||
