diff mbox series

[v2,4/4] libunwind: fix the build with GCC 15

Message ID 20250425114322.718562-4-ross.burton@arm.com
State Accepted, archived
Commit cdae3b07ac4b5e59e33d96c1da9c5dda53de9d04
Headers show
Series [v2,1/4] libunwind: refresh ppc32/musl patch | expand

Commit Message

Ross Burton April 25, 2025, 11:43 a.m. UTC
Backport a patch from upstream to fix the build when GCC 15 is used.

Signed-off-by: Ross Burton <ross.burton@arm.com>
---
 .../libunwind/libunwind/malloc.patch          | 255 ++++++++++++++++++
 .../libunwind/libunwind_1.8.1.bb              |   1 +
 2 files changed, 256 insertions(+)
 create mode 100644 meta/recipes-support/libunwind/libunwind/malloc.patch

Comments

Martin Jansa April 25, 2025, 7:36 p.m. UTC | #1
Acked-by: Martin Jansa <martin.jansa@gmail.com>

Thank you.

On Fri, Apr 25, 2025 at 1:43 PM Ross Burton via lists.openembedded.org
<ross.burton=arm.com@lists.openembedded.org> wrote:
>
> Backport a patch from upstream to fix the build when GCC 15 is used.
>
> Signed-off-by: Ross Burton <ross.burton@arm.com>
> ---
>  .../libunwind/libunwind/malloc.patch          | 255 ++++++++++++++++++
>  .../libunwind/libunwind_1.8.1.bb              |   1 +
>  2 files changed, 256 insertions(+)
>  create mode 100644 meta/recipes-support/libunwind/libunwind/malloc.patch
>
> diff --git a/meta/recipes-support/libunwind/libunwind/malloc.patch b/meta/recipes-support/libunwind/libunwind/malloc.patch
> new file mode 100644
> index 00000000000..026a56f1559
> --- /dev/null
> +++ b/meta/recipes-support/libunwind/libunwind/malloc.patch
> @@ -0,0 +1,255 @@
> +From b67d508a93bf1ba231c18dce3894cfee25c16e0d Mon Sep 17 00:00:00 2001
> +From: Stephen Webb <swebb@blackberry.com>
> +Date: Wed, 12 Feb 2025 12:08:07 -0500
> +Subject: [PATCH] Fix bad prototype for malloc() in test
> +
> +The unit test Gtest-nomalloc.c had an incorrect prototype for malloc()
> +which caused newer compilers to fail compiling for newer C editions.
> +
> +Corrected the prototype and corrected a few other errors. The unit now
> +compiles using GCC with `CFLAGS=-Wall -Wextra -pedantic -C11` with no
> +warnings, which is the minimum requirement.
> +
> +Added the tests/unw_test.h header as a first step to cleaning up some
> +unit tests further.
> +
> +Upstream-Status: Backport [https://github.com/libunwind/libunwind/commit/b67d508]]
> +Signed-off-by: Ross Burton <ross.burton@arm.com>
> +---
> + tests/Gtest-nomalloc.c | 124 +++++++++++++++++++++++------------------
> + tests/Makefile.am      |   2 +-
> + tests/unw_test.h       |  47 ++++++++++++++++
> + 3 files changed, 117 insertions(+), 56 deletions(-)
> + create mode 100644 tests/unw_test.h
> +
> +diff --git a/tests/Gtest-nomalloc.c b/tests/Gtest-nomalloc.c
> +index 5b97fc709..e770ff614 100644
> +--- a/tests/Gtest-nomalloc.c
> ++++ b/tests/Gtest-nomalloc.c
> +@@ -1,78 +1,92 @@
> +-/* libunwind - a platform-independent unwind library
> +-   Copyright (C) 2009 Google, Inc
> +-      Contributed by Arun Sharma <arun.sharma@google.com>
> ++/**
> ++ * @file tests/Gtest-nomalloc.c
> ++ *
> ++ * Verify that @c malloc() is not called during an unwinding operation.
> ++ */
> ++/*
> ++ * This file is part of libunwind.
> ++ *   Copyright 2025 Stephen M. Webb <stephen.webb@bregmasoft.ca>
> ++ *   Copyright (C) 2009 Google, Inc
> ++ *   Contributed by Arun Sharma <arun.sharma@google.com>
> ++ *
> ++ * Permission is hereby granted, free of charge, to any person obtaining a copy
> ++ * of this software and associated documentation files (the "Software"), to
> ++ * deal in the Software without restriction, including without limitation the
> ++ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
> ++ * sell copies of the Software, and to permit persons to whom the Software is
> ++ * furnished to do so, subject to the following conditions:
> ++ *
> ++ * The above copyright notice and this permission notice shall be included in
> ++ * all copies or substantial portions of the Software.
> ++ *
> ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> ++ * AUTHORS OR COPYRIGHT HOLDERS BE 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.
> ++ */
> +
> +-Permission is hereby granted, free of charge, to any person obtaining
> +-a copy of this software and associated documentation files (the
> +-"Software"), to deal in the Software without restriction, including
> +-without limitation the rights to use, copy, modify, merge, publish,
> +-distribute, sublicense, and/or sell copies of the Software, and to
> +-permit persons to whom the Software is furnished to do so, subject to
> +-the following conditions:
> +-
> +-The above copyright notice and this permission notice shall be
> +-included in all copies or substantial portions of the Software.
> +-
> +-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> +-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> +-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
> +-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
> +-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 <unistd.h>
> +-#include <stdio.h>
> +-#include <stdlib.h>
> + #include <dlfcn.h>
> + #include <libunwind.h>
> ++#include <stdio.h>
> ++#include <stdlib.h>
> ++#include <unistd.h>
> +
> +-#define panic(args...)                                \
> +-      { fprintf (stderr, args); exit (-1); }
> ++#include "unw_test.h"
> +
> +-int verbose;
> +-int num_errors;
> ++int malloc_call_count;
> + int in_unwind;
> +
> ++/**
> ++ * Intercepted malloc() call.
> ++ *
> ++ * If invoked during unwinding this call will increment the test error count
> ++ * and indicate a failure by returning NULL. Otherwise it just calls the real
> ++ * malloc().
> ++ */
> + void *
> +-malloc(size_t s)
> ++malloc (size_t sz)
> + {
> +-  static void * (*func)();
> ++  typedef void *(*malloc_t) (size_t);
> +
> +-  if(!func)
> +-    func = (void *(*)()) dlsym(RTLD_NEXT, "malloc");
> ++  static malloc_t real_malloc = NULL;
> ++  if (real_malloc == NULL)
> ++    {
> ++      real_malloc = (malloc_t)(intptr_t)dlsym (RTLD_NEXT, "malloc");
> ++      if (real_malloc == NULL)
> ++        {
> ++          fprintf (stderr, "no malloc() found\n");
> ++          exit (UNW_TEST_EXIT_HARD_ERROR);                                          \
> ++        }
> ++    }
> +
> +-  if (in_unwind) {
> +-    num_errors++;
> +-    return NULL;
> +-  } else {
> +-    return func(s);
> +-  }
> ++  if (in_unwind)
> ++    {
> ++      malloc_call_count++;
> ++    }
> ++  return real_malloc (sz);
> + }
> +
> + static void
> + do_backtrace (void)
> + {
> +-  unw_word_t ip, sp;
> +-  unw_cursor_t cursor;
> ++  unw_cursor_t  cursor;
> +   unw_context_t uc;
> +-  int ret;
> ++  int           ret;
> +
> +   in_unwind = 1;
> +   unw_getcontext (&uc);
> +   if (unw_init_local (&cursor, &uc) < 0)
> +-    panic ("unw_init_local failed!\n");
> ++    {
> ++      fprintf (stderr, "unw_init_local failed!\n");
> ++      exit (UNW_TEST_EXIT_HARD_ERROR);                                          \
> ++    }
> +
> +   do
> +     {
> +-      unw_get_reg (&cursor, UNW_REG_IP, &ip);
> +-      unw_get_reg (&cursor, UNW_REG_SP, &sp);
> +-
> +       ret = unw_step (&cursor);
> +-      if (ret < 0)
> +-      {
> +-        ++num_errors;
> +-      }
> +     }
> +   while (ret > 0);
> +   in_unwind = 0;
> +@@ -99,12 +113,12 @@ foo1 (void)
> + int
> + main (void)
> + {
> +-  foo1();
> ++  foo1 ();
> +
> +-  if (num_errors > 0)
> ++  if (malloc_call_count > 0)
> +     {
> +-      fprintf (stderr, "FAILURE: detected %d errors\n", num_errors);
> +-      exit (-1);
> ++      fprintf (stderr, "FAILURE: malloc called %d times, expected 0\n", malloc_call_count);
> ++      exit (UNW_TEST_EXIT_FAIL);
> +     }
> +-  return 0;
> ++  exit (UNW_TEST_EXIT_PASS);
> + }
> +diff --git a/tests/Makefile.am b/tests/Makefile.am
> +index adc34ac63..60f3f3adc 100644
> +--- a/tests/Makefile.am
> ++++ b/tests/Makefile.am
> +@@ -214,7 +214,7 @@ endif
> +
> + noinst_PROGRAMS = $(noinst_PROGRAMS_common) $(noinst_PROGRAMS_cdep) \
> +       $(noinst_PROGRAMS_arch)
> +-noinst_HEADERS = ident.h
> ++noinst_HEADERS = ident.h unw_test.h
> +
> + do_test_subst = sed -e 's,[@]TESTS[@],$(TESTS),g' \
> +                     -e 's,[@]XFAIL_TESTS[@],$(XFAIL_TESTS),g' \
> +diff --git a/tests/unw_test.h b/tests/unw_test.h
> +new file mode 100644
> +index 000000000..9ae86dce1
> +--- /dev/null
> ++++ b/tests/unw_test.h
> +@@ -0,0 +1,47 @@
> ++/**
> ++ * @file tests/unw_test.h
> ++ *
> ++ * Common unit test API for libunwind.
> ++ */
> ++/*
> ++ * This file is part of libunwind.
> ++ *   Copyright 2025 Stephen M. Webb <stephen.webb@bregmasoft.ca>
> ++ *
> ++ * Permission is hereby granted, free of charge, to any person obtaining a copy
> ++ * of this software and associated documentation files (the "Software"), to
> ++ * deal in the Software without restriction, including without limitation the
> ++ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
> ++ * sell copies of the Software, and to permit persons to whom the Software is
> ++ * furnished to do so, subject to the following conditions:
> ++ *
> ++ * The above copyright notice and this permission notice shall be included in
> ++ * all copies or substantial portions of the Software.
> ++ *
> ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
> ++ * AUTHORS OR COPYRIGHT HOLDERS BE 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.
> ++ */
> ++#ifndef LIBUNWIND_UNW_TEST_H
> ++#define LIBUNWIND_UNW_TEST_H 1
> ++
> ++/**
> ++ * Exit values for test programs.
> ++ * Based on https://www.gnu.org/software/automake/manual/html_node/Scripts_002dbased-Testsuites.html
> ++ *
> ++ * These are used to interact with the test harness (eg. a TAP-based harness,
> ++ * CTest, or automake).
> ++ */
> ++enum {
> ++  UNW_TEST_EXIT_PASS        =  0,  /* Item under test is a PASS */
> ++  UNW_TEST_EXIT_FAIL        =  1,  /* Item under test is a FAIL */
> ++  UNW_TEST_EXIT_BAD_COMMAND =  2,  /* Test program is invoked with invalid arguments */
> ++  UNW_TEST_EXIT_SKIP        = 77,  /* Test should be skipped */
> ++  UNW_TEST_EXIT_HARD_ERROR  = 99   /* Test program itself has failed */
> ++};
> ++
> ++#endif /* LIBUNWIND_UNW_TEST_H */
> ++
> diff --git a/meta/recipes-support/libunwind/libunwind_1.8.1.bb b/meta/recipes-support/libunwind/libunwind_1.8.1.bb
> index b22cb30646e..caa110c6da4 100644
> --- a/meta/recipes-support/libunwind/libunwind_1.8.1.bb
> +++ b/meta/recipes-support/libunwind/libunwind_1.8.1.bb
> @@ -13,6 +13,7 @@ SRC_URI = "https://github.com/libunwind/libunwind/releases/download/v${PV}/${BP}
>             file://0004-Rework-inline-aarch64-as-for-setcontext.patch \
>             file://0005-Handle-musl-on-PPC32.patch \
>             file://libatomic.patch \
> +           file://malloc.patch \
>             "
>
>  SRC_URI[sha256sum] = "ddf0e32dd5fafe5283198d37e4bf9decf7ba1770b6e7e006c33e6df79e6a6157"
> --
> 2.43.0
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#215463): https://lists.openembedded.org/g/openembedded-core/message/215463
> Mute This Topic: https://lists.openembedded.org/mt/112449328/3617156
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [martin.jansa@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
diff mbox series

Patch

diff --git a/meta/recipes-support/libunwind/libunwind/malloc.patch b/meta/recipes-support/libunwind/libunwind/malloc.patch
new file mode 100644
index 00000000000..026a56f1559
--- /dev/null
+++ b/meta/recipes-support/libunwind/libunwind/malloc.patch
@@ -0,0 +1,255 @@ 
+From b67d508a93bf1ba231c18dce3894cfee25c16e0d Mon Sep 17 00:00:00 2001
+From: Stephen Webb <swebb@blackberry.com>
+Date: Wed, 12 Feb 2025 12:08:07 -0500
+Subject: [PATCH] Fix bad prototype for malloc() in test
+
+The unit test Gtest-nomalloc.c had an incorrect prototype for malloc()
+which caused newer compilers to fail compiling for newer C editions.
+
+Corrected the prototype and corrected a few other errors. The unit now
+compiles using GCC with `CFLAGS=-Wall -Wextra -pedantic -C11` with no
+warnings, which is the minimum requirement.
+
+Added the tests/unw_test.h header as a first step to cleaning up some
+unit tests further.
+
+Upstream-Status: Backport [https://github.com/libunwind/libunwind/commit/b67d508]]
+Signed-off-by: Ross Burton <ross.burton@arm.com>
+---
+ tests/Gtest-nomalloc.c | 124 +++++++++++++++++++++++------------------
+ tests/Makefile.am      |   2 +-
+ tests/unw_test.h       |  47 ++++++++++++++++
+ 3 files changed, 117 insertions(+), 56 deletions(-)
+ create mode 100644 tests/unw_test.h
+
+diff --git a/tests/Gtest-nomalloc.c b/tests/Gtest-nomalloc.c
+index 5b97fc709..e770ff614 100644
+--- a/tests/Gtest-nomalloc.c
++++ b/tests/Gtest-nomalloc.c
+@@ -1,78 +1,92 @@
+-/* libunwind - a platform-independent unwind library
+-   Copyright (C) 2009 Google, Inc
+-	Contributed by Arun Sharma <arun.sharma@google.com>
++/**
++ * @file tests/Gtest-nomalloc.c
++ *
++ * Verify that @c malloc() is not called during an unwinding operation.
++ */
++/*
++ * This file is part of libunwind.
++ *   Copyright 2025 Stephen M. Webb <stephen.webb@bregmasoft.ca>
++ *   Copyright (C) 2009 Google, Inc
++ *   Contributed by Arun Sharma <arun.sharma@google.com>
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to
++ * deal in the Software without restriction, including without limitation the
++ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
++ * sell copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
++ * AUTHORS OR COPYRIGHT HOLDERS BE 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.
++ */
+ 
+-Permission is hereby granted, free of charge, to any person obtaining
+-a copy of this software and associated documentation files (the
+-"Software"), to deal in the Software without restriction, including
+-without limitation the rights to use, copy, modify, merge, publish,
+-distribute, sublicense, and/or sell copies of the Software, and to
+-permit persons to whom the Software is furnished to do so, subject to
+-the following conditions:
+-
+-The above copyright notice and this permission notice shall be
+-included in all copies or substantial portions of the Software.
+-
+-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+-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 <unistd.h>
+-#include <stdio.h>
+-#include <stdlib.h>
+ #include <dlfcn.h>
+ #include <libunwind.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
+ 
+-#define panic(args...)				\
+-	{ fprintf (stderr, args); exit (-1); }
++#include "unw_test.h"
+ 
+-int verbose;
+-int num_errors;
++int malloc_call_count;
+ int in_unwind;
+ 
++/**
++ * Intercepted malloc() call.
++ *
++ * If invoked during unwinding this call will increment the test error count
++ * and indicate a failure by returning NULL. Otherwise it just calls the real
++ * malloc().
++ */
+ void *
+-malloc(size_t s)
++malloc (size_t sz)
+ {
+-  static void * (*func)();
++  typedef void *(*malloc_t) (size_t);
+ 
+-  if(!func)
+-    func = (void *(*)()) dlsym(RTLD_NEXT, "malloc");
++  static malloc_t real_malloc = NULL;
++  if (real_malloc == NULL)
++    {
++      real_malloc = (malloc_t)(intptr_t)dlsym (RTLD_NEXT, "malloc");
++      if (real_malloc == NULL)
++        {
++          fprintf (stderr, "no malloc() found\n");
++          exit (UNW_TEST_EXIT_HARD_ERROR);                                          \
++        }
++    }
+ 
+-  if (in_unwind) {
+-    num_errors++;
+-    return NULL;
+-  } else {
+-    return func(s);
+-  }
++  if (in_unwind)
++    {
++      malloc_call_count++;
++    }
++  return real_malloc (sz);
+ }
+ 
+ static void
+ do_backtrace (void)
+ {
+-  unw_word_t ip, sp;
+-  unw_cursor_t cursor;
++  unw_cursor_t  cursor;
+   unw_context_t uc;
+-  int ret;
++  int           ret;
+ 
+   in_unwind = 1;
+   unw_getcontext (&uc);
+   if (unw_init_local (&cursor, &uc) < 0)
+-    panic ("unw_init_local failed!\n");
++    {
++      fprintf (stderr, "unw_init_local failed!\n");
++      exit (UNW_TEST_EXIT_HARD_ERROR);                                          \
++    }
+ 
+   do
+     {
+-      unw_get_reg (&cursor, UNW_REG_IP, &ip);
+-      unw_get_reg (&cursor, UNW_REG_SP, &sp);
+-
+       ret = unw_step (&cursor);
+-      if (ret < 0)
+-	{
+-	  ++num_errors;
+-	}
+     }
+   while (ret > 0);
+   in_unwind = 0;
+@@ -99,12 +113,12 @@ foo1 (void)
+ int
+ main (void)
+ {
+-  foo1();
++  foo1 ();
+ 
+-  if (num_errors > 0)
++  if (malloc_call_count > 0)
+     {
+-      fprintf (stderr, "FAILURE: detected %d errors\n", num_errors);
+-      exit (-1);
++      fprintf (stderr, "FAILURE: malloc called %d times, expected 0\n", malloc_call_count);
++      exit (UNW_TEST_EXIT_FAIL);
+     }
+-  return 0;
++  exit (UNW_TEST_EXIT_PASS);
+ }
+diff --git a/tests/Makefile.am b/tests/Makefile.am
+index adc34ac63..60f3f3adc 100644
+--- a/tests/Makefile.am
++++ b/tests/Makefile.am
+@@ -214,7 +214,7 @@ endif
+ 
+ noinst_PROGRAMS = $(noinst_PROGRAMS_common) $(noinst_PROGRAMS_cdep) \
+ 	$(noinst_PROGRAMS_arch)
+-noinst_HEADERS = ident.h
++noinst_HEADERS = ident.h unw_test.h
+ 
+ do_test_subst = sed -e 's,[@]TESTS[@],$(TESTS),g' \
+                     -e 's,[@]XFAIL_TESTS[@],$(XFAIL_TESTS),g' \
+diff --git a/tests/unw_test.h b/tests/unw_test.h
+new file mode 100644
+index 000000000..9ae86dce1
+--- /dev/null
++++ b/tests/unw_test.h
+@@ -0,0 +1,47 @@
++/**
++ * @file tests/unw_test.h
++ *
++ * Common unit test API for libunwind.
++ */
++/*
++ * This file is part of libunwind.
++ *   Copyright 2025 Stephen M. Webb <stephen.webb@bregmasoft.ca>
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to
++ * deal in the Software without restriction, including without limitation the
++ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
++ * sell copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
++ * AUTHORS OR COPYRIGHT HOLDERS BE 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.
++ */
++#ifndef LIBUNWIND_UNW_TEST_H
++#define LIBUNWIND_UNW_TEST_H 1
++
++/**
++ * Exit values for test programs.
++ * Based on https://www.gnu.org/software/automake/manual/html_node/Scripts_002dbased-Testsuites.html
++ *
++ * These are used to interact with the test harness (eg. a TAP-based harness,
++ * CTest, or automake).
++ */
++enum {
++  UNW_TEST_EXIT_PASS        =  0,  /* Item under test is a PASS */
++  UNW_TEST_EXIT_FAIL        =  1,  /* Item under test is a FAIL */
++  UNW_TEST_EXIT_BAD_COMMAND =  2,  /* Test program is invoked with invalid arguments */
++  UNW_TEST_EXIT_SKIP        = 77,  /* Test should be skipped */
++  UNW_TEST_EXIT_HARD_ERROR  = 99   /* Test program itself has failed */
++};
++
++#endif /* LIBUNWIND_UNW_TEST_H */
++
diff --git a/meta/recipes-support/libunwind/libunwind_1.8.1.bb b/meta/recipes-support/libunwind/libunwind_1.8.1.bb
index b22cb30646e..caa110c6da4 100644
--- a/meta/recipes-support/libunwind/libunwind_1.8.1.bb
+++ b/meta/recipes-support/libunwind/libunwind_1.8.1.bb
@@ -13,6 +13,7 @@  SRC_URI = "https://github.com/libunwind/libunwind/releases/download/v${PV}/${BP}
            file://0004-Rework-inline-aarch64-as-for-setcontext.patch \
            file://0005-Handle-musl-on-PPC32.patch \
            file://libatomic.patch \
+           file://malloc.patch \
            "
 
 SRC_URI[sha256sum] = "ddf0e32dd5fafe5283198d37e4bf9decf7ba1770b6e7e006c33e6df79e6a6157"