Module Name: src
Committed By: christos
Date: Mon Apr 11 15:30:18 UTC 2016
Modified Files:
src/lib/libexecinfo: symtab.c
Log Message:
make this work with pie binaries (subtract dli_fbase from addresses).
To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/lib/libexecinfo/symtab.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libexecinfo/symtab.c
diff -u src/lib/libexecinfo/symtab.c:1.3 src/lib/libexecinfo/symtab.c:1.4
--- src/lib/libexecinfo/symtab.c:1.3 Tue Sep 3 04:44:45 2013
+++ src/lib/libexecinfo/symtab.c Mon Apr 11 11:30:18 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: symtab.c,v 1.3 2013/09/03 08:44:45 christos Exp $ */
+/* $NetBSD: symtab.c,v 1.4 2016/04/11 15:30:18 christos Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: symtab.c,v 1.3 2013/09/03 08:44:45 christos Exp $");
+__RCSID("$NetBSD: symtab.c,v 1.4 2016/04/11 15:30:18 christos Exp $");
#include <stdlib.h>
#include <stdio.h>
@@ -47,7 +47,6 @@ __RCSID("$NetBSD: symtab.c,v 1.3 2013/09
#define ELF_ST_TYPE(x) (((unsigned int)x) & 0xf)
#endif
-
#include "symtab.h"
struct symbol {
@@ -127,6 +126,13 @@ symtab_create(int fd, int bind, int type
GElf_Sym sym;
gelf_getsym(edata, (int)i, &sym);
+#ifdef SYMTAB_DEBUG
+ fprintf(stderr, "%s: %s@%#jx=%d,%d\n", __func__,
+ elf_strptr(elf, shdr.sh_link, sym.st_name),
+ (uintmax_t)sym.st_value, ELF_ST_BIND(sym.st_info),
+ ELF_ST_TYPE(sym.st_info));
+#endif
+
if (bind != -1 &&
(unsigned)bind != ELF_ST_BIND(sym.st_info))
continue;
@@ -170,8 +176,13 @@ symtab_find(const symtab_t *st, const vo
size_t hi = ns;
size_t lo = 0;
size_t mid = ns / 2;
- uintptr_t dd, sd, me = (uintptr_t)p;
+ uintptr_t dd, sd, me = (uintptr_t)p - (uintptr_t)dli->dli_fbase;
+ uintptr_t ad = (uintptr_t)dli->dli_saddr - (uintptr_t)dli->dli_fbase;
+#ifdef SYMTAB_DEBUG
+ fprintf(stderr, "%s: [fbase=%p, saddr=%p, me=%#jx]\n", __func__,
+ dli->dli_fbase, dli->dli_saddr, (uintmax_t)me);
+#endif
for (;;) {
if (s[mid].st_value < me)
lo = mid;
@@ -185,11 +196,20 @@ symtab_find(const symtab_t *st, const vo
}
mid = (hi + lo) / 2;
}
- dd = me - (uintptr_t)dli->dli_saddr;
+ dd = me - ad;
sd = me - s[mid].st_value;
if (dd > sd) {
dli->dli_saddr = (void *)s[mid].st_value;
dli->dli_sname = s[mid].st_name;
+#ifdef SYMTAB_DEBUG
+ fprintf(stderr, "%s: %p -> [%p, %s]\n", __func__,
+ p, dli->dli_saddr, dli->dli_sname);
+#endif
}
+#ifdef SYMTAB_DEBUG
+ else
+ fprintf(stderr, "%s: %p -> [%p, ***]\n", __func__,
+ p, dli->dli_saddr);
+#endif
return 1;
}