小さな関数を分解すると、たまたまこの呼び出しが表示されました
call 0xf60d2f47 <__i686.get_pc_thunk.bx>.
プログラムでこの呼び出しが必要な理由がわかりません。どんな説明も役に立ちます。
この呼び出しは、x86の位置独立コードで使用されます。コードの位置を%ebx
レジスタにロードします。これにより、(コードからの固定オフセットを持つ)グローバルオブジェクトに、そのレジスタからのオフセットとしてアクセスできます。
位置に依存しないコードは、異なるアドレスで、変更せずにロードして実行できるコードです。共有ライブラリにリンクされるコードでは、これらが異なるプロセスの異なるアドレスにマッピングされる可能性があるため、重要です。
同等の呼び出しはnotがx86-64では必須であることに注意してください。そのアーキテクチャにはIP相対アドレッシングモードがあるためです(つまり、現在の命令の場所からのオフセットとしてメモリの場所を直接アドレス指定できます)。 。
例によってさらに情報を追加します。
関数の起動時にgdbを無効にすると、次のようになります。
0x012c17a3 <startup+7>: call 0x12b2ce7 <__i686.get_pc_thunk.bx>
0x012c17a8 <startup+12>: add $0x10d6518,%ebx
次に、__ i686.get_pc_thunk.bxを呼び出した後、レジスタebxに次の命令のアドレスである値0x012c17a8が入力されます。
関数はget_pc(program counter)として読み取ることができます。
理解を深めるために、この記事はとてもいいと思いました
https://www.technovelty.org/linux/plt-and-got-the-key-to-code-sharing-and-dynamic-libraries.html