Download raw body.
lang/polyml: fix (stupid because needless) W^X violation
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)
lang/polyml: fix (stupid because needless) W^X violation