svn commit: r354112 - in head: contrib/libexecinfo lib/libexecinfo
Conrad Meyer
cem at FreeBSD.org
Sat Oct 26 07:00:00 UTC 2019
Author: cem
Date: Sat Oct 26 06:59:59 2019
New Revision: 354112
URL: https://svnweb.freebsd.org/changeset/base/354112
Log:
Sync up with NetBSD libexecinfo changes 2014-2019
Drop portions that are unlit or redundant with llvm-libunwind: builtin.c,
unwind.h, and unwind_arm_ehabi_stub.c.
This code should now work with -fPIE binaries, should we choose to build any
that way.
When backtrace() array is full, signal an error so the underlying
Itanium-style C++ exception handling library (llvm-libunwind) knows to stop
tracing instead of continuing. (It should stop on its own when it finishes
unwinding, so this is mostly an extra seatbelt against an infinite loop bug
in the unwinder.)
Deleted:
head/contrib/libexecinfo/builtin.c
head/contrib/libexecinfo/unwind.h
head/contrib/libexecinfo/unwind_arm_ehabi_stub.c
Modified:
head/contrib/libexecinfo/symtab.c
head/contrib/libexecinfo/unwind.c
head/lib/libexecinfo/Makefile
Modified: head/contrib/libexecinfo/symtab.c
==============================================================================
--- head/contrib/libexecinfo/symtab.c Sat Oct 26 03:07:28 2019 (r354111)
+++ head/contrib/libexecinfo/symtab.c Sat Oct 26 06:59:59 2019 (r354112)
@@ -1,4 +1,4 @@
-/* $NetBSD: symtab.c,v 1.2 2013/08/29 15:01:57 christos Exp $ */
+/* $NetBSD: symtab.c,v 1.5 2016/04/20 14:00:16 christos Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -29,12 +29,13 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: symtab.c,v 1.2 2013/08/29 15:01:57 christos Exp $");
+__RCSID("$NetBSD: symtab.c,v 1.5 2016/04/20 14:00:16 christos Exp $");
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
+#include <stdbool.h>
#include <err.h>
#include <dlfcn.h>
@@ -47,7 +48,6 @@ __RCSID("$NetBSD: symtab.c,v 1.2 2013/08/29 15:01:57 c
#define ELF_ST_TYPE(x) (((unsigned int)x) & 0xf)
#endif
-
#include "symtab.h"
struct symbol {
@@ -59,6 +59,7 @@ struct symbol {
struct symtab {
size_t nsymbols;
struct symbol *symbols;
+ bool ispie;
};
static int
@@ -86,6 +87,7 @@ symtab_create(int fd, int bind, int type)
Elf *elf;
symtab_t *st;
Elf_Scn *scn = NULL;
+ GElf_Ehdr ehdr;
if (elf_version(EV_CURRENT) == EV_NONE) {
warnx("Elf Library is out of date.");
@@ -103,7 +105,14 @@ symtab_create(int fd, int bind, int type)
elf_end(elf);
return NULL;
}
+ if (gelf_getehdr(elf, &ehdr) == NULL) {
+ warnx("Error getting ELF Ehdr");
+ elf_end(elf);
+ return NULL;
+ }
+ st->ispie = ehdr.e_type == ET_DYN;
+
while ((scn = elf_nextscn(elf, scn)) != NULL) {
GElf_Shdr shdr;
Elf_Data *edata;
@@ -127,6 +136,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;
@@ -159,7 +175,7 @@ out:
return NULL;
}
-
+
int
symtab_find(const symtab_t *st, const void *p, Dl_info *dli)
{
@@ -168,8 +184,15 @@ symtab_find(const symtab_t *st, const void *p, Dl_info
size_t hi = ns;
size_t lo = 0;
size_t mid = ns / 2;
- uintptr_t dd, sd, me = (uintptr_t)p;
+ uintptr_t fbase = st->ispie ? (uintptr_t)dli->dli_fbase : 0;
+ uintptr_t dd, sd, me = (uintptr_t)p - fbase;
+ uintptr_t ad = (uintptr_t)dli->dli_saddr - fbase;
+#ifdef SYMTAB_DEBUG
+ fprintf(stderr, "%s: [fbase=%#jx, saddr=%p, me=%#jx ad=%#jx]\n",
+ __func__, (uintmax_t)fbase, dli->dli_saddr, (uintmax_t)me,
+ (uintmax_t)ad);
+#endif
for (;;) {
if (s[mid].st_value < me)
lo = mid;
@@ -183,11 +206,20 @@ symtab_find(const symtab_t *st, const void *p, Dl_info
}
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: me=%#jx -> [%#jx, %s]\n", __func__,
+ (uintmax_t)me, (uintmax_t)sd, dli->dli_sname);
+#endif
}
+#ifdef SYMTAB_DEBUG
+ else
+ fprintf(stderr, "%s: %#jx -> [%#jx, ***]\n", __func__,
+ (uintmax_t)me, (uintmax_t)sd);
+#endif
return 1;
}
Modified: head/contrib/libexecinfo/unwind.c
==============================================================================
--- head/contrib/libexecinfo/unwind.c Sat Oct 26 03:07:28 2019 (r354111)
+++ head/contrib/libexecinfo/unwind.c Sat Oct 26 06:59:59 2019 (r354112)
@@ -1,4 +1,4 @@
-/* $NetBSD: unwind.c,v 1.1 2012/05/26 22:02:29 christos Exp $ */
+/* $NetBSD: unwind.c,v 1.3 2019/01/30 22:46:49 mrg Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -51,8 +51,10 @@ tracer(struct _Unwind_Context *ctx, void *arg)
return 0;
}
if (t->n < t->len)
- t->arr[t->n++] = _Unwind_GetIP(ctx);
- return 0;
+ t->arr[t->n++] = (void *)_Unwind_GetIP(ctx);
+ else
+ return _URC_END_OF_STACK;
+ return _URC_NO_REASON;
}
size_t
Modified: head/lib/libexecinfo/Makefile
==============================================================================
--- head/lib/libexecinfo/Makefile Sat Oct 26 03:07:28 2019 (r354111)
+++ head/lib/libexecinfo/Makefile Sat Oct 26 06:59:59 2019 (r354112)
@@ -10,6 +10,7 @@ SHLIB_MAJOR= 1
INCS= execinfo.h
SRCS= backtrace.c symtab.c unwind.c
+CFLAGS+= -I${SRCTOP}/contrib/libunwind/include
LIBADD= elf
More information about the svn-src-all
mailing list