問題タブ [dlopen]
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++ - カスタムmysqlプラグインをロードしようとしたときの未定義の参照-デバッグ方法は?
Key-Valueストアをバックエンドとして使用する独自のMySQLストレージエンジンを作成しようとしています。
これで、必須部分を実装する最初のバージョンを作成し、MySQLソースインスタンスをコンパイル、リンク、およびインストールできるようになりました。その後、mysqlコンソールで次のコマンドを使用して新しいプラグインをロードしようとしました。
私が得るエラーは次のとおりです。
今、私はこの問題をデバッグする方法がわかりません。Key-Valueストアのクライアントライブラリは-std=c ++ 0xコンパイラフラグを使用しており、これが問題の一部である可能性があると思い始めています。しかし、lddで確認すると、ストレージエンジンは、mysqlで提供されている他のエンジンと同じlibstdc ++バージョンにリンクしており、問題なくロードできます。
この問題がどこから来ているのかを理解する方法に何かトリックはありますか?
編集:見つからないシンボルは
これはlibstdc++(STL)からのもののように見え、おそらくstd::setの使用によるものです。これはどのように起こりますか?
c++ - Solarisプロセスはどのようにして独自のシンボルテーブルを読み取ることができますか?
Solarisプロセスがあります。これは、いくつかのライブラリld
とともにロードされるC++アプリケーションです。.so
このアプリケーションには、呼び出し元の関数でリターンアドレスを取得し、その呼び出し元の関数の名前を判別しようとする関数があります。
そのために使用する場合dladdr(3)
、Dl_info::dli_snameに期待するものが常に表示されるとは限りません。ポインタ値の下またはポインタ値に最も近くない関数の名前を返すように見えます。ポインタ値を取得しての出力を見ると、nm
その値を期待どおりの関数に一致させることができます。
プロセスのシンボルマップを取得し、を使用せずに関数名を検索する方法があるかどうか疑問に思っていますdladdr(3)
。実行可能ファイル自体だけでなく、実行可能ファイルがロードしたすべての.so
ライブラリのシンボルマップを取得することに特に興味があります。
Solaris10 / SPARCで実行していて、gcc4.2.xを使用しています。
ありがとうございました!
c - dlopen: 未解決のシンボルをトラップして、発生時に「手動で」解決することは可能ですか?
未解決のシンボル参照が発生したときにトラップして、必要に応じてシンボルを解決しようとする関数が呼び出されるようにすることは可能ですか? または、ライブラリ ファイルを作成して dlopen することなく、実行時に動的シンボル テーブルに新しいシンボルを追加することは可能ですか? GCC を使用して、GNU/Linux を使用しています。(他の Unix への移植性は良いことですが、重要な問題ではありません。)
前もって感謝します!
編集:私がやろうとしていることについてもっと詳しく説明する必要がありました。コンパイルされた (dlopen された) モジュールと解釈されたモジュールの両方をサポートすることが期待される、プログラミング言語用のインタープリターを作成したいと考えています。コンパイルされたモジュールから別の場所で定義された関数への呼び出しをリンカで解決して、呼び出しごとに関数のルックアップを回避したかったのですが、解釈されたコードへの呼び出しは未解決のままでした。これらの呼び出しをトラップして、必要に応じて適切な解釈された関数を呼び出すことができるようにしたいと考えました (または、関数が存在しない場合はエラーを通知します)。
unix - dlopen と共有オブジェクトの「ポインタ」
dlopen()
別の共有オブジェクトを「指す」共有オブジェクトを正常に呼び出すことは可能ですか? たとえば、ライブラリを動的に開きたいと思います/usr/lib/libpanel.so
。ただし、これは実際のライブラリではありません。むしろ、次を「指している」/usr/lib/libpanelw.so
:
エラーが発生dlopen()
します。file too short
これらの種類のライブラリを正常にロードする方法はありますか?
(ボーナス質問: これらの種類のライブラリの実際の用語は何ですか?)
c++ - 共有オブジェクトからのアプリのオブジェクトの使用
私は今少し混乱しています。昨日、g ++で-rdynamicを使用しても、未定義のシンボルがありました。しかし、今はエラーがなく、それはさらに厄介です。
私の場合を少し説明するために、共有オブジェクトのようなプラグインを実行したいと思います。どちらが最善の方法かはまだ決めていません。
A)私の共有オブジェクトにはすべて、パラメーターを使用して呼び出されるレジスターと呼ばれる関数があります。これはプラグインマネージャーになります。
B)共有オブジェクトはクラスを定義し、ロード時にそのクラスのインスタンスを作成します。そのクラスのコンストラクターでは、アプリから静的シングルトンを取得し、自分で自動登録しようとします。
私が知る限り、私の最初の試みは今のところそれほど素晴らしいものではありませんでした。
main.cpp
main.hpp
two.cpp
そのサンプルでは、S::sharedが共有する静的オブジェクトです。この簡単なテストでは、intのみを使用しますが、将来的にはクラスのインスタンスになります。
ケースA)での私の唯一の試みは、セグメンテーション違反でした...私は本当に何を逃したのかわかりません。
//これまでの結果(今日)
c - 私が20.0を持っているとき、それは> = 17.0.0が必要であると不平を言うhighgui
これは一種の醜いものですが、私は立ち往生しているので、ここに行きます:
opencv (highgui およびその他の部分) を使用し、最終的には ffmpeg (libavfilter) によって読み込まれる動的ライブラリ (以降、「mylib.dylib」) を作成しています。ライブラリは問題なくコンパイルされます。しかし、ffmpeg 内から dlopen() しようとすると、次のエラーが発生します。
ただし、otool -L /usr/local/lib/libpng15.15.dylib を実行すると、次のようになります。
前回チェックしたとき、20.0.0 は 17.0.0 よりも新しいものであり、highgui が必要としているものです。
おそらくアーキテクチャの問題だと思いました(私は Lion を実行している Mac を使用しているため、i386/x86_64 で多くの問題に遭遇しました)が、すべてのライブラリで「file」を実行すると、すべて(highgui、libpng、 mylib) は、Mach-O 64 ビットの動的にリンクされた共有ライブラリ x86_64 です。
私のシステムのどこかに別のバージョンの libpng が隠れているのではないかと思いましたが、dlopen エラーは具体的に /usr/local/lib/libpng15.15.dylib を指しています。
ここで明らかに欠けているものがあります。確かに、私はこれらの動的ライブラリがどのようにリンクするかについて専門家ではありません。そのため、関連する情報を含めるのを忘れていたら、すみません。
更新 言及するのを忘れました-XCode(dlopenエラーなし)を介してffmpegを実行すると、libが正常に動作するため、XCodeが設定している環境変数と関係があると思われます。
ありがとう!
解決策 1. 私は MAMP を使用していましたが、php スクリプトを介して ffmpeg を呼び出していたので、(驚きの驚き) libpng 16.0.0 を含む独自の dylib のセットを使用していました。
c++ - Ld は、静的にリンクされたシンボルを魔法のようにオーバーライドします
数日間、私たちは非常に奇妙な問題に取り組んでいます。
サードパーティ (MATLAB) プログラムが私たちの共有ライブラリを使用すると、何らかの形でシンボル (正確にはブースト) を独自のもので上書きします。これらのシンボルは静的にリンクされ、(!!) ローカルです。
これが取り引きです - 私たちはブースト 1.47 を使用し、MATLAB はブースト 1.40 を持っています。現在、ライブラリは、OUR ライブラリからブースト (正規表現) への呼び出しで segfaults を呼び出します。
だから、ここに魔法があります:
- ライブラリの依存関係はありません、ldd:
- Cxx シンボル (公開シンボルはバイナリ互換性のために POC C です) はライブラリ nm: からエクスポートされません。
- それでも、それは彼らのブーストを使用します。どうやって?スタック トレース (パス カット):
MATLAB は RTLD_NOW フラグのみで dlopen を実行することが知られています。
皆さん、私と一緒に考えてください。今、私はこれを修正することさえ切望していますが、単純に ld&elf の動作を理解したいと思っています。
編集:小さな追加の質問:特別なリンカオプションなしで、linux .soライブラリのシンボルがアドレスでリンクされないことをどのように理解しましたか?では、静的にリンクされたローカル シンボルも実行時に解決されるのでしょうか?
dlopen - Mac の RTLD_FIRST は Linux の RTLD_DEEP_BIND の仕事をしますか?
Linux での RTLD_DEEP_BIND についての私の理解では、メイン プログラムに関数 A() があり、動的にリンクされたライブラリ (lib と呼びます) に 2 つの関数 A() と B() があり、B は次のように定義されています。
次に、 B() への呼び出しは、常にライブラリから A を呼び出すことになります。これは RTLD_FIRST が Mac で行う仕事ですか? 申し訳ありません-ドキュメントに混乱しています。
c++ - 静的ライブラリと動的ライブラリ
静的ライブラリと動的ライブラリについて読みました。私の質問は少し具体的です
dlopen dlclose:
これは、動的リンクライブラリの動作です。
私の質問は、ライブラリlibUtlitiesをリンクするかどうかです
EXEを実行すると、libUtlitiesがメモリにロードされてから、最初にそこで機能を使用します。
1.静的リンクまたは動的リンクです。?
macos - SIMBL プラグインがフレームワークのロードに失敗する
コンソールで、次のエラーが発生します。
ファイルFScriptAnywhere.bundle/Contents/Frameworks/FScript.framework/Versions/A/FScript
が存在します。したがって、エラー/問題がわかりません。
何か案が?