www/seamonkey builds an embedded copy of libffi.  On amd64, this
includes some assembly code that puts two jump tables into the .text
segment, which semarie@'s warning diff helpfully pointed out:

/usr/obj/ports/seamonkey-2.53.14/seamonkey-2.53.14/config/external/ffi/../../../js/src/ctypes/libffi/src/x86/unix64.S:94:8:
 warning: directive value inside .text section: directive '.long', section 
'.text'
 .long .Lst_void-.Lstore_table
       ^

The patch below moves the tables into .rodata.  The tables contain
a list of offsets from a rip-relative starting point.  I've left
the original label names to keep the diff small.  As far as I can
tell, i.e. from looking at other code our compiler generates,
referencing data in .rodata with rip-relative addressing should be
fine and we don't need to go through the GOT.

It builds.  I haven't been able to run it yet, since seamonkey
doesn't appear to be amenable to SSH X11 forwaring.

Okay/comments/tests?


Index: Makefile
===================================================================
RCS file: /cvs/ports/www/seamonkey/Makefile,v
retrieving revision 1.283
diff -u -p -r1.283 Makefile
--- Makefile    24 Jan 2023 08:41:55 -0000      1.283
+++ Makefile    26 Jan 2023 15:34:50 -0000
@@ -13,6 +13,7 @@ MULTI_PACKAGES =      -main -lightning
 PKGNAME-main =         ${PKGNAME}
 PKGNAME-lightning =    lightning-seamonkey-5.8.15
 EPOCH-lightning =      0
+REVISION-main =                0
 
 HOMEPAGE =     https://www.seamonkey-project.org/
 
Index: patches/patch-js_src_ctypes_libffi_src_x86_unix64_S
===================================================================
RCS file: patches/patch-js_src_ctypes_libffi_src_x86_unix64_S
diff -N patches/patch-js_src_ctypes_libffi_src_x86_unix64_S
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-js_src_ctypes_libffi_src_x86_unix64_S 26 Jan 2023 15:34:50 
-0000
@@ -0,0 +1,55 @@
+Index: js/src/ctypes/libffi/src/x86/unix64.S
+--- js/src/ctypes/libffi/src/x86/unix64.S.orig
++++ js/src/ctypes/libffi/src/x86/unix64.S
+@@ -85,12 +85,16 @@ ffi_call_unix64:
+ 
+       /* The first byte of the flags contains the FFI_TYPE.  */
+       movzbl  %cl, %r10d
+-      leaq    .Lstore_table(%rip), %r11
++      leaq    .Lstore_offsets(%rip), %r11
+       movslq  (%r11, %r10, 4), %r10
++      leaq    .Lstore_table(%rip), %r11
+       addq    %r11, %r10
+       jmp     *%r10
+ 
+ .Lstore_table:
++
++      .section .rodata
++.Lstore_offsets:
+       .long   .Lst_void-.Lstore_table         /* FFI_TYPE_VOID */
+       .long   .Lst_sint32-.Lstore_table       /* FFI_TYPE_INT */
+       .long   .Lst_float-.Lstore_table        /* FFI_TYPE_FLOAT */
+@@ -106,6 +110,7 @@ ffi_call_unix64:
+       .long   .Lst_int64-.Lstore_table        /* FFI_TYPE_SINT64 */
+       .long   .Lst_struct-.Lstore_table       /* FFI_TYPE_STRUCT */
+       .long   .Lst_int64-.Lstore_table        /* FFI_TYPE_POINTER */
++      .previous
+ 
+       .align 2
+ .Lst_void:
+@@ -234,12 +239,16 @@ ffi_closure_unix64:
+ 
+       /* The first byte of the return value contains the FFI_TYPE.  */
+       movzbl  %al, %r10d
+-      leaq    .Lload_table(%rip), %r11
++      leaq    .Lload_offsets(%rip), %r11
+       movslq  (%r11, %r10, 4), %r10
++      leaq    .Lload_table(%rip), %r11
+       addq    %r11, %r10
+       jmp     *%r10
+ 
+ .Lload_table:
++
++      .section .rodata
++.Lload_offsets:
+       .long   .Lld_void-.Lload_table          /* FFI_TYPE_VOID */
+       .long   .Lld_int32-.Lload_table         /* FFI_TYPE_INT */
+       .long   .Lld_float-.Lload_table         /* FFI_TYPE_FLOAT */
+@@ -255,6 +264,7 @@ ffi_closure_unix64:
+       .long   .Lld_int64-.Lload_table         /* FFI_TYPE_SINT64 */
+       .long   .Lld_struct-.Lload_table        /* FFI_TYPE_STRUCT */
+       .long   .Lld_int64-.Lload_table         /* FFI_TYPE_POINTER */
++      .previous
+ 
+       .align 2
+ .Lld_void:
-- 
Christian "naddy" Weisgerber                          na...@mips.inka.de

Reply via email to