Index | Thread | Search

From:
Matthias Kilian <kili@outback.escape.de>
Subject:
lang/polyml: fix (stupid because needless) W^X violation
To:
daniel@openbsd.org
Cc:
ports@openbsd.org
Date:
Tue, 15 Jul 2025 22:22:19 +0200

Download raw body.

Thread
Hi,

on my build machine, i've kern.wxabort=1 in /etc/sysctl.conf. Since
the import of polyml, the build always failed for me:

Making all in .
cc -DHAVE_CONFIG_H -I.    -I/usr/local/include -I/usr/X11R6/include  -O2 -pipe -I/usr/X11R6/include -MT polyimport.o -MD -MP -MF .deps/polyimport.Tpo -c -o polyimport.o polyimport.c
mv -f .deps/polyimport.Tpo .deps/polyimport.Po
/usr/bin/libtool  --tag=CC    --mode=link cc  -O2 -pipe -I/usr/X11R6/include    -L/usr/local/lib -o polyimport polyimport.o  libpolyml/libpolyml.la -lXm -lXext -lXt -lX11 -L/usr/X11R6/lib -lpthread -lgmp -lm 
libtool: link: cc -o .libs/polyimport -pthread -O2 -pipe -I/usr/X11R6/include polyimport.o -L.libs -lpolyml -lXm -lXmu -lXt -lSM -lICE -lX11 -lxcb -lXext -liconv -lfreetype -lXft -lfontconfig -lz -lexpat -lXrender -ljpeg -lpng -lm -lpthread -lgmp -Wl,-rpath-link,/usr/X11R6/lib,-rpath-link,/usr/local/lib
./polyimport  ./bootstrap/bootstrap64.txt -I . < ./bootstrap/Stage1.sml
Abort trap (core dumped) 
*** Error 134 in . (Makefile:1157 'polyexport.o')

dmesg(8) says why:
polyimport(65144): mmap W^X violation

A backtrace points to OSMem::Initialise():

(gdb) bt
#0  mmap () at /tmp/-:2
#1  0x190738e88f59bbc0 in ?? ()
#2  0x0000020e40c6f6f6 in OSMem::Initialise(OSMem::_MemUsage) () from ./.libs/libpolyml.so.0.0
#3  0x0000020e40c6f80c in OSMemInRegion::Initialise(OSMem::_MemUsage, unsigned long, void**) ()
   from ./.libs/libpolyml.so.0.0
#4  0x0000020e40c1bbf4 in MemMgr::Initialise() () from ./.libs/libpolyml.so.0.0
#5  0x0000020e40c21414 in polymain () from ./.libs/libpolyml.so.0.0
#6  0x0000020c1cacc92b in _start ()

I don't even want to know why they do all those mmap(2) checks at
runtime (see the code touched by the diff).

However, I've verified that the diff below fixes the problem for
us...  Uglyness intentional, because ML is a torture ;-)

ok (with a revision bump)?

Ciao,
	Kili

Index: patches/patch-libpolyml_osmemunix_cpp
===================================================================
RCS file: patches/patch-libpolyml_osmemunix_cpp
diff -N patches/patch-libpolyml_osmemunix_cpp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-libpolyml_osmemunix_cpp	15 Jul 2025 20:11:40 -0000
@@ -0,0 +1,26 @@
+Index: libpolyml/osmemunix.cpp
+--- libpolyml/osmemunix.cpp.orig
++++ libpolyml/osmemunix.cpp
+@@ -163,8 +163,10 @@ bool OSMem::Initialise(enum _MemUsage usage)
+         wxFix = WXFixNone;
+     else
+     {
++	void* test;
++#ifndef __OpenBSD__
+         // Can we allocate memory with write+execute?
+-        void* test = mmap(0, pageSize, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, -1, 0);
++        test = mmap(0, pageSize, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, -1, 0);
+         if (test != MAP_FAILED)
+             wxFix = WXFixNone;
+ #ifdef MAP_JIT
+@@ -179,6 +181,10 @@ bool OSMem::Initialise(enum _MemUsage usage)
+         {
+             if (errno != ENOTSUP && errno != EACCES) // Fails with ENOTSUPP on OpenBSD and EACCES in SELinux.
+                 return false;
++#else
++	if (1)
++	{
++#endif
+             // Check that read-write works.
+             test = mmap(0, pageSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
+             if (test == MAP_FAILED)