Date: Mon, 18 May 2026 19:39:00 +0000 From: Piotr Kubaj <pkubaj@FreeBSD.org> To: ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org Subject: git: 3bb0a93351df - main - lang/ruby*: fix runtime on powerpc64* Message-ID: <6a0b6ad4.37103.760e0311@gitrepo.freebsd.org>
index | next in thread | raw e-mail
The branch main has been updated by pkubaj: URL: https://cgit.FreeBSD.org/ports/commit/?id=3bb0a93351df3e8d1d7263c39e49e228ff388123 commit 3bb0a93351df3e8d1d7263c39e49e228ff388123 Author: Piotr Kubaj <pkubaj@FreeBSD.org> AuthorDate: 2026-05-18 13:46:13 +0000 Commit: Piotr Kubaj <pkubaj@FreeBSD.org> CommitDate: 2026-05-18 19:38:23 +0000 lang/ruby*: fix runtime on powerpc64* The hand-written `coroutine_transfer` in `coroutine/ppc64le/Context.S` lacks the ELFv2 ABI global entry prologue. When the function is reached via the PLT (lazy resolution path), r2 (TOC pointer) is left pointing at whatever the resolver had loaded — typically the dynamic linker's own TOC — instead of libruby's TOC. The wrong r2 propagates through the fiber switch into `fiber_entry`, which jumps into `fiber_restore_thread` → `rb_current_ec_set`. The first PLT thunk inside the new fiber (`__plt___tls_get_addr` for the `ruby_current_ec` thread-local) computes its GOT entry as `r2 + offset` and segfaults dereferencing the bogus address. Fixes build of textproc/rubygem-nokogiri and devel/rubygem-glib2. --- lang/ruby33/Makefile | 1 + .../ruby33/files/patch-coroutine_ppc64le_Context.S | 22 ++++++++++++++++++++++ lang/ruby34/Makefile | 1 + .../ruby34/files/patch-coroutine_ppc64le_Context.S | 22 ++++++++++++++++++++++ lang/ruby40/Makefile | 1 + .../ruby40/files/patch-coroutine_ppc64le_Context.S | 22 ++++++++++++++++++++++ 6 files changed, 69 insertions(+) diff --git a/lang/ruby33/Makefile b/lang/ruby33/Makefile index 7d16bb778252..2e0371df2d1a 100644 --- a/lang/ruby33/Makefile +++ b/lang/ruby33/Makefile @@ -1,5 +1,6 @@ PORTNAME= ruby PORTVERSION= ${RUBY_DISTVERSION} +PORTREVISION= 1 PORTEPOCH= ${RUBY_PORTEPOCH} CATEGORIES= lang ruby MASTER_SITES= RUBY/${MASTER_SITE_SUBDIR_RUBY} diff --git a/lang/ruby33/files/patch-coroutine_ppc64le_Context.S b/lang/ruby33/files/patch-coroutine_ppc64le_Context.S new file mode 100644 index 000000000000..ba4ef6729932 --- /dev/null +++ b/lang/ruby33/files/patch-coroutine_ppc64le_Context.S @@ -0,0 +1,22 @@ +--- coroutine/ppc64le/Context.S.orig 2025-11-17 12:39:04 UTC ++++ coroutine/ppc64le/Context.S +@@ -1,11 +1,19 @@ + #define TOKEN_PASTE(x,y) x##y + ++.abiversion 2 ++ + .text + .align 2 + + .globl PREFIXED_SYMBOL(coroutine_transfer) + .type PREFIXED_SYMBOL(coroutine_transfer), @function + PREFIXED_SYMBOL(coroutine_transfer): ++ # Global entry: set up TOC pointer (r2) from r12. ++ # Required by ELFv2 ABI when this function is reached via the PLT. ++ addis 2, 12, .TOC. - PREFIXED_SYMBOL(coroutine_transfer)@ha ++ addi 2, 2, .TOC. - PREFIXED_SYMBOL(coroutine_transfer)@l ++ .localentry PREFIXED_SYMBOL(coroutine_transfer), .-PREFIXED_SYMBOL(coroutine_transfer) ++ + # Make space on the stack for caller registers + addi 1,1,-160 + diff --git a/lang/ruby34/Makefile b/lang/ruby34/Makefile index 3db8ee1270dc..7000b55ca647 100644 --- a/lang/ruby34/Makefile +++ b/lang/ruby34/Makefile @@ -1,5 +1,6 @@ PORTNAME= ruby PORTVERSION= ${RUBY_DISTVERSION} +PORTREVISION= 1 PORTEPOCH= ${RUBY_PORTEPOCH} CATEGORIES= lang ruby MASTER_SITES= RUBY/${MASTER_SITE_SUBDIR_RUBY} diff --git a/lang/ruby34/files/patch-coroutine_ppc64le_Context.S b/lang/ruby34/files/patch-coroutine_ppc64le_Context.S new file mode 100644 index 000000000000..ba4ef6729932 --- /dev/null +++ b/lang/ruby34/files/patch-coroutine_ppc64le_Context.S @@ -0,0 +1,22 @@ +--- coroutine/ppc64le/Context.S.orig 2025-11-17 12:39:04 UTC ++++ coroutine/ppc64le/Context.S +@@ -1,11 +1,19 @@ + #define TOKEN_PASTE(x,y) x##y + ++.abiversion 2 ++ + .text + .align 2 + + .globl PREFIXED_SYMBOL(coroutine_transfer) + .type PREFIXED_SYMBOL(coroutine_transfer), @function + PREFIXED_SYMBOL(coroutine_transfer): ++ # Global entry: set up TOC pointer (r2) from r12. ++ # Required by ELFv2 ABI when this function is reached via the PLT. ++ addis 2, 12, .TOC. - PREFIXED_SYMBOL(coroutine_transfer)@ha ++ addi 2, 2, .TOC. - PREFIXED_SYMBOL(coroutine_transfer)@l ++ .localentry PREFIXED_SYMBOL(coroutine_transfer), .-PREFIXED_SYMBOL(coroutine_transfer) ++ + # Make space on the stack for caller registers + addi 1,1,-160 + diff --git a/lang/ruby40/Makefile b/lang/ruby40/Makefile index 4877ffc2d80d..27f6ee6ca175 100644 --- a/lang/ruby40/Makefile +++ b/lang/ruby40/Makefile @@ -1,5 +1,6 @@ PORTNAME= ruby PORTVERSION= ${RUBY_DISTVERSION} +PORTREVISION= 1 PORTEPOCH= ${RUBY_PORTEPOCH} CATEGORIES= lang ruby MASTER_SITES= RUBY/${MASTER_SITE_SUBDIR_RUBY} diff --git a/lang/ruby40/files/patch-coroutine_ppc64le_Context.S b/lang/ruby40/files/patch-coroutine_ppc64le_Context.S new file mode 100644 index 000000000000..ba4ef6729932 --- /dev/null +++ b/lang/ruby40/files/patch-coroutine_ppc64le_Context.S @@ -0,0 +1,22 @@ +--- coroutine/ppc64le/Context.S.orig 2025-11-17 12:39:04 UTC ++++ coroutine/ppc64le/Context.S +@@ -1,11 +1,19 @@ + #define TOKEN_PASTE(x,y) x##y + ++.abiversion 2 ++ + .text + .align 2 + + .globl PREFIXED_SYMBOL(coroutine_transfer) + .type PREFIXED_SYMBOL(coroutine_transfer), @function + PREFIXED_SYMBOL(coroutine_transfer): ++ # Global entry: set up TOC pointer (r2) from r12. ++ # Required by ELFv2 ABI when this function is reached via the PLT. ++ addis 2, 12, .TOC. - PREFIXED_SYMBOL(coroutine_transfer)@ha ++ addi 2, 2, .TOC. - PREFIXED_SYMBOL(coroutine_transfer)@l ++ .localentry PREFIXED_SYMBOL(coroutine_transfer), .-PREFIXED_SYMBOL(coroutine_transfer) ++ + # Make space on the stack for caller registers + addi 1,1,-160 +home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a0b6ad4.37103.760e0311>
