diff options
author | Mark Wielaard <mjw@redhat.com> | 2009-04-15 19:20:41 +0200 |
---|---|---|
committer | Mark Wielaard <mjw@redhat.com> | 2009-04-15 19:20:41 +0200 |
commit | 9a8911ac796aa9cefb504b825802246ef3c8e45f (patch) | |
tree | d3bff12b8ef89d703cd23e0751719eb6b3b1ba5b /runtime | |
parent | 7a51212ca1895b85f400fafe0e5198525996af1d (diff) | |
parent | c1af604e1c626b90834113ba7d71c4a2ea1bda68 (diff) | |
download | systemtap-steved-9a8911ac796aa9cefb504b825802246ef3c8e45f.tar.gz systemtap-steved-9a8911ac796aa9cefb504b825802246ef3c8e45f.tar.xz systemtap-steved-9a8911ac796aa9cefb504b825802246ef3c8e45f.zip |
Merge branch 'sections'
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/sym.c | 27 | ||||
-rw-r--r-- | runtime/sym.h | 1 |
2 files changed, 13 insertions, 15 deletions
diff --git a/runtime/sym.c b/runtime/sym.c index a2cdd0ff..f6f97ac2 100644 --- a/runtime/sym.c +++ b/runtime/sym.c @@ -136,9 +136,7 @@ static struct _stp_module *_stp_mod_sec_lookup(unsigned long addr, struct _stp_section **sec) { void *user = NULL; - struct _stp_module *m = NULL; unsigned midx = 0; - unsigned long closest_section_offset = ~0; // Try vma matching first if task given. if (task) @@ -149,8 +147,9 @@ static struct _stp_module *_stp_mod_sec_lookup(unsigned long addr, NULL, &user) == 0) if (user != NULL) { - m = (struct _stp_module *)user; - *sec = &m->sections[0]; // XXX check actual section and relocate + struct _stp_module *m = (struct _stp_module *)user; + if (sec) + *sec = &m->sections[0]; // XXX check actual section and relocate dbug_sym(1, "found section %s in module %s at 0x%lx\n", m->sections[0].name, m->name, vm_start); if (strcmp(".dynamic", m->sections[0].name) == 0) @@ -164,21 +163,19 @@ static struct _stp_module *_stp_mod_sec_lookup(unsigned long addr, unsigned secidx; for (secidx = 0; secidx < _stp_modules[midx]->num_sections; secidx++) { - unsigned long this_section_addr; - unsigned long this_section_offset; - this_section_addr = _stp_modules[midx]->sections[secidx].addr; - if (addr < this_section_addr) continue; - this_section_offset = addr - this_section_addr; - if (this_section_offset < closest_section_offset) - { - closest_section_offset = this_section_offset; - m = _stp_modules[midx]; + unsigned long sec_addr; + unsigned long sec_size; + sec_addr = _stp_modules[midx]->sections[secidx].addr; + sec_size = _stp_modules[midx]->sections[secidx].size; + if (addr >= sec_addr && addr < sec_addr + sec_size) + { if (sec) - *sec = & m->sections[secidx]; + *sec = & _stp_modules[midx]->sections[secidx]; + return _stp_modules[midx]; } } } - return m; + return NULL; } diff --git a/runtime/sym.h b/runtime/sym.h index 586b10ca..80c334fb 100644 --- a/runtime/sym.h +++ b/runtime/sym.h @@ -18,6 +18,7 @@ struct _stp_symbol { struct _stp_section { const char *name; unsigned long addr; /* XXX: belongs in per-address-space tables */ + unsigned long size; /* length of the address space module covers. */ struct _stp_symbol *symbols; /* ordered by address */ unsigned num_symbols; }; |