1

gcc のドキュメント:

戻り値の追加の後処理が必要になる場合があります。 を参照してください__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_addressCPU用に何らかの形でエンコードされたアドレスを返すということですか?そして__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))のエンコードは同じですか?

4

0 に答える 0