21

Linuxで単純なユーザースペースELFローダーを書いています(なぜ?'fun'の場合)。現在の私のローダーは非常にシンプルで、位置に依存しないコードを含む静的にリンクされたELFファイルのみをロードするように設計されています。

通常、プログラムがカーネルのELFローダーによってロードされると、プログラムは独自のアドレス空間にロードされます。そのため、データセグメントとコードセグメントは、ELFセグメントで指定されている正しい仮想アドレスにロードできます。

ただし、私の場合は、を介してカーネルからmmapアドレスを要求しており、ELFセグメントで要求されたアドレスを取得する場合と取得しない場合があります。コードセグメントは位置に依存しないため、これは問題ではありません。ただし、データセグメントが予期されたアドレスにロードされていない場合、コードはデータセグメントに格納されているものを適切に参照できません。

実際、私のローダーは、データを含まない単純なアセンブリ実行可能ファイルで正常に動作しているように見えます。しかし、データセグメントを追加して参照するとすぐに、実行可能ファイルが正しく実行されないか、SEGFAULTが実行されません。

可能であれば、データセグメントへの参照を修正して、正しい場所を指すようにするにはどうすればよいですか?この目的のために(静的)ELFファイルに保存されている再配置セクションはありますか?

4

2 に答える 2

8

.got セクション (グローバル オフセット テーブル) で使用可能な絶対アドレスを変更すると、プログラムが動作するはずです。絶対アドレスの計算を変更して、.text と .data の間の新しい距離に対応するようにしてください。残念ながら、この情報がどこから来たのかをアーキテクチャで把握する必要があります。

これを参照してください:グローバル オフセット テーブル (プロセッサ固有)

幸運を。

于 2009-09-30T08:35:37.947 に答える
4

カーネルが提供する仮想アドレス空間を完全にエミュレートし、その仮想空間内でコードを実行しない限り、それを行う方法はありません。ファイルからデータ セクションを mmap すると、本質的に ELF インタープリターの仮想アドレス空間の不明なアドレスに再配置され、コードはそれを参照できなくなります。

間違っていることが証明されてうれしいです。ここで学べるとてもクールなことがあります。

于 2009-09-06T12:52:22.177 に答える