aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/kallsyms.c
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/kallsyms.c')
-rw-r--r--scripts/kallsyms.c57
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 */
504static 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
538static 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
503static int compare_symbols(const void *a, const void *b) 548static 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}