aboutsummaryrefslogtreecommitdiffstats
path: root/tools/xentrace
diff options
context:
space:
mode:
authorKeir Fraser <keir@xen.org>2011-01-11 11:41:39 +0000
committerKeir Fraser <keir@xen.org>2011-01-11 11:41:39 +0000
commita7c8838ea7c419b6d60613c7a504c9b201e87f5e (patch)
tree4c6cca512fe87573d03cf36aad24cd40e4083734 /tools/xentrace
parentdb0fe41a146e1e8170fdbe1360a99fe5758f40e2 (diff)
downloadxen-a7c8838ea7c419b6d60613c7a504c9b201e87f5e.tar.gz
xen-a7c8838ea7c419b6d60613c7a504c9b201e87f5e.tar.bz2
xen-a7c8838ea7c419b6d60613c7a504c9b201e87f5e.zip
xenctx: misc adjustments
- fix off-by-one errors during symbol insertion and lookup - don't store the symbol type, as it wasn't needed at all so far and is only needed now at parsing time - don't insert certain kinds of symbols Signed-off-by: Jan Beulich <jbeulich@novell.com>
Diffstat (limited to 'tools/xentrace')
-rw-r--r--tools/xentrace/xenctx.c41
1 files changed, 28 insertions, 13 deletions
diff --git a/tools/xentrace/xenctx.c b/tools/xentrace/xenctx.c
index b16b5c40ad..ac1b6d57de 100644
--- a/tools/xentrace/xenctx.c
+++ b/tools/xentrace/xenctx.c
@@ -19,6 +19,7 @@
#include <unistd.h>
#include <errno.h>
#include <signal.h>
+#include <ctype.h>
#include <string.h>
#include <inttypes.h>
#include <getopt.h>
@@ -58,7 +59,6 @@ int disp_tlb;
struct symbol {
guest_word_t address;
- char type;
char *name;
struct symbol *next;
} *symbol_table = NULL;
@@ -112,12 +112,12 @@ static void insert_symbol(struct symbol *symbol)
/* The System.map is usually already sorted... */
if (prev
- && prev->address < symbol->address
+ && prev->address <= symbol->address
&& (!prev->next || prev->next->address > symbol->address)) {
s = prev;
} else {
/* ... otherwise do crappy/slow search for the correct place */
- while(s && s->next && s->next->address < symbol->address)
+ while (s->next && s->next->address <= symbol->address)
s = s->next;
}
@@ -130,13 +130,13 @@ static struct symbol *lookup_symbol(guest_word_t address)
{
struct symbol *s = symbol_table;
- while(s && s->next && s->next->address < address)
- s = s->next;
+ if (!s)
+ return NULL;
- if (s && s->address < address)
- return s;
+ while (s->next && s->next->address < address)
+ s = s->next;
- return NULL;
+ return s->next && s->next->address <= address ? s->next : s;
}
static void print_symbol(guest_word_t addr)
@@ -159,7 +159,7 @@ static void print_symbol(guest_word_t addr)
static void read_symbol_table(const char *symtab)
{
- char line[256];
+ char type, line[256];
char *p;
struct symbol *symbol;
FILE *f;
@@ -178,9 +178,13 @@ static void read_symbol_table(const char *symtab)
/* need more checks for syntax here... */
symbol->address = strtoull(line, &p, 16);
- p++;
- symbol->type = *p++;
- p++;
+ if (!isspace(*p++))
+ continue;
+ type = *p++;
+ if (!isalpha(type) && type != '?')
+ continue;
+ if (!isspace(*p++))
+ continue;
/* in the future we should handle the module name
* being appended here, this would allow us to use
@@ -190,7 +194,18 @@ static void read_symbol_table(const char *symtab)
p[strlen(p)-1] = '\0';
symbol->name = strdup(p);
- insert_symbol(symbol);
+ switch (type) {
+ case 'A': /* global absolute */
+ case 'a': /* local absolute */
+ break;
+ case 'U': /* undefined */
+ case 'v': /* undefined weak object */
+ case 'w': /* undefined weak function */
+ continue;
+ default:
+ insert_symbol(symbol);
+ break;
+ }
if (strcmp(symbol->name, "_stext") == 0)
kernel_stext = symbol->address;