Skip site navigation (1)Skip section navigation (2)
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>