Commit bfb288f1 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] show last kernel-image symbol in /proc/kallsyms

From: Rusty Russell <rusty@rustcorp.com.au>

The current code doesn't show the last symbol (usually _einittext) in
/proc/kallsyms.  The reason for this is subtle: s_start() returns an empty
string for position 0 (ignored by s_show()), and s_next() returns the first
symbol for position 1.

What should happen is that update_iter() for position 0 should fill in the
first symbol.  Unfortunately, the get_ksymbol_core() fills in the symbol
information, *and* updates the iterator: we have to split these functions,
which we do by making it return the length of the name offset.

Then we can call get_ksymbol_core() without moving the iterator, meaning
that we can call it at position 0 (ie.  s_start()).
parent 017474ed
...@@ -171,21 +171,23 @@ static int get_ksymbol_mod(struct kallsym_iter *iter) ...@@ -171,21 +171,23 @@ static int get_ksymbol_mod(struct kallsym_iter *iter)
return 1; return 1;
} }
static void get_ksymbol_core(struct kallsym_iter *iter) /* Returns space to next name. */
static unsigned long get_ksymbol_core(struct kallsym_iter *iter)
{ {
unsigned stemlen; unsigned stemlen, off = iter->nameoff;
/* First char of each symbol name indicates prefix length /* First char of each symbol name indicates prefix length
shared with previous name (stem compression). */ shared with previous name (stem compression). */
stemlen = kallsyms_names[iter->nameoff++]; stemlen = kallsyms_names[off++];
strlcpy(iter->name+stemlen, kallsyms_names+iter->nameoff, 128-stemlen); strlcpy(iter->name+stemlen, kallsyms_names + off, 128-stemlen);
iter->nameoff += strlen(kallsyms_names + iter->nameoff) + 1; off += strlen(kallsyms_names + off) + 1;
iter->owner = NULL; iter->owner = NULL;
iter->value = kallsyms_addresses[iter->pos]; iter->value = kallsyms_addresses[iter->pos];
iter->type = 't'; iter->type = 't';
upcase_if_global(iter); upcase_if_global(iter);
return off - iter->nameoff;
} }
static void reset_iter(struct kallsym_iter *iter) static void reset_iter(struct kallsym_iter *iter)
...@@ -210,9 +212,10 @@ static int update_iter(struct kallsym_iter *iter, loff_t pos) ...@@ -210,9 +212,10 @@ static int update_iter(struct kallsym_iter *iter, loff_t pos)
/* We need to iterate through the previous symbols: can be slow */ /* We need to iterate through the previous symbols: can be slow */
for (; iter->pos != pos; iter->pos++) { for (; iter->pos != pos; iter->pos++) {
get_ksymbol_core(iter); iter->nameoff += get_ksymbol_core(iter);
cond_resched(); cond_resched();
} }
get_ksymbol_core(iter);
return 1; return 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment