問題タブ [dlsym]
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.
linker - プログラムで ELF 共有ライブラリ シンボルを一覧表示する方法
私の C 共有ライブラリで、別の共有ライブラリを dlopen() し、このライブラリが持っているエクスポートされたシンボルのリストを取得したいと考えています。
nm/objdump を実行せずにプログラムでそれを行う方法はありますか?
二次的な質問として: dlopen() の後にこの 2 番目のライブラリがロードされたベース アドレスを取得するにはどうすればよいですか?
私は次のことを試しました:
これは印刷します
「ベース アドレスは 0x6862696c です」
ただし、ライブラリはそこにはありません。
[ /proc/pid/maps 出力: ]
l_addr は実際のライブラリ ベース アドレスではなく、実行可能ヘッダーからのオフセットであることが示唆されていますが、そのヘッダー アドレスを見つける方法がわかりません。
c - C - c 関数 open() はどのライブラリ (.so ファイル) にありますか? また、任意の関数についてそれを見つけるにはどうすればよいですか?
関数 open() があるライブラリを見つけるにはどうすればよいですか? 同様に、その関数を含む実際の「xxxxxx.so」ファイルの名前は? また、通常、他の機能についてこの情報を取得できる場所はありますか?
c - dlsym() を使用して静的にリンクされたライブラリ内の変数を探す
コンパイルオプションに応じて、多くのシンボルを定義する場合と定義しない場合がある、いくつかの静的ライブラリにリンクするプログラムがあります。OS X ではdlsym(3)
、シンボル アドレスを取得するために NULL ハンドルを使用します。ただし、Linux ではdlsym(3)
常に NULL を返します。
関数と変数を含む静的ライブラリにリンクし、それらのアドレスを出力しようとする単純なプログラム (以下のソース) を考えてみましょう。プログラムにシンボルが含まれていることを確認できます。
ただし、プログラムを実行すると、どちらも見つけることができません。
glibc の の実装を使用して、私たちがやろうとしていることは Linux で可能dlsym(3)
ですか?
メイクファイル
(スペースが空いてすみません)
libtest.h
libtest.c
test.c
c - C のポインター型に関する POSIX の制限
バックグラウンド
POSIX 標準は、多くのライブラリ関数とその他の識別子を C 言語に追加します。関数の説明では、次のdlsym()
ように述べています(強調して):
あらすじ
説明
dlsym () 関数は、シンボル (関数識別子またはデータ オブジェクト識別子)のアドレスを取得します...
void *
C 標準では、関数ポインターを に変換できること、またはポインターのサイズが同じであることさえ保証されていません。これにより、C の型システムに追加の制限が効果的に追加されます。
質問
私の質問はこれです:
- C の型システムのこの制限に対する規範的な参照はありますか、それとも特定のライブラリ関数の説明からのみ推測できますか?
- POSIX はシステム上でも実装可能ですか?
sizeof (function pointer) > sizeof (void *)
参考文献
- C11 標準 (最終パブリック ドラフト): n1570
- The Open Groupの POSIX 標準: POSIX.1-2008
- POSIX
dlsym()
関数
c - 関数ごとに dlsym (モジュール、「関数名」) を防ぐ方法はありますか?
共有ライブラリ (より正確には PKCS#11 モジュール) があり、ライブラリを読み込んで使用できるアプリケーションを作成したいと考えています。
現在、次のように dlsym を使用しています。
しかし、ライブラリには約 68 の関数があります。本当の問題は、すべての関数に対して本当にこれを行う必要があるのでしょうか? すべての関数のリストを持つ構造体はありますか? 多分私はdlsymを間違って使用しています...
c - dlsym() 変数を出力するには?
私は自分のライブラリを書きます:
システム名を印刷したい場合:
私は次のようなものを得ます:
これは、char a のキャストが間違っていることが原因だと思います。1 つのファイルでテストしたところ、dlsym に割り当てられた char は正常に動作しました。
メイクファイル:
c++ - 共有ライブラリで atexit を呼び出す方法は?
共有ライブラリでは、関数 func1() に atexit(terminate_global) があり、この共有ライブラリには「属性((コンストラクタ))」と「属性((デストラクタ))」
がありません。
したがって、プログラム フローは次のようになります。
1) アプリケーションは、dlopen を使用して共有ライブラリを読み込みます。
2) アプリケーションは、dlsym を使用して func1() を呼び出します。
3) func1() には atexit(terminate_global) があります。
4) func1() が戻ります。
5) アプリケーションは dlclose を呼び出して、ライブラリの割り当てを解除します。
上記の手順では、ライブラリがアンロードされたときに atexit() が呼び出されていません。では、共有ライブラリの割り当てを解除するときに atexit() を呼び出す必要がある場合、正しい方法は何でしょうか? atexit 登録関数を呼び出せるように、属性((コンストラクタ)) および属性((デストラクタ)) 関数属性を使用してルーチンをエクスポートする必要がありますか?