プログラムでマシンコードを生成して実行したいと思います。それを行う 1 つの方法は、.so ファイルを書き出してからプログラムにロードすることですが、それはコストが高すぎるようです。
Linuxでデータページにコードを書き込んでから、関数をそこに設定して呼び出す方法はありますか? そのページのNX保護をオフにしてページを割り当てることができるWindowsで同様のものを見たことがありますが、Linuxの同様のOS呼び出しは見つかりません。
プログラムでマシンコードを生成して実行したいと思います。それを行う 1 つの方法は、.so ファイルを書き出してからプログラムにロードすることですが、それはコストが高すぎるようです。
Linuxでデータページにコードを書き込んでから、関数をそこに設定して呼び出す方法はありますか? そのページのNX保護をオフにしてページを割り当てることができるWindowsで同様のものを見たことがありますが、Linuxの同様のOS呼び出しは見つかりません。
mmap(2) (with munmap(2)
) およびmprotect(2)システムコールは、それを行うための基本的な操作です。アプリケーションの観点からは、syscallは基本的な操作であることを思い出してください。あなたがしたいPROT_EXEC
strace
動的リンカーがそれらを使用しているため、動的にリンクされた実行可能ファイルを呼び出す方法の手がかりを得ることができld.so
ます。
共有オブジェクトの生成は、想像よりも安価かもしれません。実際には、C コードを生成し、コンパイラを実行しdlopen
、結果の共有オブジェクトを -ing することには、対話的に作業している場合でも、ある程度の意味があります。私のMELTドメイン固有言語 (GCC を拡張するため) はこれを行っています。問題なく大量のdlopen
-s を実行できることを思い出してください。
メモリ内にマシン コードを生成する場合は、GNU lightning (低速マシン コードの迅速な生成)、dotgnulibjit
(より少ないマシン コードの生成)、LuaJit、asmjit (x86 または amd64 固有)、LLVM (最適化されたマシンをゆっくりと生成) を使用できます。コード)。ところで、SBCL Common Lisp 実装は動的にメモリにコンパイルされ、実行時に優れたマシン コードを生成します (また、それを行う JVM 用のすべての JIT もあります)。