https://github.com/jmcarp created 
https://github.com/llvm/llvm-project/pull/176988

Illumos uses PT_SUNW_EH_FRAME and PT_SUNW_UNWIND program header types instead 
of PT_GNU_EH_FRAME for exception handling frames. This patch checks if the 
illumos headers are defined, and checks the appropriate fields in the ELF 
header if so.

FreeBSD defines PT_SUNW_UNWIND but not PT_SUNW_EH_FRAME for compatibility, so 
we check for both headers to avoid breaking FreeBSD builds.

Note: this is motivated by a project to [add support for 
illumos](https://github.com/ClickHouse/ClickHouse/issues/23777) to clickhouse. 
We initially sent this patch to [clickhouse's fork of 
llvm](https://github.com/ClickHouse/llvm-project/pull/63), but would like to 
upstream the change first to prevent clickhouse's fork from further diverging 
from this repo.

cc @rschu1ze

>From 22a19e6a1d031c17b26a991c111984f916dcec25 Mon Sep 17 00:00:00 2001
From: Josh Carp <[email protected]>
Date: Tue, 20 Jan 2026 18:08:57 +0000
Subject: [PATCH] [libunwind] Fix EH frame handling on illumos.

Illumos uses PT_SUNW_EH_FRAME and PT_SUNW_UNWIND program header types
instead of PT_GNU_EH_FRAME for exception handling frames. This patch
checks if the illumos headers are defined, and checks the appropriate
fields in the ELF header if so.

FreeBSD defines PT_SUNW_UNWIND but not PT_SUNW_EH_FRAME for compatibility,
so we check for both headers to avoid breaking FreeBSD builds.
---
 libunwind/src/AddressSpace.hpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/libunwind/src/AddressSpace.hpp b/libunwind/src/AddressSpace.hpp
index 52477b16b355a..9b9e1d0a13073 100644
--- a/libunwind/src/AddressSpace.hpp
+++ b/libunwind/src/AddressSpace.hpp
@@ -424,7 +424,13 @@ static bool checkAddrInSegment(const Elf_Phdr *phdr, 
size_t image_base,
 static bool checkForUnwindInfoSegment(const Elf_Phdr *phdr, size_t image_base,
                                       dl_iterate_cb_data *cbdata) {
 #if defined(_LIBUNWIND_SUPPORT_DWARF_INDEX)
+#if defined(PT_SUNW_EH_FRAME) && defined(PT_SUNW_UNWIND)
+  // illumos/Solaris use PT_SUNW_EH_FRAME and PT_SUNW_UNWIND instead of 
PT_GNU_EH_FRAME.
+  // FreeBSD defines PT_SUNW_UNWIND but not PT_SUNW_EH_FRAME, so check for 
both.
+  if (phdr->p_type == PT_SUNW_EH_FRAME || phdr->p_type == PT_SUNW_UNWIND) {
+#else
   if (phdr->p_type == PT_GNU_EH_FRAME) {
+#endif
     EHHeaderParser<LocalAddressSpace>::EHHeaderInfo hdrInfo;
     uintptr_t eh_frame_hdr_start = image_base + phdr->p_vaddr;
     cbdata->sects->dwarf_index_section = eh_frame_hdr_start;

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to