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;
+}

Reply via email to