7

命令のアドレスを取得する方法はありますか?命令にラベルを付けてラベルのアドレスを取得しようとしましたが、&&演算子を使用したGCCコンパイラでのみ機能するようです。(この記事を参照してください)他のコンパイラがあればどうなりますか?

この質問について何か考えはありますか?

4

4 に答える 4

4

CまたはC++言語標準が命令について話しているかどうかはわかりません。人間の奴隷の大規模なグループによって実行されるようにコンパイルされたCプログラムを実行することも考えられます(ただし、標準に準拠している場合でも、それは非倫理的です)。鉛筆と紙で簡単な小さなプログラムを自分で実行したり、Cインタプリタなどを使用したりできます...など...

inline最適化されたCまたはC++コンパイラは、一部のCステートメントをさまざまな場所にあるいくつかのマシン命令に変換します(特に、コンパイラは、ソースコードにキーワードがなくても、インラインまたはクローン関数、さらには基本ブロックを実行します)。

ほとんどのシステムでは、戻りアドレス(つまり呼び出し元のアドレス)をポインター値として返すルーチンを(アセンブリーなどで)コード化する場合があります。

GCC(および互換性のあるコンパイラ、おそらくClang / LLVM)では、__builtin_return_addressおよび関連するビルトインを使用できます。

Linux上のGnuLibcはバックトレースを提供します(しかし、私が試したとき、私はそれに失望しました)。

これらのトリックは、コンパイル時に機能しない可能性があることに注意してください-fno-frame-pointer

プラグインやMELT拡張機能などを使用してGCCをカスタマイズすることも検討してください(MELTはドメイン固有言語であり、GCCにGPLv3プラグインとして実装され、Cでコーディングされたプラグインよりも簡単にGCCを拡張できます)。カスタマイズされたGCCは、適切な場所にインストルメンテーション関数への呼び出しを挿入する場合があります。

于 2012-07-17T20:56:01.780 に答える
2

注意:ここでは箱から出して..

アプリケーション オブジェクト (関数とデータ) のアドレス (相対またはその他) を含むマップ ファイルをリンカーに生成させることはできますか? アプリケーションは、リンカー マップ ファイルを単純に解析できます...

于 2012-07-17T21:09:56.727 に答える
0

命令のアドレスにさえ近い唯一の標準 C または C++ 構造は、関数ポインターです。ただし、必要なコード ブロックを含む関数へのポインターを代わりに使用して、gcc ラベル値で実行できることのほとんどを実行できます。

C/C++ には他のオプションはありません。

于 2012-07-17T21:06:50.153 に答える
0

関数の戻りアドレスは、現在の関数から戻ったときに実行される次の命令の場所です。GCC は__builtin_return_addressを介してこれを公開します。Visual C++ は_ReturnAddressを介して提供します。

于 2020-02-05T21:29:28.427 に答える