From 38ccb4c2141e73e12f080aab4ff88d6430de4bf2 Mon Sep 17 00:00:00 2001 From: Nate Williams Date: Wed, 24 Mar 1999 23:47:29 +0000 Subject: - Commit the correct dladdr() implementation. Reviewed by: jdp@FreeBSD.org --- libexec/rtld-elf/rtld.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'libexec') diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c index 02f9c209aa2b..11b22148fb7f 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * - * $Id: rtld.c,v 1.13 1998/11/27 21:19:52 dfr Exp $ + * $Id: rtld.c,v 1.14 1999/03/24 23:37:35 nate Exp $ */ /* @@ -1268,13 +1268,13 @@ dladdr(const void *addr, Dl_info *info) void *symbol_addr; unsigned long symoffset; - obj = obj_from_addr(addr); + obj = obj_from_addr(addr); if (obj == NULL) { - _rtld_error("No shared object contains address"); + _rtld_error("No shared object contains address"); return 0; } info->dli_fname = obj->path; - info->dli_fbase = obj->relocbase; + info->dli_fbase = obj->mapbase; info->dli_saddr = (void *)0; info->dli_sname = NULL; @@ -1284,14 +1284,21 @@ dladdr(const void *addr, Dl_info *info) */ for (symoffset = 0; symoffset < obj->nchains; symoffset++) { def = obj->symtab + symoffset; - symbol_addr = obj->relocbase + def->st_value; + + /* + * For skip the symbol if st_shndx is either SHN_UNDEF or + * SHN_COMMON. + */ + if (def->st_shndx == SHN_UNDEF || def->st_shndx == SHN_COMMON) + continue; + /* *If the symbol is greater than the specified address, or if it * is further away from addr than the current nearest symbol, * then reject it. */ - if (symbol_addr > addr || - symbol_addr < info->dli_saddr) + symbol_addr = obj->relocbase + def->st_value; + if (symbol_addr > addr || symbol_addr < info->dli_saddr) continue; /* Update our idea of the nearest symbol. */ -- cgit v1.3