Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 140955
b: refs/heads/master
c: b478b78
h: refs/heads/master
i:
  140953: 5cf92a6
  140951: 41945c1
v: v3
  • Loading branch information
Lai Jiangshan authored and Ingo Molnar committed Mar 14, 2009
1 parent a42135a commit d67117f
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e94142a67f8bad494c593f0a07c9fc2fbec98c0e
refs/heads/master: b478b782e110fdb4135caa3062b6d687e989d994
57 changes: 57 additions & 0 deletions trunk/scripts/kallsyms.c
Original file line number Diff line number Diff line change
Expand Up @@ -500,6 +500,51 @@ static void optimize_token_table(void)
optimize_result();
}

/* guess for "linker script provide" symbol */
static int may_be_linker_script_provide_symbol(const struct sym_entry *se)
{
const char *symbol = (char *)se->sym + 1;
int len = se->len - 1;

if (len < 8)
return 0;

if (symbol[0] != '_' || symbol[1] != '_')
return 0;

/* __start_XXXXX */
if (!memcmp(symbol + 2, "start_", 6))
return 1;

/* __stop_XXXXX */
if (!memcmp(symbol + 2, "stop_", 5))
return 1;

/* __end_XXXXX */
if (!memcmp(symbol + 2, "end_", 4))
return 1;

/* __XXXXX_start */
if (!memcmp(symbol + len - 6, "_start", 6))
return 1;

/* __XXXXX_end */
if (!memcmp(symbol + len - 4, "_end", 4))
return 1;

return 0;
}

static int prefix_underscores_count(const char *str)
{
const char *tail = str;

while (*tail != '_')
tail++;

return tail - str;
}

static int compare_symbols(const void *a, const void *b)
{
const struct sym_entry *sa;
Expand All @@ -521,6 +566,18 @@ static int compare_symbols(const void *a, const void *b)
if (wa != wb)
return wa - wb;

/* sort by "linker script provide" type */
wa = may_be_linker_script_provide_symbol(sa);
wb = may_be_linker_script_provide_symbol(sb);
if (wa != wb)
return wa - wb;

/* sort by the number of prefix underscores */
wa = prefix_underscores_count((const char *)sa->sym + 1);
wb = prefix_underscores_count((const char *)sb->sym + 1);
if (wa != wb)
return wa - wb;

/* sort by initial order, so that other symbols are left undisturbed */
return sa->start_pos - sb->start_pos;
}
Expand Down

0 comments on commit d67117f

Please sign in to comment.