Wie wird zur Laufzeit generierter Maschinencode (z. B. die Ausgabe einer JIT) tatsächlich von der CPU ausgeführt, wenn die CPU / das Betriebssystem über ein Ausführungssperrbit verfügt?
Soweit ich weiß, unterstützen viele moderne Prozessoren und Betriebssysteme ein NX-Bit (einschließlich Intel und ARM), das verhindert, dass Maschinencode ausgeführt wird, der an einer anderen Adresse als dem Codeabschnitt einer kompilierten Binärdatei gespeichert ist. Dies ist eindeutig ein netter Sicherheitsvorteil, da dadurch Shell-Code-Injection-Angriffe verhindert werden.
Aber wie umgehen JIT-Engines wie LLVM, die dynamisch Maschinencode generieren, dies?