問題タブ [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.
c++ - 静的変数とグローバル変数の両方が、Linux の動的ライブラリと静的ライブラリで異なるアドレスを示しますか?
CentOS 6.5で遭遇しました。私がオンラインで検索したように、動的ライブラリを使用する場合、静的変数は Windows と Linux で異なる動作をします。つまり、次のように、Windows では変数の重複が発生しますが、Linux では発生しません 。
しかし、これを検証する小さなプログラムを書いたところ、Linux でも重複が発生することがわかりました。4 つのファイルを含む小さなプログラムを次に示します。
(1) ああ
(2) A.cpp
(3) d.cpp
(4) main.cpp
プログラムをコンパイルして実行する方法は次のとおりです。
動的部分d.cpp
と静的部分の両方で、およびで宣言されmain.cpp
た変数a
および を使用します。そして、これが私のマシンでのプログラムの結果です。b
A.cpp
A.h
a
グローバル変数と静的変数のアドレスb
は動的部分と静的部分で同じでなければならないので、これは私を大いに驚かせます。またa
、静的部分の変更は動的部分には影響しないようa
です。誰かが私の質問に答えてくれますか、またはプログラムの間違いを見つけるのを手伝ってくれますか?
ところで、正直なところ、私が取り組んでいる別のプロジェクトでは、動的ライブラリと静的ライブラリでグローバル変数のアドレスが同じであることがわかりました。しかし、そのプロジェクトは大きすぎるため、動作を再現するための小さなプログラムを提供することはできません。
どうもありがとう !
c - 関数セグメント フォルトへのポインタ
ユーザー定義のシェルを構築しています。関数へのポインタの配列、つまり、いつでも呼び出すことができる共有ライブラリ関数でいっぱいの配列があります。
ここで typedef します
ポインタを配列に配置する初期化が正しく機能していることをデバッグして確認しましたが、安全な対策のためのコードは次のとおりです...
これがセグフォルトが発生する場所です-関数を呼び出すと
私の共有ライブラリは確かに argv をパラメータとして取ります - だから私はこれが問題だとは思いません。
私が言ったように、デバッグすると、ポインターの配列がアドレスで満たされていることがわかります。どういうわけか間違った住所かもしれないと思いますが、私はここでレンガの壁にいます.
何か案は?
そのため、関数呼び出しへのポインターをテストして、同じファイルで独自の関数型 (void *) を定義しました。
関数はシェルに何かを出力するだけです
次に、実行を強制するために execute_function 関数に条件を追加しました...
そしてそれは動作しますWOOHOO!
そのため、動的リンクに問題があり、表示できません。または、私の共有ライブラリで - 同じプロジェクトの別のシェルコードで動作する成功したライブラリをすでに構築しているため、これはありそうもありません。
では、動的リンクの何が問題なのですか?
共有ライブラリの例を次に示します
c++ - dlsym() 関数が間違った関数アドレスを返す (他のライブラリの MIPS スタブ セクション内)
別のプログラムでプラグインとしてロードできる共有ライブラリ (.so) を開発しています。そのプログラムは、他のライブラリのセットから構成されています。そのライブラリの 1 つである libA.so は、独自の実装 ::operator new() および ::operator delete() をエクスポートします。しかし、私はこの new と delete の実装を使用したくなく、独自の実装 (私のライブラリに静的にリンクされています) を使用したくありません。すべて正常に動作しますが、libA.so には割り当てられたメモリへのポインタを返す関数があり、libA.so から operator delete を呼び出して解放する必要があります。そのため、libA.so から _ZdlPv シンボルのアドレスが必要です。
_ZdlPv のアドレスを取得するために関数 dlsym を使用しています: dlsym(RTLD_DEFAULT, "_ZdlPv")。演算子削除 (_ZdlPv シンボル) の私自身の実装は、共有ライブラリの動的シンボル テーブルに存在しないため、libA.so で定義された演算子 delete() のアドレスを取得することを期待しています。
しかし、dlsym 関数から完全に間違った結果が得られました。別のライブラリ libB.so 内に存在するアドレスを返します。また、libB.so には _ZdlPv シンボルの定義が含まれていませんが、このシンボルが必要です (そのライブラリでは未定義です)。また、dlsym() によって返されるアドレスは、libB.so の .MIPS.stubs セクションを指します。これは PLT のようなものです (ただし、MIPS アーキテクチャでは -- はい、MIPS 向けに開発しています)。そして、dlsym によって返されたアドレスで関数を呼び出すと、スレッドが終了します。デバッグが難しい...
それはここで間違っていますか?dlsym() が機能しないのはなぜですか? 私が知っているように、$gp レジスターは「グローバル・リンケージ・テーブル」へのポインターを保持します。すべての共有ライブラリには独自のリンケージ テーブルがありますか? スタブ セクションから関数を呼び出すと、gp には正しい値が必要です。また、他のライブラリ (libB.so) のスタブ セクションからコードを呼び出している場合、このスレッドがクラッシュするため、間違った $gp 値でコードを呼び出していますか?
しかし、なぜ dlsym() は他の (libB.so) ライブラリのスタブ セクションのコードへのポインタを返すのでしょうか? これは、ライブラリのスタブ セクションに _ZdlPv シンボルが含まれていないためです。これは、ライブラリの動的シンボル テーブルに存在しないためですか?
私の仮定が正しければ、理解できませんでしたが、MIPS プラットフォームで dlsym() を使用して他のライブラリから任意関数を呼び出すにはどうすればよいですか?
c++ - How to map dlsym to a non-static C++ member function in a manner similar to a C function?
I studied and tested the following URLS closely, Calling function in shared library (Linux) get Segmentation Fault as well as https://git.xeserv.us/Quora/dlsym-example/src/master/testprog.c. My question is how to map dlsym to a non-static C++ member function similar to this C function example. If I substitute C function syntax for a non-static C++ member function , I get a no-op.
Any help is appreciated.
ios - IPA の使用時に iOS ライブラリがロードされない
dlsym
私のコードは、 (私の手に負えない理由で)を使用して外部ライブラリを使用しています。
Xcode がライブラリを見つけるために、次の 2 つのことを行う必要がありました。
-force_load "$(SRCROOT)/pathTo/myLibrary.a"
- デッドコード ストリッピング: いいえ
これは、デバッグ プロファイルで実行する場合に正常に機能します。シミュレーターと物理デバイスの両方で、ライブラリが読み込まれて動作します。
ただし、AdHoc IPA ファイルを作成してデバイスにインストールすると、この同じライブラリが見つかりません。
違いは何ですか?
ios - アプリ外で共有フレームワークのメソッドをスウィズルする
s のSwizzling カテゴリを実装しました。これは、提示されたときに sUIViewController
だけです。NSlog
明らかに、これはスウィズルされたアプリケーション内でのみ正常に機能しますが、共有を「フック」してpresentViewController
、アプリケーションの外部でビューを表示するときに呼び出されるようにすることもできるかどうか疑問に思っていました。私は、グローバルイメージシンボルへのポインターを取得するよりも、UIViewController
動的にロードすることを考えていました。dlopen
出来ますか?そうでない場合は、そうではありませんか?
免責事項 - 私は自分の開発デバイスでデバッグするためにこれを行っており、アプリを App Store にアップロードしません。