diff options
-rw-r--r-- | scripts/kallsyms.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c index ad2434b26970..6654cbed965b 100644 --- a/scripts/kallsyms.c +++ b/scripts/kallsyms.c | |||
@@ -500,6 +500,51 @@ static void optimize_token_table(void) | |||
500 | optimize_result(); | 500 | optimize_result(); |
501 | } | 501 | } |
502 | 502 | ||
503 | /* guess for "linker script provide" symbol */ | ||
504 | static int may_be_linker_script_provide_symbol(const struct sym_entry *se) | ||
505 | { | ||
506 | const char *symbol = (char *)se->sym + 1; | ||
507 | int len = se->len - 1; | ||
508 | |||
509 | if (len < 8) | ||
510 | return 0; | ||
511 | |||
512 | if (symbol[0] != '_' || symbol[1] != '_') | ||
513 | return 0; | ||
514 | |||
515 | /* __start_XXXXX */ | ||
516 | if (!memcmp(symbol + 2, "start_", 6)) | ||
517 | return 1; | ||
518 | |||
519 | /* __stop_XXXXX */ | ||
520 | if (!memcmp(symbol + 2, "stop_", 5)) | ||
521 | return 1; | ||
522 | |||
523 | /* __end_XXXXX */ | ||
524 | if (!memcmp(symbol + 2, "end_", 4)) | ||
525 | return 1; | ||
526 | |||
527 | /* __XXXXX_start */ | ||
528 | if (!memcmp(symbol + len - 6, "_start", 6)) | ||
529 | return 1; | ||
530 | |||
531 | /* __XXXXX_end */ | ||
532 | if (!memcmp(symbol + len - 4, "_end", 4)) | ||
533 | return 1; | ||
534 | |||
535 | return 0; | ||
536 | } | ||
537 | |||
538 | static int prefix_underscores_count(const char *str) | ||
539 | { | ||
540 | const char *tail = str; | ||
541 | |||
542 | while (*tail != '_') | ||
543 | tail++; | ||
544 | |||
545 | return tail - str; | ||
546 | } | ||
547 | |||
503 | static int compare_symbols(const void *a, const void *b) | 548 | static int compare_symbols(const void *a, const void *b) |
504 | { | 549 | { |
505 | const struct sym_entry *sa; | 550 | const struct sym_entry *sa; |
@@ -521,6 +566,18 @@ static int compare_symbols(const void *a, const void *b) | |||
521 | if (wa != wb) | 566 | if (wa != wb) |
522 | return wa - wb; | 567 | return wa - wb; |
523 | 568 | ||
569 | /* sort by "linker script provide" type */ | ||
570 | wa = may_be_linker_script_provide_symbol(sa); | ||
571 | wb = may_be_linker_script_provide_symbol(sb); | ||
572 | if (wa != wb) | ||
573 | return wa - wb; | ||
574 | |||
575 | /* sort by the number of prefix underscores */ | ||
576 | wa = prefix_underscores_count((const char *)sa->sym + 1); | ||
577 | wb = prefix_underscores_count((const char *)sb->sym + 1); | ||
578 | if (wa != wb) | ||
579 | return wa - wb; | ||
580 | |||
524 | /* sort by initial order, so that other symbols are left undisturbed */ | 581 | /* sort by initial order, so that other symbols are left undisturbed */ |
525 | return sa->start_pos - sb->start_pos; | 582 | return sa->start_pos - sb->start_pos; |
526 | } | 583 | } |