Linuxで単純なユーザースペースELFローダーを書いています(なぜ?'fun'の場合)。現在の私のローダーは非常にシンプルで、位置に依存しないコードを含む静的にリンクされたELFファイルのみをロードするように設計されています。
通常、プログラムがカーネルのELFローダーによってロードされると、プログラムは独自のアドレス空間にロードされます。そのため、データセグメントとコードセグメントは、ELFセグメントで指定されている正しい仮想アドレスにロードできます。
ただし、私の場合は、を介してカーネルからmmap
アドレスを要求しており、ELFセグメントで要求されたアドレスを取得する場合と取得しない場合があります。コードセグメントは位置に依存しないため、これは問題ではありません。ただし、データセグメントが予期されたアドレスにロードされていない場合、コードはデータセグメントに格納されているものを適切に参照できません。
実際、私のローダーは、データを含まない単純なアセンブリ実行可能ファイルで正常に動作しているように見えます。しかし、データセグメントを追加して参照するとすぐに、実行可能ファイルが正しく実行されないか、SEGFAULTが実行されません。
可能であれば、データセグメントへの参照を修正して、正しい場所を指すようにするにはどうすればよいですか?この目的のために(静的)ELFファイルに保存されている再配置セクションはありますか?