Module Name: src Committed By: skrll Date: Sat Jun 25 06:51:37 UTC 2022
Modified Files: src/lib/libexecinfo: Makefile backtrace.c symtab.c Added Files: src/lib/libexecinfo: symbol.h symbol_hppa.c Log Message: Decode function descriptors (aka plabels) on hppa to fix backtrace. PR/56881: hppa: backtrace_symbols() delivers bogus results for some dynloaded functions To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 src/lib/libexecinfo/Makefile cvs rdiff -u -r1.7 -r1.8 src/lib/libexecinfo/backtrace.c cvs rdiff -u -r0 -r1.1 src/lib/libexecinfo/symbol.h \ src/lib/libexecinfo/symbol_hppa.c cvs rdiff -u -r1.8 -r1.9 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/Makefile diff -u src/lib/libexecinfo/Makefile:1.9 src/lib/libexecinfo/Makefile:1.10 --- src/lib/libexecinfo/Makefile:1.9 Wed Jan 22 15:10:32 2020 +++ src/lib/libexecinfo/Makefile Sat Jun 25 06:51:37 2022 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.9 2020/01/22 15:10:32 mgorny Exp $ +# $NetBSD: Makefile,v 1.10 2022/06/25 06:51:37 skrll Exp $ .include <bsd.own.mk> @@ -27,6 +27,10 @@ SRCS+=unwind_arm_ehabi_stub.c SRCS+=builtin.c .endif +.if exists(${.CURDIR}/symbol_${LIBEXECINFO_MACHINE_ARCH}.c) +SRCS+=symbol_${LIBEXECINFO_MACHINE_ARCH}.c +.endif + MLINKS+= backtrace.3 backtrace_symbols.3 MLINKS+= backtrace.3 backtrace_symbols_fmt.3 MLINKS+= backtrace.3 backtrace_symbols_fd.3 Index: src/lib/libexecinfo/backtrace.c diff -u src/lib/libexecinfo/backtrace.c:1.7 src/lib/libexecinfo/backtrace.c:1.8 --- src/lib/libexecinfo/backtrace.c:1.7 Thu Jun 23 09:48:00 2022 +++ src/lib/libexecinfo/backtrace.c Sat Jun 25 06:51:37 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: backtrace.c,v 1.7 2022/06/23 09:48:00 skrll Exp $ */ +/* $NetBSD: backtrace.c,v 1.8 2022/06/25 06:51:37 skrll Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -29,7 +29,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__RCSID("$NetBSD: backtrace.c,v 1.7 2022/06/23 09:48:00 skrll Exp $"); +__RCSID("$NetBSD: backtrace.c,v 1.8 2022/06/25 06:51:37 skrll Exp $"); #include <sys/param.h> #include <assert.h> @@ -45,6 +45,7 @@ __RCSID("$NetBSD: backtrace.c,v 1.7 2022 #include <elf.h> #include "execinfo.h" +#include "symbol.h" #include "symtab.h" #ifdef __linux__ @@ -114,7 +115,8 @@ static ssize_t format_string(char **buf, size_t *bufsiz, size_t offs, const char *fmt, Dl_info *dli, const void *addr) { - ptrdiff_t diff = (const char *)addr - (const char *)dli->dli_saddr; + const uintptr_t symaddr = SYMBOL_CANONICALIZE(dli->dli_saddr); + ptrdiff_t diff = (const char *)addr - (const char *)symaddr; size_t o = offs; int len; Index: src/lib/libexecinfo/symtab.c diff -u src/lib/libexecinfo/symtab.c:1.8 src/lib/libexecinfo/symtab.c:1.9 --- src/lib/libexecinfo/symtab.c:1.8 Thu Jun 23 09:58:25 2022 +++ src/lib/libexecinfo/symtab.c Sat Jun 25 06:51:37 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: symtab.c,v 1.8 2022/06/23 09:58:25 skrll Exp $ */ +/* $NetBSD: symtab.c,v 1.9 2022/06/25 06:51:37 skrll 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.8 2022/06/23 09:58:25 skrll Exp $"); +__RCSID("$NetBSD: symtab.c,v 1.9 2022/06/25 06:51:37 skrll Exp $"); #include <stdlib.h> #include <stdio.h> @@ -48,6 +48,7 @@ __RCSID("$NetBSD: symtab.c,v 1.8 2022/06 #define ELF_ST_TYPE(x) (((unsigned int)x) & 0xf) #endif +#include "symbol.h" #include "symtab.h" #ifdef SYMTAB_DEBUG @@ -192,11 +193,12 @@ symtab_find(const symtab_t *st, const vo size_t mid = ns / 2; 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; + uintptr_t sa = SYMBOL_CANONICALIZE(dli->dli_saddr); + uintptr_t ad = sa - fbase; - DPRINTF("[fbase=%#jx, saddr=%p, me=%#jx ad=%#jx]", - (uintmax_t)fbase, dli->dli_saddr, - (uintmax_t)me, (uintmax_t)ad); + DPRINTF("[fbase=%#jx, saddr=%p, sa=%#jx, me=%#jx ad=%#jx]", + (uintmax_t)fbase, dli->dli_saddr, (uintmax_t)sa, + (uintmax_t)me, (uintmax_t)ad); for (;;) { if (s[mid].st_value < me) Added files: Index: src/lib/libexecinfo/symbol.h diff -u /dev/null src/lib/libexecinfo/symbol.h:1.1 --- /dev/null Sat Jun 25 06:51:37 2022 +++ src/lib/libexecinfo/symbol.h Sat Jun 25 06:51:37 2022 @@ -0,0 +1,49 @@ +/* $NetBSD: symbol.h,v 1.1 2022/06/25 06:51:37 skrll Exp $ */ + +/*- + * Copyright (c) 2022 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Nick Hudson. + * + * 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 _SYMBOL_H_ +#define _SYMBOL_H_ + +#include <sys/param.h> +#include <stdint.h> + +__BEGIN_DECLS + +#if defined(__HAVE_FUNCTION_DESCRIPTORS) +uintptr_t symbol_canonicalize_md(const void *); +#define SYMBOL_CANONICALIZE(x) symbol_canonicalize_md(x) +#else +#define SYMBOL_CANONICALIZE(x) ((uintptr_t)(x)) +#endif + +__END_DECLS + +#endif /* _SYMBOL_H_ */ Index: src/lib/libexecinfo/symbol_hppa.c diff -u /dev/null src/lib/libexecinfo/symbol_hppa.c:1.1 --- /dev/null Sat Jun 25 06:51:37 2022 +++ src/lib/libexecinfo/symbol_hppa.c Sat Jun 25 06:51:37 2022 @@ -0,0 +1,51 @@ +/* $NetBSD: symbol_hppa.c,v 1.1 2022/06/25 06:51:37 skrll Exp $ */ + +/*- + * Copyright (c) 2022 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Nick Hudson. + * + * 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 <sys/cdefs.h> +__RCSID("$NetBSD: symbol_hppa.c,v 1.1 2022/06/25 06:51:37 skrll Exp $"); + +#include "symbol.h" + +#define HPPA_IS_PLABEL(addr) (((uintptr_t)(addr)) & (1 << 1)) +#define HPPA_GET_PLABEL(addr) ((hppa_plabel *) (((uintptr_t)addr) & ~3)) + +typedef struct { + uintptr_t pl_pc; + uintptr_t pl_sl; +} hppa_plabel; + + +uintptr_t +symbol_canonicalize_md(const void *addr) +{ + return HPPA_IS_PLABEL(addr) ? + HPPA_GET_PLABEL(addr)->pl_pc : (uintptr_t)addr; +}