2017-11-26 3 views
2

私はyasmを使って簡単なELFプログラムを構築しようとしています。しかし、私はVMAアドレスが0ではなく0x1000から始まるように.TEXTセクションをターゲットにする方法を理解できません。私はSTARTとORGディレクティブを使用しようとしましたが、これらはターゲティング時にのみ有効ですビン、エルフじゃない。これはヤスムでできますか?yasmのELF32セクションの物理アドレスを指定しますか?

答えて

2

これは一般的なELFオブジェクトでは不可能です。 ELFオブジェクトは、再配置可能なです。つまり、ロード先アドレスはまだ確定していません。通常、再配置を解決して読み込みアドレスを修正するには、リンカーと呼ばれる別のプログラムを使用します。リンカーが使用するロードアドレスと、リンカースクリプトを使用してセクションをどのような順序で配置するかを構成できます。たとえば、COMファイルに適しているとGNUリンカのリンクコードのこの単純なリンカスクリプト:

SECTIONS { 
    . = 0x0100; 

    .text : { 
     *(.text.startup); 
     *(.text); 
    } 

    .data : { 
     *(.data); 
     *(.rodata); 
    } 

    .bss : { 
     *(.bss); 
    } 
} 

冒頭に. = 0x0100ラインがアドレス0x100で次のセクションを配置するようにリンカーに指示します。同様のスクリプトを使用してコードを住所0x1000に配置することもできます。詳細はthe manualをご参照ください。

+0

これは、カスタムOSのような環境向けに作成されています。私は再配置機能を使用しないようにしています。 ELF形式には、セクションをロードする場所を指定するフィールドがありますが、yasmで指定する方法はありません。リンカースクリプトでldで行うことができますが、ld – Earlz

+0

@Earlzの使用を避けることを望んでいました。リンカーの後、リンカーがすべての再配置を解決するため、再配置は必要ありません。 ELF実行可能ファイルを直接生成できるアセンブラは、リンカを使用せずにはないと思います。 ELFはリンカーと一緒に使用されるため、ほとんど役に立たないでしょう。 – fuz

+0

@Ellzなぜリンカーを使わなくてもいいと思ったのですか?あなたがこれを説明することができれば、おそらくあなたが持つ制限をよりよく理解することができます。 – fuz

関連する問題