問題タブ [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.

0 投票する
1 に答える
1476 参照

linker - プログラムで ELF 共有ライブラリ シンボルを一覧表示する方法

私の C 共有ライブラリで、別の共有ライブラリを dlopen() し、このライブラリが持っているエクスポートされたシンボルのリストを取得したいと考えています。

nm/objdump を実行せずにプログラムでそれを行う方法はありますか?

二次的な質問として: dlopen() の後にこの 2 番目のライブラリがロードされたベース アドレスを取得するにはどうすればよいですか?

私は次のことを試しました:

これは印刷します

「ベース アドレスは 0x6862696c です」

ただし、ライブラリはそこにはありません。

[ /proc/pid/maps 出力: ]

l_addr は実際のライブラリ ベース アドレスではなく、実行可能ヘッダーからのオフセットであることが示唆されていますが、そのヘッダー アドレスを見つける方法がわかりません。

0 投票する
1 に答える
711 参照

c - C - c 関数 open() はどのライブラリ (.so ファイル) にありますか? また、任意の関数についてそれを見つけるにはどうすればよいですか?

関数 open() があるライブラリを見つけるにはどうすればよいですか? 同様に、その関数を含む実際の「xxxxxx.so」ファイルの名前は? また、通常、他の機能についてこの情報を取得できる場所はありますか?

0 投票する
1 に答える
2312 参照

c - dlsym() を使用して静的にリンクされたライブラリ内の変数を探す

コンパイルオプションに応じて、多くのシンボルを定義する場合と定義しない場合がある、いくつかの静的ライブラリにリンクするプログラムがあります。OS X ではdlsym(3)、シンボル アドレスを取得するために NULL ハンドルを使用します。ただし、Linux ではdlsym(3)常に NULL を返します。

関数と変数を含む静的ライブラリにリンクし、それらのアドレスを出力しようとする単純なプログラム (以下のソース) を考えてみましょう。プログラムにシンボルが含まれていることを確認できます。

ただし、プログラムを実行すると、どちらも見つけることができません。

glibc の の実装を使用して、私たちがやろうとしていることは Linux で可能dlsym(3)ですか?

 メイクファイル

(スペースが空いてすみません)

libtest.h

libtest.c

test.c

0 投票する
1 に答える
978 参照

c - C のポインター型に関する POSIX の制限

バックグラウンド

POSIX 標準は、多くのライブラリ関数とその他の識別子を C 言語に追加します。関数の説明では、次のdlsym()ように述べています(強調して):

あらすじ

説明

dlsym () 関数は、シンボル (関数識別子またはデータ オブジェクト識別子)のアドレスを取得します...

void *C 標準では、関数ポインターを に変換できること、またはポインターのサイズが同じであることさえ保証されていません。これにより、C の型システムに追加の制限が効果的に追加されます。

質問

私の質問はこれです:

  • C の型システムのこの制限に対する規範的な参照はありますか、それとも特定のライブラリ関数の説明からのみ推測できますか?
  • POSIX はシステム上でも実装可能ですか? sizeof (function pointer) > sizeof (void *)

参考文献

0 投票する
2 に答える
144 参照

c - 関数ごとに dlsym (モジュール、「関数名」) を防ぐ方法はありますか?

共有ライブラリ (より正確には PKCS#11 モジュール) があり、ライブラリを読み込んで使用できるアプリケーションを作成したいと考えています。

現在、次のように dlsym を使用しています。

しかし、ライブラリには約 68 の関数があります。本当の問題は、すべての関数に対して本当にこれを行う必要があるのでしょうか? すべての関数のリストを持つ構造体はありますか? 多分私はdlsymを間違って使用しています...

0 投票する
1 に答える
363 参照

c - dlsym() 変数を出力するには?

私は自分のライブラリを書きます:

システム名を印刷したい場合:

私は次のようなものを得ます:

これは、char a のキャストが間違っていることが原因だと思います。1 つのファイルでテストしたところ、dlsym に割り当てられた char は正常に動作しました。

メイクファイル:

0 投票する
1 に答える
2025 参照

c++ - 共有ライブラリで atexit を呼び出す方法は?

共有ライブラリでは、関数 func1() に atexit(terminate_global) があり、この共有ライブラリには「属性((コンストラクタ))」と「属性((デストラクタ))」 がありません。
したがって、プログラム フローは次のようになります。
1) アプリケーションは、dlopen を使用して共有ライブラリを読み込みます。
2) アプリケーションは、dlsym を使用して func1() を呼び出します。
3) func1() には atexit(terminate_global) があります。
4) func1() が戻ります。
5) アプリケーションは dlclose を呼び出して、ライブラリの割り当てを解除します。

上記の手順では、ライブラリがアンロードされたときに atexit() が呼び出されていません。では、共有ライブラリの割り当てを解除するときに atexit() を呼び出す必要がある場合、正しい方法は何でしょうか? atexit 登録関数を呼び出せるように、属性((コンストラクタ)) および属性((デストラクタ)) 関数属性を使用してルーチンをエクスポートする必要がありますか?