6

最近、Linux プラットフォームで簡単なコンパイラを自分で書こうとしました。

コンパイラのバックエンドに関しては、libelf.

write()代わりに、関数を使用して ELF ファイルのすべての詳細を制御するだけで、ELF ABI に対応するファイルにマシン コードを直接書き込もうとしています。

このアプローチの利点は、コンパイラのすべてを制御できることです。

しかし、私は躊躇しています。ELF ABI がどれほど詳細であるかを考えると、その方法は実行可能ですか?

利用可能な優れたリソースへの提案や指針を期待しています。

4

1 に答える 1

7

これがどれほど簡単/実現可能かは、サポートしたい機能によって異なります。動的リンクを使用する場合は、シンボル テーブル、再配置などを処理する必要があります。もちろん、静的ライブラリであっても、既存のライブラリとリンクできるようにする場合は、必要なものをすべてサポートする必要があります。しかし、スタンドアロンの静的 ELF バイナリを作成するだけの場合は、非常に簡単です。必要なのは、メインの ELF ヘッダー (100% ボイラープレート) と 2 つPT_LOADのプログラム ヘッダーだけです。1 つはプログラムのコード セグメントをロードするためのもので、もう 1 つはそのデータ セグメントをロードするためのものです。理論的にはそれらを組み合わせることができますが、セキュリティが強化されたカーネルでは、特定のページを書き込み可能かつ実行可能にすることはできないため、それらを分離するのが賢明です。

いくつかの提案された読書:

http://www.linuxjournal.com/article/1059

于 2012-05-21T05:09:42.773 に答える