あるスタック フレームから別のスタック フレームにジャンプする「危険な」プログラムを C++ で作成しました。目標は、コール スタックの最下位レベルから呼び出し元にジャンプし、何かを実行してから再び下にジャンプし、その間のすべての呼び出しをスキップすることです。
これを行うには、スタック ベース アドレスを手動で変更し (設定%ebp)、ラベル アドレスにジャンプします。gcc と icc の両方で、スタックがまったく破損することなく、完全に機能します。これが働いた日は涼しい日でした。
今、同じプログラムを C で書き直しましたが、うまくいきません。具体的には、gcc v4.0.1 (Mac OS) では動作しません。新しいスタック フレーム (スタック ベース ポインターが正しく設定された状態) にジャンプすると、次の命令が実行され、fprintf. ここにリストされている最後の命令はクラッシュし、NULL を逆参照します。
lea 0x18b8(%ebx), %eax
mov (%eax), %eax
mov (%eax), %eax
私はいくつかのデバッグを行いました.%ebxスタックフレームを切り替えるときにレジスタを手動で設定することで(最初に関数を離れる前に観察した値を使用して)、バグを修正することがわかりました。このレジスタは、gcc の「位置に依存しないコード」を扱うと読みました。
位置独立コードとは何ですか? 位置に依存しないコードはどのように機能しますか? このレジスターは何を指していますか?