2

個人的なプロジェクトの場合、デフォルト以外のメモリアドレスでロードする実行可能ファイルを作成する必要があります。このSOの質問から、ELFのエントリアドレスを設定し、セクションアドレスを手動で変更して、実行可能ファイルが選択したアドレスに効果的に基づいているようにすることができます。ただし、答えは、これはglibcの初期化(このプロジェクトに必要)を行わない場合にのみ機能し、コンパイルするたびにセクションメモリアドレスを設定するのは難しい(退屈なことは言うまでもありません)ことを示唆しています。

ビルド時にELFのベースアドレスを設定するためのより良い方法があるはずですが、必要に応じてビルド後にスクリプトを使用して手動で設定することにします。このオプションはld、PEポートに固有でない場合に最適です。

--image-base value
  Use value as the base address of your program or dll. This is the lowest 
  memory location that will be used when your program or dll is loaded. To 
  reduce the need to relocate and improve performance of your dlls, each should 
  have a unique base address and not overlap any other dlls. The default is 
  0x400000 for executables, and 0x10000000 for dlls. [This option is specific 
  to the i386 PE targeted port of the linker]

ELFに相当するものはまだ見つかりません。存在しませんか?ELFファイルを自分で解析することは世界の終わりではありませんが、この機能はどこかに存在するはずです。

4

1 に答える 1

2

ELFエントリポイントは、リンカ応答ファイルで設定できます。リンカ応答ファイルは、-Tを使用してldに渡すことができます。

--verboseを使用して偽のリンクを実行すると、デフォルトのリンカー応答ファイルが表示されます(これはシステム固有の場合がありますが、実際にはそれほど悪くはありません。ほとんどの場合、OSごとにアーチごとに1つです)。

追加の制約がある場合があることに注意してください(テキスト/コードセグメントにあるエントリポイントなど)

カスタムリンカーファイルに沿ったラグの実際的な例については、リソースを実装するためにこれを行うFreePascalプロジェクトを参照してください。

于 2013-03-10T12:16:43.553 に答える