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:
@@ -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,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,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
|
||||
|
||||
Reference in New Issue
Block a user