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