問題タブ [ld-preload]
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 - LD_PRELOAD でロードされたライブラリ コンストラクターから実行可能ファイルを呼び出すにはどうすればよいですか?
プリロードしたライブラリから実行可能ファイルを呼び出せるようにしたいと考えています。これをする -
私は単純な実行可能ファイルを持っています
main.c
これはでコンパイルされます
callme
前に呼び出されるように、ライブラリをプリロードしたいと思いmain
ます。
preload.c
これはでコンパイルされます
だから今私は持っていa.out
ますlibpreload.so
これを実行しようとすると
これをデバッグするために私は試しました
これからの出力には、この行が含まれます
したがって、callme シンボルの正しい場所を探しているように見えます。
からの出力nm a.out
には次の行が含まれます
callme を a.out の外部からアクセスできるようにコンパイルする必要がありますか?
どんな助けでも大歓迎です。
cython - Cython GIL SIGSEGV
Cython から LD_PRELOAD 経由で呼び出しをインターセプトしようとすると、セグメンテーション違反が発生します。よくわかりませんが、なぜですか?
サンプル テスト ケースを含むプロジェクトは、https://github.com/CraigJPerry/pyshim/blob/master/pyshim/pyshim.pyxで入手できます。
Python ランタイムが正しく初期化されていない可能性があると思いますが、これが問題の原因ですか?
c++ - cはどのように定数文字列にメモリを割り当てますか?
malloc、memcpy、およびfree関数を変更し、この libhooker を LD_PRELOAD で使用したいと考えています。
それらを変更し、いくつかのテストケースでテストします。しかし、そのうちの 1 つで、私のコードが正しく動作せず、その理由がわかりません。
テストケース:
私のコード出力:
c が定数文字列にメモリを割り当てる方法と、コードが間違っている理由がわかりません。
前もって感謝します。
c++ - LD_PRELOAD が期待どおりに機能しない
プログラムの実行前にプリロードできる次のライブラリを検討してください。
問題は、グローバル変数のコンストラクターgoodbye
は常に呼び出されますが、次のような一部のプログラムではデストラクタが呼び出されないことですls
。
他の一部のプログラムでは、デストラクタが期待どおりに呼び出されます。
最初のケースでデストラクタが呼び出されない理由を説明できますか? EDIT:上記の質問はすでに回答されています。つまり、プログラムは_exit()、abort()を使用して終了する可能性があります。
でも:
プリロードされたプログラムの終了時に特定の関数を強制的に呼び出す方法はありますか?
c++ - 別のスレッドで main() の終了を監視する C++
C++ でプロセスが終了する前に、メイン関数の最後をキャッチし、別のスレッドで追加の操作を実行できるようにしたいと考えています。
メインスレッドへのハンドルを取得して参加しようとしましたが、 std::this_thread/boost::this_thread では現在のスレッドのハンドルにアクセスできないようです。
私がやりたいことは、基本的に次のとおりです。
私のシナリオでは、thread_function スレッドは LD_PRELOAD を使用して共有ライブラリで呼び出されるため、これら 2 つの関数には共有状態がありませんが、後でmain()を呼び出すスレッドから何でも渡すことができます。メイン関数の最後をキャッチすることはできないかもしれませんが、誰かがこれについて知っている場合に備えて質問したいと思います。
c++ - クラスメソッドが存在するかどうかを実行時に確認する方法
LD_PRELOAD を使用して他のコードの異なるバージョンにプリロードされるライブラリを作成しています (これは変更したくない/変更できません)。以前のバージョンでは、クラス A のクラス メソッド A::foo() が存在し、それ以降のバージョンでは存在しません。
グローバル (C ライク) 関数の場合、属性((weak)) メカニズムを使用して、コードの実行時に関数が実際に定義されているかどうかを確認しています。
それはクラスメンバーにはうまくいかないようです。
コンパイル時エラーは次のとおりです。
コンパイル時に既知の定義に依存しない存在をチェックする方法はありますか?
関数の存在を確認するためにテンプレートを作成することは可能ですか? のようにテンプレートを使用できません。I テンプレートはコンパイル中に評価されるためです。
また、関数が C/C++ に存在するかどうかを確認する方法は役に立ちませんでした。
c - 関数プロトタイプを見つける方法は? (LD_PRELOAD に必要)
私はクローズドソースのライブラリをいくつか持っています。draw_something
このライブラリ内で定義および呼び出される関数の周りにフック (LD_PRELOAD) を作成する必要があります。私はそれを無効にしたいです (そのアクションの代わりにアクションを実行しません)。objdump
私のために関数をうまく逆アセンブルしましたが、私はasmの初心者です。ライブラリは MIPS アーキテクチャ用に構築されています。
アセンブリから C 関数プロトタイプを抽出する方法がわかりません。出来ますか?関数が受け取るパラメーターの数と、それが返すものを教えてください。このテーマに関するドキュメントやブログがある場合は、そのリンクを教えてください。
UPD:コンパイラはmips-linux-gnu-gcc (Sourcery G++ Lite 4.3-51) 4.3.2
逆アセンブル機能: