[packages/libunwind] - more x32 changes, but probably not correctly functional (ELF bitness seems too bound to register s

qboosh qboosh at pld-linux.org
Fri Dec 27 20:58:32 CET 2024


commit 6218a9dfa16a215ba8ccbd26a90bda52f58ca135
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date:   Fri Dec 27 20:47:53 2024 +0100

    - more x32 changes, but probably not correctly functional (ELF bitness seems too bound to register sizes)

 libunwind-x32.patch | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 107 insertions(+)
---
diff --git a/libunwind-x32.patch b/libunwind-x32.patch
index d616516..dca59cf 100644
--- a/libunwind-x32.patch
+++ b/libunwind-x32.patch
@@ -11,3 +11,110 @@
                          "syscall"
                          :: "r"((uint64_t)sc), "i"(SYS_rt_sigreturn)
                          : "memory");
+--- libunwind-1.8.1/src/elfxx.c.orig	2024-02-20 20:54:51.000000000 +0100
++++ libunwind-1.8.1/src/elfxx.c	2024-12-26 11:16:47.512432536 +0100
+@@ -819,10 +819,10 @@ elf_w (find_build_id_path) (const struct
+           const char prefix[] = "/usr/lib/debug/.build-id/";
+ 
+           /* See "man 5 elf" for notes about alignment in Nhdr */
+-          const Elf_W(Nhdr) *nhdr = (const ElfW(Nhdr) *) notes;
+-          const ElfW(Word) namesz = nhdr->n_namesz;
+-          const ElfW(Word) descsz = nhdr->n_descsz;
+-          const ElfW(Word) nameasz = UNW_ALIGN(namesz, 4); /* Aligned size */
++          const Elf_W(Nhdr) *nhdr = (const Elf_W(Nhdr) *) notes;
++          const Elf_W(Word) namesz = nhdr->n_namesz;
++          const Elf_W(Word) descsz = nhdr->n_descsz;
++          const Elf_W(Word) nameasz = UNW_ALIGN(namesz, 4); /* Aligned size */
+           const char *name = (const char *) (nhdr + 1);
+           const uint8_t *desc = (const uint8_t *) name + nameasz;
+           unsigned j;
+--- libunwind-1.8.1/include/tdep-x86_64/libunwind_i.h.orig	2024-02-20 20:54:51.000000000 +0100
++++ libunwind-1.8.1/include/tdep-x86_64/libunwind_i.h	2024-12-27 18:04:46.594569550 +0100
+@@ -36,7 +36,11 @@ WITH THE SOFTWARE OR THE USE OR OTHER DE
+ #include <stdatomic.h>
+ #include <libunwind.h>
+ 
++#ifdef __ILP32__
++#include "elf32.h"
++#else
+ #include "elf64.h"
++#endif
+ #include "mempool.h"
+ #include "dwarf.h"
+ 
+--- libunwind-1.8.1/configure.ac.orig	2024-02-20 20:54:51.000000000 +0100
++++ libunwind-1.8.1/configure.ac	2024-12-27 18:23:39.734249688 +0100
+@@ -368,8 +368,9 @@ AM_CONDITIONAL(OS_SOLARIS, expr x$target
+ 
+ AC_MSG_CHECKING([for ELF helper width])
+ AS_CASE([${target_arch}],
++	[x86_64], [AS_CASE([${target_os}], [linux-gnux32], [use_elf32=yes; AC_MSG_RESULT([32])], [use_elf64=yes; AC_MSG_RESULT([64])])],
+         [arm|hppa|ppc32|x86|sh],           [use_elf32=yes; AC_MSG_RESULT([32])],
+-        [aarch64|ia64|ppc64|x86_64|s390x], [use_elf64=yes; AC_MSG_RESULT([64])],
++        [aarch64|ia64|ppc64|s390x], [use_elf64=yes; AC_MSG_RESULT([64])],
+         [mips|riscv|loongarch64],          [use_elfxx=yes; AC_MSG_RESULT([xx])],
+         [AC_MSG_ERROR([Unknown ELF target: ${target_arch}])]
+ )
+--- libunwind-1.8.1/include/libunwind-x86_64.h.orig	2024-02-20 20:54:51.000000000 +0100
++++ libunwind-1.8.1/include/libunwind-x86_64.h	2024-12-27 19:18:05.193523408 +0100
+@@ -53,8 +53,13 @@ extern "C" {
+    want to err on making it rather too big than too small.  */
+ #define UNW_TDEP_CURSOR_LEN     127
+ 
++#ifdef __ILP32__
++typedef uint32_t unw_word_t;
++typedef int32_t unw_sword_t;
++#else
+ typedef uint64_t unw_word_t;
+ typedef int64_t unw_sword_t;
++#endif
+ 
+ typedef long double unw_tdep_fpreg_t;
+ 
+--- libunwind-1.8.1/src/x86_64/Ginit.c.orig	2024-02-20 20:54:51.000000000 +0100
++++ libunwind-1.8.1/src/x86_64/Ginit.c	2024-12-27 19:23:41.555679837 +0100
+@@ -165,7 +165,7 @@ get_static_proc_name (unw_addr_space_t a
+                       char *buf, size_t buf_len, unw_word_t *offp,
+                       void *arg UNUSED)
+ {
+-  return _Uelf64_get_proc_name (as, getpid (), ip, buf, buf_len, offp);
++  return elf_w(get_proc_name) (as, getpid (), ip, buf, buf_len, offp);
+ }
+ 
+ static int
+@@ -173,7 +173,7 @@ get_static_elf_filename (unw_addr_space_
+                          char *buf, size_t buf_len, unw_word_t *offp,
+                          void *arg UNUSED)
+ {
+-  return _Uelf64_get_elf_filename (as, getpid (), ip, buf, buf_len, offp);
++  return elf_w(get_elf_filename) (as, getpid (), ip, buf, buf_len, offp);
+ }
+ 
+ HIDDEN void
+--- libunwind-1.8.1/src/Makefile.am.orig	2024-02-21 14:39:50.000000000 +0100
++++ libunwind-1.8.1/src/Makefile.am	2024-12-27 20:13:28.032346689 +0100
+@@ -1212,8 +1212,12 @@ libunwind_x86_64_la_LDFLAGS =
+ 	-version-info $(SOVERSION)
+ libunwind_x86_64_la_LIBADD =                   \
+ 	libunwind-dwarf-generic.la             \
+-	libunwind-elf64.la                     \
+ 	$(libunwind_libadd)
++if USE_ELF32
++libunwind_x86_64_la_LIBADD += libunwind-elf32.la
++else
++libunwind_x86_64_la_LIBADD += libunwind-elf64.la
++endif
+ 
+ if REMOTE_ONLY
+ install-exec-hook:
+--- libunwind-1.8.1/tests/Gx64-test-dwarf-expressions.c.orig	2024-02-20 20:54:51.000000000 +0100
++++ libunwind-1.8.1/tests/Gx64-test-dwarf-expressions.c	2024-12-27 20:37:36.867647438 +0100
+@@ -40,7 +40,7 @@ extern int64_t recover_register(int64_t
+         panic("%s: unw_get_reg failed to locate the program counter", __FUNCTION__);
+     }
+   // We're now at the required height, extract register
+-  uint64_t value;
++  unw_word_t value;
+   if ((rc = unw_get_reg(&cursor, (unw_regnum_t) regnum, &value)) != 0)
+     panic("%s: unw_get_reg failed to retrieve register %lu", __FUNCTION__, regnum);
+   return value;
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/libunwind.git/commitdiff/6218a9dfa16a215ba8ccbd26a90bda52f58ca135



More information about the pld-cvs-commit mailing list