Compare commits

..

No commits in common. "rawhide" and "f35" have entirely different histories.
rawhide ... f35

7 changed files with 22 additions and 491 deletions

1
.gitignore vendored
View File

@ -1,2 +1 @@
/libunwind-*.tar.gz
/v1.7.0-rc2.tar.gz

View File

@ -1,355 +0,0 @@
From cf6b9aadd60a85107afe5196251ca2ed198a96d0 Mon Sep 17 00:00:00 2001
From: Daniel Moody <daniel.moody@mongodb.com>
Date: Fri, 18 Feb 2022 14:24:37 -0600
Subject: [PATCH] Updated to determine PAGE_SIZE dynamically.
---
include/libunwind_i.h | 9 +++++++++
src/aarch64/Ginit.c | 19 ++++++++-----------
src/arm/Ginit.c | 13 ++-----------
src/mi/init.c | 28 ++++++++++++++++++++++++++--
src/riscv/Ginit.c | 22 ++++++++--------------
src/s390x/Ginit.c | 25 ++++++++++---------------
src/x86/Ginit.c | 13 ++-----------
src/x86_64/Ginit.c | 18 +++++-------------
8 files changed, 70 insertions(+), 77 deletions(-)
diff --git a/include/libunwind_i.h b/include/libunwind_i.h
index 6c7dda9a8..bcf229566 100644
--- a/include/libunwind_i.h
+++ b/include/libunwind_i.h
@@ -55,6 +55,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
+#include <errno.h>
+#include <stdio.h>
#if defined(HAVE_ELF_H)
# include <elf.h>
@@ -288,6 +290,13 @@ print_error (const char *string)
return write (2, string, strlen (string));
}
+HIDDEN extern long unw_page_size;
+
+static inline unw_word_t uwn_page_start(unw_word_t addr)
+{
+ return addr & ~(unw_page_size - 1);
+}
+
#define mi_init UNWI_ARCH_OBJ(mi_init)
extern void mi_init (void); /* machine-independent initializations */
diff --git a/src/aarch64/Ginit.c b/src/aarch64/Ginit.c
index 2b08feb36..fe6e511df 100644
--- a/src/aarch64/Ginit.c
+++ b/src/aarch64/Ginit.c
@@ -84,8 +84,6 @@ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
return 0;
}
-#define PAGE_SIZE 4096
-#define PAGE_START(a) ((a) & ~(PAGE_SIZE-1))
static int mem_validate_pipe[2] = {-1, -1};
@@ -197,11 +195,14 @@ tdep_init_mem_validate (void)
#ifdef HAVE_MINCORE
unsigned char present = 1;
- unw_word_t addr = PAGE_START((unw_word_t)&present);
+ size_t len = unw_page_size;
+ unw_word_t addr = uwn_page_start((unw_word_t)&present);
unsigned char mvec[1];
int ret;
- while ((ret = mincore ((void*)addr, PAGE_SIZE, (unsigned char *)mvec)) == -1 &&
- errno == EAGAIN) {}
+ while ((ret = mincore((void *)addr, len, (unsigned char *)mvec)) == -1 &&
+ errno == EAGAIN)
+ {
+ }
if (ret == 0)
{
Debug(1, "using mincore to validate memory\n");
@@ -295,12 +296,8 @@ validate_mem (unw_word_t addr)
{
size_t len;
- if (PAGE_START(addr + sizeof (unw_word_t) - 1) == PAGE_START(addr))
- len = PAGE_SIZE;
- else
- len = PAGE_SIZE * 2;
-
- addr = PAGE_START(addr);
+ len = unw_page_size;
+ addr = uwn_page_start(addr);
if (addr == 0)
return -1;
diff --git a/src/arm/Ginit.c b/src/arm/Ginit.c
index 0bac0d72d..bce52dc34 100644
--- a/src/arm/Ginit.c
+++ b/src/arm/Ginit.c
@@ -71,9 +71,6 @@ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
return 0;
}
-#define PAGE_SIZE 4096
-#define PAGE_START(a) ((a) & ~(PAGE_SIZE-1))
-
/* Cache of already validated addresses */
#define NLGA 4
static unw_word_t last_good_addr[NLGA];
@@ -83,14 +80,8 @@ static int
validate_mem (unw_word_t addr)
{
int i, victim;
- size_t len;
-
- if (PAGE_START(addr + sizeof (unw_word_t) - 1) == PAGE_START(addr))
- len = PAGE_SIZE;
- else
- len = PAGE_SIZE * 2;
-
- addr = PAGE_START(addr);
+ size_t len = unw_page_size;
+ addr = uwn_page_start(addr);
if (addr == 0)
return -1;
diff --git a/src/mi/init.c b/src/mi/init.c
index 60a48c589..aa9319981 100644
--- a/src/mi/init.c
+++ b/src/mi/init.c
@@ -39,6 +39,30 @@ static const char rcsid[] UNUSED =
long unwi_debug_level;
#endif /* UNW_DEBUG */
+long unw_page_size;
+static void
+unw_init_page_size ()
+{
+ errno = 0;
+ long result = sysconf (_SC_PAGESIZE);
+ if (result == -1)
+ {
+ if (errno != 0)
+ {
+ print_error ("Failed to get _SC_PAGESIZE: ");
+ print_error (strerror(errno));
+ print_error ("\n");
+ }
+ else
+ print_error ("Failed to get _SC_PAGESIZE, errno was not set.\n");
+
+ unw_page_size = 4096;
+ }
+ else
+ {
+ unw_page_size = result;
+ }
+}
HIDDEN void
mi_init (void)
@@ -55,6 +79,6 @@ mi_init (void)
setbuf (stderr, NULL);
}
#endif
-
- assert (sizeof (struct cursor) <= sizeof (unw_cursor_t));
+ unw_init_page_size();
+ assert(sizeof(struct cursor) <= sizeof(unw_cursor_t));
}
diff --git a/src/riscv/Ginit.c b/src/riscv/Ginit.c
index 907f72962..4faeecbfd 100644
--- a/src/riscv/Ginit.c
+++ b/src/riscv/Ginit.c
@@ -97,9 +97,6 @@ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
// Memory validation routines are from aarch64
-#define PAGE_SIZE 4096
-#define PAGE_START(a) ((a) & ~(PAGE_SIZE-1))
-
static int mem_validate_pipe[2] = {-1, -1};
#ifdef HAVE_PIPE2
@@ -210,11 +207,14 @@ tdep_init_mem_validate (void)
#ifdef HAVE_MINCORE
unsigned char present = 1;
- unw_word_t addr = PAGE_START((unw_word_t)&present);
+ size_t len = unw_page_size;
+ unw_word_t addr = uwn_page_start((unw_word_t)&present);
unsigned char mvec[1];
int ret;
- while ((ret = mincore ((void*)addr, PAGE_SIZE, (unsigned char *)mvec)) == -1 &&
- errno == EAGAIN) {}
+ while ((ret = mincore((void *)addr, len, (unsigned char *)mvec)) == -1 &&
+ errno == EAGAIN)
+ {
+ }
if (ret == 0)
{
Debug(1, "using mincore to validate memory\n");
@@ -306,14 +306,8 @@ cache_valid_mem(unw_word_t addr)
static int
validate_mem (unw_word_t addr)
{
- size_t len;
-
- if (PAGE_START(addr + sizeof (unw_word_t) - 1) == PAGE_START(addr))
- len = PAGE_SIZE;
- else
- len = PAGE_SIZE * 2;
-
- addr = PAGE_START(addr);
+ size_t len = unw_page_size;
+ addr = uwn_page_start(addr);
if (addr == 0)
return -1;
diff --git a/src/s390x/Ginit.c b/src/s390x/Ginit.c
index db01743c0..2bce2f4b6 100644
--- a/src/s390x/Ginit.c
+++ b/src/s390x/Ginit.c
@@ -27,6 +27,7 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+#include "libunwind_i.h"
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
@@ -93,9 +94,6 @@ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
return 0;
}
-#define PAGE_SIZE 4096
-#define PAGE_START(a) ((a) & ~(PAGE_SIZE-1))
-
static int mem_validate_pipe[2] = {-1, -1};
static inline void
@@ -163,7 +161,7 @@ static int mincore_validate (void *addr, size_t len)
return -1;
}
- for (i = 0; i < (len + PAGE_SIZE - 1) / PAGE_SIZE; i++)
+ for (i = 0; i < (len + unw_page_size - 1) / unw_page_size; i++)
{
if (!(mvec[i] & 1)) return -1;
}
@@ -183,11 +181,14 @@ tdep_init_mem_validate (void)
#ifdef HAVE_MINCORE
unsigned char present = 1;
- unw_word_t addr = PAGE_START((unw_word_t)&present);
+ size_t len = unw_page_size;
+ unw_word_t addr = uwn_page_start((unw_word_t)&present);
unsigned char mvec[1];
int ret;
- while ((ret = mincore ((void*)addr, PAGE_SIZE, mvec)) == -1 &&
- errno == EAGAIN) {}
+ while ((ret = mincore((void *)addr, len, mvec)) == -1 &&
+ errno == EAGAIN)
+ {
+ }
if (ret == 0 && (mvec[0] & 1))
{
Debug(1, "using mincore to validate memory\n");
@@ -210,14 +211,8 @@ static int
validate_mem (unw_word_t addr)
{
int i, victim;
- size_t len;
-
- if (PAGE_START(addr + sizeof (unw_word_t) - 1) == PAGE_START(addr))
- len = PAGE_SIZE;
- else
- len = PAGE_SIZE * 2;
-
- addr = PAGE_START(addr);
+ size_t len = unw_page_size;
+ addr = uwn_page_start(addr);
if (addr == 0)
return -1;
diff --git a/src/x86/Ginit.c b/src/x86/Ginit.c
index 3cec74a21..4261fb523 100644
--- a/src/x86/Ginit.c
+++ b/src/x86/Ginit.c
@@ -74,9 +74,6 @@ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
return 0;
}
-#define PAGE_SIZE 4096
-#define PAGE_START(a) ((a) & ~(PAGE_SIZE-1))
-
/* Cache of already validated addresses */
#define NLGA 4
static unw_word_t last_good_addr[NLGA];
@@ -89,14 +86,8 @@ validate_mem (unw_word_t addr)
#ifdef HAVE_MINCORE
unsigned char mvec[2]; /* Unaligned access may cross page boundary */
#endif
- size_t len;
-
- if (PAGE_START(addr + sizeof (unw_word_t) - 1) == PAGE_START(addr))
- len = PAGE_SIZE;
- else
- len = PAGE_SIZE * 2;
-
- addr = PAGE_START(addr);
+ size_t len = unw_page_size;
+ addr = uwn_page_start(addr);
if (addr == 0)
return -1;
diff --git a/src/x86_64/Ginit.c b/src/x86_64/Ginit.c
index 0b121bc91..e75f92a5f 100644
--- a/src/x86_64/Ginit.c
+++ b/src/x86_64/Ginit.c
@@ -73,9 +73,6 @@ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
return 0;
}
-#define PAGE_SIZE 4096
-#define PAGE_START(a) ((a) & ~(PAGE_SIZE-1))
-
static int mem_validate_pipe[2] = {-1, -1};
#ifdef HAVE_PIPE2
@@ -191,10 +188,11 @@ tdep_init_mem_validate (void)
#ifdef HAVE_MINCORE
unsigned char present = 1;
- unw_word_t addr = PAGE_START((unw_word_t)&present);
+ size_t len = unw_page_size;
+ unw_word_t addr = uwn_page_start((unw_word_t)&present);
unsigned char mvec[1];
int ret;
- while ((ret = mincore ((void*)addr, PAGE_SIZE, (unsigned char *)mvec)) == -1 &&
+ while ((ret = mincore ((void*)addr, len, (unsigned char *)mvec)) == -1 &&
errno == EAGAIN) {}
if (ret == 0)
{
@@ -287,14 +285,8 @@ cache_valid_mem(unw_word_t addr)
static int
validate_mem (unw_word_t addr)
{
- size_t len;
-
- if (PAGE_START(addr + sizeof (unw_word_t) - 1) == PAGE_START(addr))
- len = PAGE_SIZE;
- else
- len = PAGE_SIZE * 2;
-
- addr = PAGE_START(addr);
+ size_t len = unw_page_size;
+ addr = uwn_page_start(addr);
if (addr == 0)
return -1;

View File

@ -1,15 +1,15 @@
diff -up libunwind-1.6.2/src/arm/Gglobal.c.default-to-exidx libunwind-1.6.2/src/arm/Gglobal.c
--- libunwind-1.6.2/src/arm/Gglobal.c.default-to-exidx 2021-12-20 12:06:56.067313075 -0500
+++ libunwind-1.6.2/src/arm/Gglobal.c 2021-12-20 12:08:43.063060309 -0500
@@ -33,7 +33,10 @@ HIDDEN atomic_bool tdep_init_done = 0;
/* Android only supports three types of unwinding methods. */
HIDDEN int unwi_unwind_method = UNW_ARM_METHOD_DWARF | UNW_ARM_METHOD_EXIDX | UNW_ARM_METHOD_LR;
#else
diff -up libunwind-1.1/src/arm/Gglobal.c.default-to-exidx libunwind-1.1/src/arm/Gglobal.c
--- libunwind-1.1/src/arm/Gglobal.c.default-to-exidx 2015-06-02 10:38:39.733587918 -0400
+++ libunwind-1.1/src/arm/Gglobal.c 2015-06-02 10:38:53.086500142 -0400
@@ -29,7 +29,10 @@ HIDDEN define_lock (arm_lock);
HIDDEN int tdep_init_done;
/* Unwinding methods to use. See UNW_METHOD_ enums */
-HIDDEN int unwi_unwind_method = UNW_ARM_METHOD_ALL;
+/* UNW_ARM_METHOD_ALL starts with UNW_ARM_METHOD_DWARF */
+/* which is never right on Fedora ARM. Default instead */
+/* to UNW_ARM_METHOD_EXIDX. */
+HIDDEN int unwi_unwind_method = UNW_ARM_METHOD_EXIDX;
#endif
HIDDEN void
tdep_init (void)

View File

@ -1,25 +0,0 @@
This patch disables building of the (effectively empty)
dl-iterate-phdr.c source file. Symbols generated by annobin confuse
the run-check-namespace test because nm -g prints hidden weak symbols
in DSOs (they are considered external):
ERROR: Extraneous symbols:
000000000000de51 W dl_iterate_phdr.c.a8d8d212
ERROR: Extraneous symbols:
00000000000120b0 W dl_iterate_phdr.c.a8d8d212
This patch is downstream-specific due to annobin.
diff --git a/src/Makefile.am b/src/Makefile.am
index 2b5b02959e99eb8f..e5ff21515c36d30f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -147,7 +147,7 @@ libunwind_la_SOURCES_local = \
$(libunwind_la_SOURCES_local_unwind)
noinst_HEADERS += os-linux.h
-libunwind_la_SOURCES_os_linux = os-linux.c dl-iterate-phdr.c
+libunwind_la_SOURCES_os_linux = os-linux.c
libunwind_la_SOURCES_os_hpux = os-hpux.c

View File

@ -1,20 +0,0 @@
This is needed because under mock (especially with a systemd-coredump
handler on the system), no core files are created.
Submitted upstream: https://github.com/libunwind/libunwind/pull/418
diff --git a/tests/run-coredump-unwind b/tests/run-coredump-unwind
index 8d07742574602328..0c2b28c942477f7d 100755
--- a/tests/run-coredump-unwind
+++ b/tests/run-coredump-unwind
@@ -48,6 +48,10 @@ fi
./crasher backing_files
) 2>/dev/null
COREFILE=$TEMPDIR/core*
+if ! test -f "$COREFILE"; then
+ echo "crasher process did not produce coredump, test skipped"
+ exit 77
+fi
# magic option -testcase enables checking for the specific contents of the stack
./test-coredump-unwind $COREFILE -testcase `cat $TEMPDIR/backing_files`

View File

@ -1,68 +1,23 @@
# The testsuite does not pass on all targets.
#
# aarch64
# Gtest-exc
# Ltest-exc
# Gtest-trace
# Ltest-trace
# Ltest-init-local-signal
# Ltest-mem-validate: https://github.com/libunwind/libunwind/issues/388
# test-reg-state
# Ltest-varargs
# Lrs-race
# test-ptrace
# run-check-namespace: https://github.com/libunwind/libunwind/issues/389
# run-ptrace-mapper
# run-ptrace-misc
# i686
# Ltest-mem-validate: https://github.com/libunwind/libunwind/issues/391
# test-async-sig
# test-ptrace
# ppc64le
# Gtest-exc
# Ltest-exc
# Gtest-resume-sig
# Ltest-resume-sig
# Gtest-resume-sig-rt
# Ltest-resume-sig-rt
# test-ptrace
# run-check-namespace
# run-ptrace-mapper
# run-ptrace-misc
#
# s390x
# Gtest-resume-sig-rt
# Ltest-resume-sig-rt
# test-ptrace
%ifarch aarch64 i686 ppc64le s390x
%global test_failure_override true
%else
%global test_failure_override false
%endif
%global prerel rc2
# rpmbuild parameters:
# --without check: Do not run the testsuite. Default is to run it.
Summary: An unwinding library
Name: libunwind
Version: 1.7.0
Release: 0.1.%{prerel}%{?dist}
Version: 1.5.0
Release: 1%{?dist}
License: BSD
URL: http://savannah.nongnu.org/projects/libunwind
Source: https://github.com/libunwind/libunwind/archive/refs/tags/v%{version}-%{prerel}.tar.gz
# http://download-mirror.savannah.gnu.org/releases/libunwind/libunwind-%%{version}.tar.gz
Source: http://download-mirror.savannah.gnu.org/releases/libunwind/libunwind-%{version}.tar.gz
#Fedora specific patch
Patch1: libunwind-arm-default-to-exidx.patch
# Make libunwind.h multilib friendly
Patch2: libunwind-1.3.1-multilib-fix.patch
Patch5: libunwind-no-dl-iterate-phdr.patch
ExclusiveArch: %{arm} aarch64 hppa ia64 mips ppc %{power64} s390x %{ix86} x86_64
BuildRequires: automake libtool autoconf texlive-latex2man
BuildRequires: make
BuildRequires: gcc-c++
# host != target would cause REMOTE_ONLY build even if building i386 on x86_64.
%global _host %{_target_platform}
@ -79,7 +34,9 @@ The libunwind-devel package includes the libraries and header files for
libunwind.
%prep
%autosetup -p1 -n %{name}-%{version}-%{prerel}
%setup -q
%patch1 -p1 -b .default-to-exidx
%patch2 -p1 -b .multilib-fix
%build
%global optflags %{optflags} -fcommon
@ -107,13 +64,13 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/libunwind-ptrace*.so*
touch -r NEWS $RPM_BUILD_ROOT%{_includedir}/libunwind.h
%check
%if 0%{?_with_check:1} || 0%{?_with_testsuite:1}
echo ====================TESTING=========================
if ! make check ; then
echo ====================FAILED TESTS=====================
cat tests/test-suite.log || true
%{test_failure_override}
fi
make check || true
echo ====================TESTING END=====================
%else
echo ====================TESTSUITE DISABLED=========================
%endif
%ldconfig_scriptlets
@ -132,31 +89,6 @@ echo ====================TESTING END=====================
%{_includedir}/libunwind*.h
%changelog
* Mon Feb 20 2023 Tom Callaway <spot@fedoraproject.org> - 1.7.0-0.1.rc2
- update to 1.7.0-rc2
- disable tests on s390x (reported upstream: https://github.com/libunwind/libunwind/issues/464)
* Thu Jan 19 2023 Fedora Release Engineering <releng@fedoraproject.org> - 1.6.2-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
* Wed Sep 7 2022 Florian Weimer <fweimer@redhat.com> - 1.6.2-5
- Run the testsuite during build
* Wed Sep 7 2022 Florian Weimer <fweimer@redhat.com> - 1.6.2-4
- Enable %%autosetup to apply all patches (#2118019)
* Sun Aug 28 2022 Leif Liddy <leif.liddy@gmail.com> - 1.6.2-3
- enable dynamic page size support (bz2118019)
* Thu Jul 21 2022 Fedora Release Engineering <releng@fedoraproject.org> - 1.6.2-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
* Thu Jan 20 2022 Fedora Release Engineering <releng@fedoraproject.org> - 1.6.2-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
* Mon Dec 20 2021 Tom Callaway <spot@fedoraproject.org> - 1.6.2-1
- update to 1.6.2
* Wed Jul 21 2021 Tom Callaway <spot@fedoraproject.org> - 1.5.0-1
- update to 1.5.0

View File

@ -1 +1 @@
SHA512 (v1.7.0-rc2.tar.gz) = 09920dffd7ab7eb18c3ec5ed3cbb78cc66e7456e465d7454c48d2d9d015e76d2ee78af42b34ccd85f4a15a2d61b1da461dcee12adadcfcf1ae4af3a2ecc59df3
SHA512 (libunwind-1.5.0.tar.gz) = 1df20ca7a8cee2f2e61294fa9b677e88fec52e9d5a329f88d05c2671c69fa462f6c18808c97ca9ff664ef57292537a844f00b18d142b1938c9da701ca95a4bab