Index: head/contrib/libexecinfo/unwind_arm_ehabi_stub.c =================================================================== --- head/contrib/libexecinfo/unwind_arm_ehabi_stub.c (revision 354111) +++ head/contrib/libexecinfo/unwind_arm_ehabi_stub.c (nonexistent) @@ -1,61 +0,0 @@ -/*- - * Copyright (c) 2013 The NetBSD Foundation, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -#include -#include -#include "unwind.h" - -void _Unwind_VRS_Get(struct _Unwind_Context *, int, _Unwind_Word, int, void *); -void _Unwind_VRS_Set(struct _Unwind_Context *, int, _Unwind_Word, int, void *); - -_Unwind_Word -_Unwind_GetGR(struct _Unwind_Context *context, int regno) -{ - _Unwind_Word val; - _Unwind_VRS_Get(context, 0 /*_UVRSC_CORE*/, regno, 0 /*_UVRSD_UINT32*/, - &val); - - return val; -} - -_Unwind_Ptr -_Unwind_GetIP(struct _Unwind_Context *context) -{ - return (_Unwind_Ptr)(_Unwind_GetGR (context, 15) & ~(_Unwind_Word)1); -} - -_Unwind_Ptr -_Unwind_GetIPInfo(struct _Unwind_Context *context, int *p) -{ - *p = 0; - return _Unwind_GetIP(context); -} - -void -_Unwind_SetGR(struct _Unwind_Context *context, int reg, _Unwind_Ptr val) -{ - _Unwind_VRS_Set(context, 0 /*_UVRSC_CORE*/, reg, 0 /*_UVRSD_UINT32*/, - &val); -} Index: head/contrib/libexecinfo/builtin.c =================================================================== --- head/contrib/libexecinfo/builtin.c (revision 354111) +++ head/contrib/libexecinfo/builtin.c (nonexistent) @@ -1,68 +0,0 @@ -/* $NetBSD: builtin.c,v 1.1 2012/05/26 22:02:29 christos Exp $ */ - -/*- - * Copyright (c) 2012 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Christos Zoulas. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -#include -__RCSID("$NetBSD: builtin.c,v 1.1 2012/05/26 22:02:29 christos Exp $"); - -#include -#include - -#include "execinfo.h" - -#ifdef __MACHINE_STACK_GROWS_UP -#define BELOW > -#else -#define BELOW < -#endif - -#ifdef __lint__ -#define __builtin_frame_address(a) ((void *)a) -#endif - -struct frameinfo { - struct frameinfo *next; - void *return_address; -}; - -size_t -backtrace(void **trace, size_t len) -{ - const struct frameinfo *frame = __builtin_frame_address(0); - void *stack = &stack; - - for (size_t i = 0; i < len; i++) { - if ((const void *)frame BELOW stack) - return i; - trace[i] = frame->return_address; - frame = frame->next; - } - - return len; -} Index: head/contrib/libexecinfo/unwind.h =================================================================== --- head/contrib/libexecinfo/unwind.h (revision 354111) +++ head/contrib/libexecinfo/unwind.h (nonexistent) @@ -1,68 +0,0 @@ -/* $NetBSD: unwind.h,v 1.1 2012/05/26 22:02:29 christos Exp $ */ - -/*- - * Copyright (c) 2012 The NetBSD Foundation, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -#ifndef _UNWIND_H_ -#define _UNWIND_H_ - -__BEGIN_DECLS -struct _Unwind_Context; -struct _Unwind_Exception; -typedef int _Unwind_Reason_Code; -typedef void *_Unwind_Ptr; -typedef long _Unwind_Word; - -typedef _Unwind_Reason_Code - (*_Unwind_Trace_Fn)(struct _Unwind_Context *, void *); -#ifdef notyet -typedef _Unwind_Reason_Code - (*_Unwind_Stop_Fn)(struct _Unwind_Context *, void *); -#endif - -_Unwind_Reason_Code _Unwind_Backtrace(_Unwind_Trace_Fn, void *); -void _Unwind_DeleteException(struct _Unwind_Exception *); -void *_Unwind_FindEnclosingFunction(void *); -#ifdef notyet -_Unwind_Reason_Code _Unwind_ForcedUnwind(struct _Unwind_Exception *, - _Unwind_Stop_fn, void *); -#endif -_Unwind_Word _Unwind_GetCFA(struct _Unwind_Context *); -_Unwind_Ptr _Unwind_GetDataRelBase(struct _Unwind_Context *); -_Unwind_Word _Unwind_GetGR(struct _Unwind_Context *, int); -_Unwind_Ptr _Unwind_GetIP(struct _Unwind_Context *); -_Unwind_Ptr _Unwind_GetIPInfo(struct _Unwind_Context *, int *); -void *_Unwind_GetLanguageSpecificData( - struct _Unwind_Context *); -_Unwind_Ptr _Unwind_GetRegionStart(struct _Unwind_Context *); -_Unwind_Ptr _Unwind_GetTextRelBase(struct _Unwind_Context *); -_Unwind_Reason_Code _Unwind_RaiseException(struct _Unwind_Exception *); -void _Unwind_Resume(struct _Unwind_Exception *); -_Unwind_Reason_Code _Unwind_Resume_or_Rethrow(struct _Unwind_Exception *); -void _Unwind_SetGR(struct _Unwind_Context *, int, - _Unwind_Ptr); -void _Unwind_SetIP(struct _Unwind_Context *, _Unwind_Ptr); -__END_DECLS -#endif /* _UNWIND_H_ */ Index: head/contrib/libexecinfo/symtab.c =================================================================== --- head/contrib/libexecinfo/symtab.c (revision 354111) +++ head/contrib/libexecinfo/symtab.c (revision 354112) @@ -1,193 +1,225 @@ -/* $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. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation * by Christos Zoulas. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include -__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 #include #include #include +#include #include #include #include #include #ifndef ELF_ST_BIND #define ELF_ST_BIND(x) ((x) >> 4) #endif #ifndef ELF_ST_TYPE #define ELF_ST_TYPE(x) (((unsigned int)x) & 0xf) #endif - #include "symtab.h" struct symbol { char *st_name; uintptr_t st_value; uintptr_t st_info; }; struct symtab { size_t nsymbols; struct symbol *symbols; + bool ispie; }; static int address_compare(const void *a, const void *b) { const struct symbol *sa = a; const struct symbol *sb = b; return (int)(intmax_t)(sa->st_value - sb->st_value); } void symtab_destroy(symtab_t *s) { if (s == NULL) return; for (size_t i = 0; i < s->nsymbols; i++) free(s->symbols[i].st_name); free(s->symbols); free(s); } symtab_t * 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."); return NULL; } elf = elf_begin(fd, ELF_C_READ, NULL); if (elf == NULL) { warnx("Error opening elf file: %s", elf_errmsg(elf_errno())); return NULL; } st = calloc(1, sizeof(*st)); if (st == NULL) { warnx("Error allocating symbol table"); 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; size_t ns; struct symbol *s; gelf_getshdr(scn, &shdr); if(shdr.sh_type != SHT_SYMTAB) continue; edata = elf_getdata(scn, NULL); ns = shdr.sh_size / shdr.sh_entsize; s = calloc(ns, sizeof(*s)); if (s == NULL) { warn("Cannot allocate %zu symbols", ns); goto out; } st->symbols = s; for (size_t i = 0; i < ns; i++) { 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; if (type != -1 && (unsigned)type != ELF_ST_TYPE(sym.st_info)) continue; s->st_value = sym.st_value; s->st_info = sym.st_info; s->st_name = strdup( elf_strptr(elf, shdr.sh_link, sym.st_name)); if (s->st_name == NULL) goto out; s++; } st->nsymbols = s - st->symbols; if (st->nsymbols == 0) { warnx("No symbols found"); goto out; } qsort(st->symbols, st->nsymbols, sizeof(*st->symbols), address_compare); elf_end(elf); return st; } out: symtab_destroy(st); elf_end(elf); return NULL; } - + int symtab_find(const symtab_t *st, const void *p, Dl_info *dli) { struct symbol *s = st->symbols; size_t ns = st->nsymbols; 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; else if (s[mid].st_value > me) hi = mid; else break; if (hi - lo == 1) { mid = lo; break; } 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; } Index: head/contrib/libexecinfo/unwind.c =================================================================== --- head/contrib/libexecinfo/unwind.c (revision 354111) +++ head/contrib/libexecinfo/unwind.c (revision 354112) @@ -1,72 +1,74 @@ -/* $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. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation * by Christos Zoulas. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "unwind.h" #include "execinfo.h" struct tracer_context { void **arr; size_t len; size_t n; }; static _Unwind_Reason_Code tracer(struct _Unwind_Context *ctx, void *arg) { struct tracer_context *t = arg; if (t->n == (size_t)~0) { /* Skip backtrace frame */ t->n = 0; 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 backtrace(void **arr, size_t len) { struct tracer_context ctx; ctx.arr = arr; ctx.len = len; ctx.n = (size_t)~0; _Unwind_Backtrace(tracer, &ctx); if (ctx.n != (size_t)~0 && ctx.n > 0) ctx.arr[--ctx.n] = NULL; /* Skip frame below __start */ return ctx.n; } Index: head/lib/libexecinfo/Makefile =================================================================== --- head/lib/libexecinfo/Makefile (revision 354111) +++ head/lib/libexecinfo/Makefile (revision 354112) @@ -1,23 +1,24 @@ # $FreeBSD$ PACKAGE=lib${LIB} LIBEXECINFO= ${SRCTOP}/contrib/libexecinfo LIB= execinfo SHLIB_MAJOR= 1 .PATH: ${LIBEXECINFO} INCS= execinfo.h SRCS= backtrace.c symtab.c unwind.c +CFLAGS+= -I${SRCTOP}/contrib/libunwind/include LIBADD= elf MAN= backtrace.3 MLINKS+= backtrace.3 backtrace_symbols.3 MLINKS+= backtrace.3 backtrace_symbols_fmt.3 MLINKS+= backtrace.3 backtrace_symbols_fd.3 MLINKS+= backtrace.3 backtrace_symbols_fd_fmt.3 .include