私は、Linux上で単純なユーザスペースELFローダを書いています(なぜ?for 'fun')。現在のところ、私のローダーは非常に単純で、位置に依存しないコードを含む静的にリンクされたELFファイルだけをロードするように設計されています。ロード時ELF再配置
通常、プログラムがカーネルのELFローダーによってロードされると、プログラムはそれ自身のアドレス空間にロードされます。そのため、データセグメントとコードセグメントは、ELFセグメントで指定されている正しい仮想アドレスにロードできます。
私のケースでは、私はmmap
経由でカーネルのアドレスを要求しており、ELFセグメントで要求されたアドレスを取得しても取得しなくてもよい。これは位置に依存しないため、コードセグメントでは問題ありません。ただし、データセグメントが予想されるアドレスにロードされていない場合、コードはデータセグメントに格納されているものを正しく参照することはできません。
実際、私のローダーは、データを含まない単純なアセンブリ実行可能ファイルで正常に動作するようです。しかし、データセグメントを追加して参照すると、実行ファイルが正しく実行されないか、またはSEGFAULTが失敗します。
可能であれば、データセグメントへの参照が正しい場所を指すように修正する方法はありますか。この目的のために(静的な)ELFファイルに再配置セクションが格納されていますか?
mmapを呼び出しているプロセスが要求されたアドレスを与えているときにmmap()が失敗したのは、そのページがすでにアドレス空間に割り当てられているからですか? –
はい、これがおそらく理由です。私はコード/データを "どこにもない"場所に置くように 'ld'に頼むことを考えましたが、最初に汎用的な解決策が可能かどうか疑問に思っていました。私がここで何の反応も得なければ、私は先に進んでそれを試みるかもしれない。 –