Há um monte de portas problemáticas como @Kusalananda aponta; Não posso falar por todos eles, embora suspeite que um problema importante seja o código compilado just-in-time. Este é o código compilado após o início do programa; este código deve ser escrito em algum lugar para que possa ser executado; isso quebra W ^ X como a página em que esse código foi gravado não pode ser executada também. A solução fácil é definir wxallowed
para permitir que isso aconteça. A dificuldade é reescrever o código para suportar páginas de memória JIT e W ^ X (possíveis desvantagens, além do esforço para criar esse código inclui lentidão do código JIT + W ^ X, o que pode ser problemático para usuários de software espera ser performant).
Alguém precisaria examinar cada porta, revisar o código, possivelmente fazer alterações extensas, dependendo de como o código é flexível para nunca executar a partir de uma página gravável, testar essas alterações. Alguns softwares provavelmente exigirão muito trabalho, outros talvez não tenham horas de trabalho (ou dinheiro) para que alguém implemente as mudanças. Não há como dizer o quão ruim é um aplicativo em misturar a memória sem revisá-la, portanto a falta de W ^ X pode ou não ser uma indicação de "má qualidade do código".