From: Matthias Kilian 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 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)