C++を使用しているSolaris 10の現在の実行可能ファイルから関数のアドレスを知る必要があります(私はGNU g ++ 4.9.2を使用しています)。たとえば、void doSomething(const char * p)という関数があります。これは、現在の実行可能ファイルで定義されている場合と定義されていない場合があります。だから、私は、現在の実行可能ファイル内の関数を検索したい場合は、存在する場合は、他のいくつかのデフォルトの操作を行う呼び出してください。それ、どうやったら出来るの? dlsymは助けますか? 構文と変更された名前で私を助けてください。現在の実行可能ファイルから関数アドレスを取得する方法は?
答えて
nm exec
を実行すると、実行可能ファイルにシンボルの一覧が表示されます。共有ライブラリからシンボルを取得しようとしている場合は、nm
シンボルのライブラリも使用できます。あなたが欲しいものを選んで、何かのようにそれを読み込む...
void* handle = dlopen(NULL, RTLD_LAZY);
void* ptr = dlsym(handle, "mangled_name_you_got_from_nm");
あなたはおそらくあなたがに(当然、変化するようなものを経由してロードされている関数の関数ポインタ型にキャストしたいと思うでしょうけど適切な関数ポインタ型)...
void* handle = dlopen(NULL, RTLD_LAZY);
auto ptr = reinterpret_cast<int(*)(int)>(dlsym(handle, "mangled_name_you_got_from_nm"));
Solaris 10にはnmと同等のものはありますか?それは私が手口の名前を取得するのに役立ちます –
[elfdump -S](https://docs.oracle.com/cd/E26502_01/html/E29030/elfdump-1.html#REFMAN1elfdump-1) – yugr
これで行くことができますこれは答えには2つの欠点があります。(1)コンパイラ間で、または同じコンパイラの異なるバージョン間でも名前の変更が変わる可能性があります。 (2)メインの実行可能ファイルが '-rdynamic'(または同等のもの)とリンクされていない限り、関数は動的シンボルテーブルにエクスポートされず、' dlsym'は 'NULL'を返します。 –
「が定義されていればfoo()
を呼び出し、それがない場合は、何もしない」のライブラリにはかなり一般的である必要があります。
一般的な例の1つは、プログラムがスレッドとリンクされている場合はpthread_mutex_lock
とpthread_mutex_unlock
を呼び出し、それ以外の場合はロックを行わないことです。
弱い未解決シンボルは完璧な解決策です。
extern void foo() __attribute__((weak));
void MaybeCallFoo()
{
if (&foo == NULL) { printf("foo is not defined\n"); return; }
foo(); // It is defined, call it.
}
- 1. 現在の実行可能ファイル名を取得するglibc関数?
- 2. VBで現在の実行可能ファイルのフルパスを取得するには?
- 3. 現在のフォルダー内の実行可能ファイルのパスを取得するC++
- 4. 実行可能ファイルのテキストセクションの開始アドレスと終了アドレスを取得する
- 5. 関数からビジュアルモードで現在の行を取得する
- 6. ビジュアルスタジオコード実行可能ファイルを現在のコードで実行中
- 7. 現在実行中の実行可能ファイルを上書きする方法はありますか?
- 8. アセンブリ対プロセスから現在の実行可能ファイルの名前を取得していますか?
- 9. 関数をC++実行可能ファイルからLuaJITに公開する方法
- 10. 実行可能ファイルからコードを取得する
- 11. unittestのtestsuiteから現在実行中のテストケース名を取得する方法
- 12. スウィフト/現在の地図ピンのアドレスを取得する方法
- 13. 現在実行中のプロジェクトをVisual Studioエクステンションから取得する方法
- 14. アプリケーション内から現在のIPアドレスを取得する(VC++ 2005)
- 15. elf実行可能ファイルから構造内の要素のアドレス
- 16. 実行可能ファイルの複数/二重コード署名から情報を取得する方法
- 17. 現在実行中のファイルのディレクトリ名を取得する機能
- 18. Webページから実行可能ファイルを実行する方法は?
- 19. boto3から現在のインスタンスIDを取得する方法は?
- 20. コンテキストプロセッサから現在のアプリケーション名を取得する方法は?
- 21. Javaを使用して現在のキュウリの機能ファイル名を実行時に取得する方法
- 22. .jsファイルから.php関数ファイルを実行する方法
- 23. QML TreeViewの現在の行を取得する方法は?
- 24. は、IPアドレスから離れて現在位置を取得する他の方法は何ですか?
- 25. テストハーネスで現在実行可能なディレクトリを取得できません
- 26. 実行可能なシーケンス番号を取得する方法
- 27. ロール内の可能なファクトからMACアドレスを取得する
- 28. 現在の行番号を取得する方法は?
- 29. T-SQLストアドプロシージャからアプリケーションの実行可能ファイル名を取得する
- 30. MATLABから実行可能ファイルを実行するには?
はい、それはまさにdlsymの目的です。関数のポインタ(つまりアドレス)を(mangled)名前で返します。 – Cameron
@Cameron使用する引数(現在の実行可能ファイルから検索する)と変更された名前を手助けしてください –