2016-06-15 7 views
1

セクションにフィックスアップを適用すると、正確には何が行われますか? 虚偽のサンプルでは、​​私は次のセクションdelcarationを見つけました。フィックスアップの属性に何が含まれているのか分かりません。セクションでfixups属性を使用する方法は?

section '.reloc' fixups data readable discardable 
if $=$$ 
    dd 0,8   ; if there are no fixups, generate dummy entry 
end if 

答えて

4

これはbug in how FASM generates PECOFF DLLsの回避策のようです。 .relocセクションは、PECOFFイメージ(EXEおよびDLL)にのみ適用され、任意のアドレスにイメージをロードできる再配置(または "フィックスアップ")を提供します。 (別の種類の再配置がPECOFFオブジェクトファイルで使用されている;これらのフィックスアップが.relocセクションに配置されていない)

FASMのバグは、DLLは、任意のを必要としない場合には、空の.relocセクションを生成することです再配置する必要はありません。空のセクションがある場合、WindowsはDLL(またはEXE)のロードを拒否します。この回避策では、.relocセクションに内容がない場合はダミーの「ベース再配置ブロック」を追加して、空でない.relocセクションを強制的に強制します。

FASMの開発者は、これはFASMのバグではなく、Windowsのバグだとは思わないため、修正されていません。

あなたの質問に直接答えるために、fixupsキーワードは、このセクションが上記のようなイメージ再配置に使用されていることをFASMにとって特別なものとして示しています。他の属性と異なり、PECOFFイメージで使用されるセクションフラグの1つに対応しないため、FASMによって内部的にのみ使用されるように見えます。

+0

PE仕様とこのFASM specfic詳細な回答の間に明確化のために多くのおかげで私は必要なすべてを得た! –

2

フィックスアップ再配置エントリのためのちょうど別の名前です。
PE移転を初めてお考えの方はtake a look at the official specificationsです。


再配置エントリは、コンパイルされたコード内のアドレスを修正する方法(したがって名前の修正)をどのように修正するかを指示します。

fixupsディレクティブは、宣言されたセクションが再配置エントリを(自動的に)生成する必要があるセクションであることをFASMに伝えます。 データを追加することはできますが、ユーザがデータを提供する前にフィックスアップが書き​​込まれている可能性があります。。

テストif $=$$現在のアドレスカウンタ($)が、セクションが開始したときのアドレスカウンタの値($$)と等しいかどうかを確認します。
これが当てはまる場合、セクションの先頭にユーザーデータが書き込まれるため、フィックスアップは生成されません。

2つのdwords dd 0, 8は、空のエントリ(ダミーエントリ)を作成します。
2番目のDWORDは、8バイトのヘッダーを含むエントリ全体の長さを指定します。値8は、追加のデータを指定しません。


このようなダミーエントリが作成される理由はわかりません。ただ、スニペットからこれを推測


、私は確かに知りません。

+0

このおかげで、6.6の仕様は、このすべてを理解するのに最適な出発点のようです。私はより多くの時間があるときに全体のスペックを読むこともあまりにも傷ついていないと思う。 –

関連する問題