問題タブ [dladdr]
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.
c++ - メモリ内のアドレスによってシンボルに関する詳細情報を取得するにはどうすればよいですか?
メモリ内のアドレスでシンボル名を取得しようとしています。int dladdr(void *addr, Dl_info *info)
関数fromを使用dlfcn.h
して情報を取得します。
ただし、この関数はアドレスに一致するシンボルを見つけることができず、dli_snameとsaddrをNULLに設定します。
この場合、シンボルの名前またはシンボルに関するその他の情報(種類、属性など)を取得するにはどうすればよいですか?
注:私が見つけようとしているシンボルの名前はです_ZTv0_n24_N4QGst13PropertyProbeD0Ev
。これは、クラスのvtableに次のようにリストされていQGst::PropertyProbe
ますg++ -fdump-class-hierarchy
。
しかし、シンボルdladdr
によって共有オブジェクトを調べ、仮想関数ポインターのリストを反復処理したときに取得したアドレスでは見つかりません。v-tableの他のすべての関数は、によって検出されます。dlopen
dlsym
_ZTVN4QGst13PropertyProbeE
dladdr
linux - dladdr が dli_fname にフル パスを返さない
dladdr を使用して、ライブラリへのフル パスを取得します。
それは正常に動作します。ただし、ビルドでフォルダーの名前を変更すると (そして再度実行すると)、dli_fname にはフル パスが含まれず、ライブラリのファイル名のみが含まれます。何故ですか?
ビルド フォルダーの名前を変更する以外の手順は他にもありますが (さまざまな cmake の変更、主にインストール機能に関連する)、それでも問題は名前の変更後にのみ発生します (つまり、アプリケーションはビルド フォルダーからではなく実行されます)。
ios - すべてのネイティブ クラスのリストを取得する
iOS プロジェクトにロードしたすべてのネイティブ クラス (NSString、NSNumber、int、float、NSSet、NSDictionary) を取得したいと考えています。
つまり、「TestClass」という名前のカスタム クラスを作成した場合、それを一覧表示したくありません...
既にコードを取得していますが、ロードされたすべてのクラスの名前を返します。コードを変更して、リストをネイティブ クラスのみに限定できますか?
c++ - dladdr は static メンバーから情報を取得できますか?
いくつかのライブラリの調査中に、この種のコードを見つけました
このコードが存在するクラスのメンバーはどこにありますか(comeメンバー関数内)、私の質問は次のとおりです。その関数が情報フォームフィールドを取得できる文書化された場所はありdirSep
ますか?static const char*
dladdr
static const member
c++ - arm-linux の位置に依存しないコードで dladdr が実行可能ファイルへのパスを返すのはなぜですか?
Emdebian の g++-4.7 クロス コンパイラ for armhf を使用して arm-linux 用にクロスコンパイルしたコードの一部で、dladdr に関する問題が発生しました。問題は、dladdr に渡す関数ポインターが実行可能ファイル内でも呼び出される関数である場合、dli_fname は、シンボルの元の共有ライブラリではなく、実行可能ファイルへのパスを返すことです。
コンパイルされた例:
/usr/bin/arm-linux-gnueabihf-g++-4.7 main.cpp -o main -ldl -fPIC
結果: printf は ./main から取得されます
main() の本体を次のように変更すると
結果: printf は /lib/arm-linux-gnueabihf/libc.so.6 から取得されます
関数ポインターを dladdr に渡す関数が実行可能ファイル内で呼び出された場合、次の行に沿ったエントリがあることに気付きました
実行可能ファイルの .rel.plt セクションに作成されます。dladdr は、GOT を通じて見つけられる libc.so.6 からの正しいアドレスではなく、PLT から printf のこのアドレスを見つけているようです。dladdr のマニュアル ページでは、コードを位置に依存しないようにコンパイルするとこれが修正されるはずですが、このコンパイラではそうではないようです。参考までに、上記の同じコードは、g++-4.7 を使用する x86_64 Linux で期待どおりに動作します。
c - 変数名、C での実行時の関数引数
Cプログラムで実行時に関数の引数と変数の名前の型を知ることは可能ですか? たとえば、関数がある場合:
この関数内で、引数と変数abc()
の名前を知ることができますか?x
y
z
a
b
int
float
somestruct
char
int
別の機能がある場合は、次のように言います。
my_struct
引数名は、index
型はspecialstruct
、であることを知っておく必要がありますint
。
実行時にこの情報が必要ですか?
ベース ポインターとリターン アドレスにアクセスできます。上記のポインターを使用して必要な情報を取得できますか。
戻りアドレスとdladdr()
関数を使用して関数名を抽出できました。
私GDB
はこれを行うので、この情報を抽出することは可能でしょうか?
c++ - C++ 関数アドレス -- dladdr と backtrace() を使用
backtrace() を使用して、トレース目的で関数アドレスを取得したいと考えています。実行時に backtrace() から関数アドレスを保存し、後で分析に使用したい (たとえば、関数名をロードバックし、dladdr() を使用して呼び出し統計などを調べる)。それをしている間、私はクラスメンバー関数の静的アドレスを見ようとしていました.
Alib.so、ああ:
A.cpp
main.cpp
これは以下を出力します:
メインを複数回再実行すると、同じアドレスが返されます。main.cpp を次のように変更すると:
.so または main を再コンパイルしなくても、main 実行可能ファイルを実行するたびに出力が異なります。
これをチェックしている理由は、backtrace() を使用して現在のスタック関数の関数情報 (アドレス) をトレース用に取得したいためであり、非常によく似た動作をします。.so ライブラリ関数内で backtrace() を呼び出し、現在のスタック関数で backtrace() と dladdr() を使用して関数のシンボル情報を取得しようとしました。関数アドレスを .so に出力するのと main で出力すると、異なるアドレスが得られます。dladdr() の関数アドレスを使用して、シンボル名などの情報を取得するにはどうすればよいですか?
.so と main() で異なる方法でマップされたクラス メンバー関数アドレスに何かありますか?
編集:問題を説明するために、言葉を変えてより多くのコード例を挙げてください。