-fomit-frame-pointerが使用されている場合(さまざまな-O設定に対して自動)、バックトレースの実行には問題があります。コードがこのスイッチでコンパイルされていることをコンパイル時に判断する方法があるかどうか疑問に思っていますか?その場合、アドバイスが不十分な場合にバックトレースを防ぐために#ifndefを入れることができます。
この-fomit-frame-pointerスイッチがオンのときにマクロが設定されていますか?
ありがとう、
SetJmp
私はこれを試しました:
gcc -E -fomit-frame-pointer -Wp、-dM foo.c> fpo.out gcc -E -Wp、-dM foo.c> no-fpo.out diff no-fpo.out fpo.out
ここで、foo.cは単純な「HelloWorld」プログラムであり、結果は得られません。これは、-fomit-frame-pointer
使用されたかどうかに関係なく、すべてのプリプロセッサマクロが同一であることを意味します。ですから、あなたの質問に対する答えは「いいえ」だと思います。
おそらく、あなたができる最善のことは、Makefile(またはビルドプロセスが使用するもの)を変更して、を使用するときに独自のマクロ(たとえば-DNO_FRAME_POINTERS
、何か)を定義すること-fomit-frame-pointer
です。
チェックに関しては、実行時にebpレジスタ(アーキテクチャに合わせて調整)がスタックの最上位から数バイト下を指しているかどうかをチェックし、[ebp]に格納されているポインタに従うことが理にかなっている場合。
コンパイル時には実行できませんが、実行時にプログラムが最適化されているかどうかを確認できます。
不揮発性変数をsetjmp
/と混合するなど、オプティマイザーによって確実に変更されるコードを記述しlongjmp
ます。その変数の値によって、プログラムが最適化されているかどうかがわかります。
#include <setjmp.h>
#include <stdio.h>
int is_optimised(void) {
int i = 1;
jmp_buf jmp_loc;
if (setjmp(jmp_loc)) {
return i; // optimiser changes it to "return 1"
}
i = 0;
longjmp(jmp_loc, 1);
return 0;
}
int main(int argc, char *argv[]) {
printf("%soptimised\n", is_optimised() ? "" : "non-");
return 0;
}
-O
スイッチなしでGCCを使用してコンパイルした場合は「 non-optimised
」と出力され、スイッチ-O1
を使用した-O4
場合は「」と出力されますoptimised
。
もちろん、(他のコンパイラを使用した場合の)マイレージは異なる場合があります。