戻り値の追加の後処理が必要になる場合があります。 を参照してください
__builtin_extract_return_addr
。メモリに格納された戻りアドレスの表現は、 によって返されるアドレスとは異なる場合があります
__builtin_return_address
。たとえば、AArch64 では、格納されたアドレスは返信アドレスの署名で壊れている可能性がありますが、返されたアドレスはそうで__builtin_return_address
はありません。
リターンアドレスの格納された表現は何ですか?
__builtin_extract_return_addr :
によって返されるアドレスは、実際のエンコードされたアドレス
__builtin_return_address
を取得するために、この関数を介してフィードする必要がある場合があります。たとえば、31 ビット S/390 プラットフォームでは最上位ビットをマスクする必要があり、SPARC プラットフォームでは真の次の命令が実行されるようにオフセットを追加する必要があります。フィックスアップが必要ない場合、この関数は単に addr を通過します。
実際にエンコードされたアドレスは何ですか?
__builtin_return_address
CPU用に何らかの形でエンコードされたアドレスを返すということですか?そして__builtin_extract_return_addr(__builtin_return_address(0))
、直接(エンコードなし)の実際の(シフトなしの)リターンアドレスを返しますか?
もしそうなら、なぜ誰かが__builtin_return_address
なしで使う必要があるの__builtin_extract_return_addr
ですか?
どの関数が自分の関数を呼び出しているかを知りたいだけです。nmユーティリティを使用して取得したすべての関数のアドレスがあります。から返されるnm
アドレスと から返されるアドレス__builtin_extract_return_addr(__builtin_return_address(0))
のエンコードは同じですか?