どうして
push str1
str1 が同じファイルの .text int で定義されている場合、位置に依存しないコードを実行したい場合は良くありませんか? ラベルをスタックにプッシュするとき、アドレスは静止時のアドレスですか? なぜ?
どうして
push str1
str1 が同じファイルの .text int で定義されている場合、位置に依存しないコードを実行したい場合は良くありませんか? ラベルをスタックにプッシュするとき、アドレスは静止時のアドレスですか? なぜ?
バイナリがロードされるたびに、それらは仮想化されます。これには多くのことが含まれますが、PIC にとって最も重要なことは、バイナリがロードされ、ほぼすべてのアドレスに基づいている可能性があることを意味します。 (これらは移転のために修正する必要がないため)。
PUSH
上記の例では、プッシュされるアドレスは .text/.rodata セクション (または優先ベースアドレスから作成された絶対アドレス) へのオフセットになるため、だけで相対アドレスを作成することは不可能ですが、バイナリの現在の仮想アドレスに調整されないため、プッシュする前にアドレスを調整する必要があります (最も簡単なのはおそらく RIP 相対アドレス指定を使用することなので、そうするでしょうPUSH [RIP + <dist from $here to string aka str1 - $>]
)。