問題タブ [stack-frame]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
gcc - gcc がアラインメントのために何かを行うかどうかを決定するものは何ですか?
2 つの単純な C ソース ファイルがあります。1 つ目は mainswap.c です。
もう 1 つは mainfoobar.c です。
両方のリロケータブル オブジェクト ファイルを取得しました。main
そして、gcc は関数inのスタック フレームの位置合わせについて何かを行うことがわかりましたが、gcc は関数inmainswap.c
に対して明示的には行いません。main
mainfoobar.c
mainswap.c のメイン:
mainfoobar.c のメイン:
andl $-16, %esp
との意図はわかるsubl $32, %esp
。同じ gcc バージョン、同じオプション、同じコンピューター、唯一の違いは C ソース ファイルです。私の質問は、gcc が 2 つの主要な関数を異なる方法で扱う理由です。この現象の背後にあるものは何ですか?</p>
また、使用した gcc のバージョンは次のとおりです。
ところで、main
mainswap.c の関数では、アラインメントと使用上の要求も満たすと思いますがsubl $16, %esp
、なぜ gcc は 16 バイトを浪費するのですか?</p>
c - 呼び出された関数は、呼び出された後、どのようにして呼び出し元に戻りますか?
関数呼び出しがプログラムによって行われた場合、呼び出された関数は呼び出し元に戻る方法を知っている必要があることを読みました。
私の質問は次のとおりです。呼び出された関数は、呼び出し元に戻る方法をどのように知っていますか? コンパイラを介して舞台裏で機能するメカニズムはありますか?
gcc - gccでスタックフレームサイズを指定するには?
プログラムで valgrind を使用すると、
抑止する ==940== が
表示
されます。 :105)
==940== by 0x804DEF6: thread_start (thread.c:105)
==940== by 0x8049072: main (genome.c:237)
==940== アドレス 0xbbd51340 はスレッド 1 のスタックにあります
max-stackframe オプションを使用すると、エラーが抑制されます。しかし、gcc で max-stackframe のサイズを変更するにはどうすればよいですか?
#define STACK_CHECK_MAX_FRAME_SIZE 48000588 を使ってみた
しかし、うまくいきませんでした。私は間違った方向に進んでいると思います。助けてください。
c++ - cpp オブジェクト メソッドには独自のスタック フレームがありますか?
ここに仮説がありますが、検証するのは少し難しいです。
2 つのスレッドが同じオブジェクト インスタンスの同じメソッドを呼び出す場合、呼び出しスレッドごとに固有のスタック フレームはありますか? コンパイルされたバイナリでは、クラスはメモリ内の関数定義で満たされた静的コードセクションであると理解しています。異なるオブジェクト間の唯一の違いは、this
内部で渡されるポインターです。
ただし、それを呼び出すスレッドは独自のスタック フレームを持っている必要があります。そうしないと、2 つのスレッドが同じオブジェクト インスタンスの同じメンバー関数にアクセスしようとすると、互いのローカル変数が壊れてしまいます。
ここで繰り返しますが、2 つのスレッドがthis
同時に変更することでオブジェクト データが破損する可能性があるかどうかについては言及していません。2 つのスレッドが同じインスタンスの同じメソッドに同時に入る場合、そのコンテキストのローカル変数がメモリ内の同じ場所にあるかどうかについては、さらに詳しく調べています。繰り返しますが、そうではないというのが私の仮定です。
c++ - 関数がスタックから返すアドレスは?
次のコードがあります
GDB でコードをデバッグすると、2 番目のパラメーターがアドレス ebp + 0xc (0xbffff188 + 0xc) によって設定され、3 番目のパラメーターが ebp + 0x10 に設定され、最初のパラメーターがどこにあるのかがわかりません。関数の戻りアドレスが EBP + 4 にあり、最初のパラメーターが EBP +8 にあることを知っています....私が持っているものから?