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.
This commit is contained in:
Piotr Kubaj
2026-05-18 15:46:13 +02:00
parent eba3ac5d3b
commit 3bb0a93351
6 changed files with 69 additions and 0 deletions
+1
View File
@@ -1,5 +1,6 @@
PORTNAME= ruby
PORTVERSION= ${RUBY_DISTVERSION}
PORTREVISION= 1
PORTEPOCH= ${RUBY_PORTEPOCH}
CATEGORIES= lang ruby
MASTER_SITES= RUBY/${MASTER_SITE_SUBDIR_RUBY}
@@ -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
+1
View File
@@ -1,5 +1,6 @@
PORTNAME= ruby
PORTVERSION= ${RUBY_DISTVERSION}
PORTREVISION= 1
PORTEPOCH= ${RUBY_PORTEPOCH}
CATEGORIES= lang ruby
MASTER_SITES= RUBY/${MASTER_SITE_SUBDIR_RUBY}
@@ -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
+1
View File
@@ -1,5 +1,6 @@
PORTNAME= ruby
PORTVERSION= ${RUBY_DISTVERSION}
PORTREVISION= 1
PORTEPOCH= ${RUBY_PORTEPOCH}
CATEGORIES= lang ruby
MASTER_SITES= RUBY/${MASTER_SITE_SUBDIR_RUBY}
@@ -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