問題タブ [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 は syscall をインターセプトできませんが、libcall のみをインターセプトできますか?
私のコードは でうまく動作しますがmalloc
、 では動作しませんmmap
。コードは以下のとおりです。
main.c
preload.c
それをコンパイルする
で実行しますLD_PRELOAD
strace で実行するには
からの出力は へのLD_PRELOAD
呼び出しをフックせず、 へmmap
の呼び出しのみをフックしますmalloc
。一方、 を使用して実行すると、が複数回呼び出されstrace
たことを示す出力が表示されます。mmap
この結果は私を困惑させます。mmap
が実際に呼び出されたと仮定するとmain.c
(私は を介して推測しますmalloc
)、どうしてpreload.c
インターセプトできないのmmap
ですか?
PS: 私のプラットフォームは、Linux カーネル 3.13 を搭載した Ubuntu 14.04 です。
PS2: syscall とは、libc の syscall ラッパーを意味します (ただし、これが質問に違いをもたらすかどうかはわかりません)。
linux - root アクセスなしで Linux プロセスに仮想ファイルシステムを提示する
ユーザー空間ファイルシステムを特定の Linux プロセスに提示する方法を探していますが、root アクセス権がありません。
明白な答えは FUSE ですが、ルート アクセスがないとカーネル モジュールをロードできないため、FUSE は問題外のようです (LD_PRELOAD する方法がない限り?)。
次善の策は、FUSE が VFS レイヤーで行うのと同じように、関連する FS 呼び出しをインターセプトして変換する何かを使用した LD_PRELOAD のようです。
だから私の質問は:
- FUSE のような LD_PRELOAD 可能なファイルシステムは存在しますか?
- プロセスのいくつかの FS 呼び出しインターセプトを LD_PRELOAD する場合、おそらく FS インターセプトがフォークまたは子によって継承されないなど、問題はありますか?
r - RStudio - LD_PREOAD の問題
サーバー自体で R を使用する場合には発生しない RStudio で RDOBC エラーが発生します。
R -
Rスタジオ -
環境変数を確認し、すべてのユーザーに対して以下が正しいことを確認しました
同じ環境設定の RStudio ではなく R で機能する理由は何ですか?
rust - ファイルスコープ可変静的 HashSet/Vec/etc
プログラムの呼び出しをインターセプトする C リンケージ関数を作成したいのLD_PRELOAD
ですが、Rust でインターセプト関数を実装しています。
呼び出しを傍受するための を作成するのに問題はありませんpub extern fn
が、メタデータを受け入れるために傍受している関数の署名を変更できないため、プログラムのグローバル状態からどこかで読み書きしたいと思います。ヒープ割り当ては必ずしも必要ではありません。HashSet
またはVec
エントリの静的に初期化された大規模なプールを使用できます。ただし、プログラムの実行中にコレクションの要素を追加および削除できる必要があります。
このパターンが多くの Rust 設計目標に反していることは認識していますが、それでも私には正当な使用例のように思えます。
私はRustが初めてなので、これをunsafe
行うオプションがあることを願っています。
コード例を見ると便利な場合:
static
...デストラクタを必要とする、またはヒープ割り当てを行うストレージを使用できないため、失敗します。そして、有能な構造lazy_static!
を許可しません。mut
理想的には、HashSet<c_int>
. それがうまくいかない場合は、 を試すことができると思いますVec::from_elem(100, 0)
。ある種の歩哨値を指定する必要があるため、これは理想的ではありませんが、機能する場合は満足できると思います.
php - mod_php を使用して、Apache で実行されている PHP スクリプトで connect() をオーバーライドします。
PHPがmod_php経由で有効になっているときに、ApacheリクエストでPHPスクリプト内から呼び出されたconnect()システムコールをオーバーライドする方法は?
カスタム connect() バージョンがcustom-connect.cで定義されています。
私はそれをコンパイルします:
内部で connect() を呼び出す単純なスクリプトcurl-test.phpがあります。
コマンド ラインから LD_PRELOAD を使用してスクリプトを実行すると、次のようになります。
私のカスタム connect() が何かを/tmp/connect.logに記録していることがわかります:
コマンドラインからはうまくいくようです。しかし、mod_php を介して PHP を有効にして Apache からスクリプトを実行する場合、自分のバージョンで connect() をオーバーライドするにはどうすればよいでしょうか? LD_PRELOAD も使用する必要がありますか? はいの場合、それを構成する方法は?
c - malloc を再コーディングする共有ライブラリのエラー
共有ライブラリを作成する独自のバージョンを実装しようとしてmalloc
いますが、問題に直面しています。このメッセージで my を実行するmalloc
と、次のLD_PRELOAD
メッセージが表示されます。
ld.so によって矛盾が検出されました: dl-load.c: 2325: _dl_map_object: アサーション nsid < _rtld_local._dl_nns が失敗しました!
これは、コマンド ls が機能するため、コマンドls -lRa /home
My path is okを起動すると表示されます。LD_PRELOAD
私を助けてくれてありがとう!
c++ - 複数の LD_REPLOAD 共有変数
私の目的は非常に単純です。mongoose サーバーを起動すると、サーバーは私が定義した変数を初期化します。これを行うために、私はフックし__libc_start_main
ました。次に、サーバーがリクエストを受信すると、その初期化された変数を出力します。これを行うために、私はフックしrecv
ました。以下は私のコードです。
ただし、makefile を実行すると、次のエラーが表示invalid conversion from ‘void*’ to ‘ssize_t (*)(int, void*, size_t, int)
されdlsym(RTLD_NEXT, "recv");
ます。私の別の質問は、この方法で目標を達成できるかどうかです。そうでない場合、正しい方法は何ですか?
gcc - LD_PRELOAD で指定された lib をロードできません
LD_PRELOAD を使用して so をロードするときに、いくつかの問題が発生しました。
手順は次のとおりです。
libtest.c:
/li>gcc -o libtest.so libtest.c -fPIC --shared
export LD_PRELOAD=
pwd
/libtest.somain.c
extern void fun(); void main() { fun() }
gcc -o メイン -L。main.c -ltest
それで
ldd main
ldd main linux-vdso.so.1=>(0x00007ffff7ffd000) /home/shiyanlou/Code/libtest.so(0x00007ffff7df9000) libtest.so=>not found libc.so.6=>/lib/x86_64-linux-gnu/libc.so.6 (0x00007ffffa29000) /lib64/ld-linux-x86-64.so.2 (0x0000555555554000)
- 促進する main を実行
./main
します: 共有ライブラリのロード中にエラーが発生しました: libtest.so。共有オブジェクト ファイルを開けません: そのようなファイルまたはディレクトリはありません。
LD_PRELOAD変数をエクスポートした後、libtest.soが見つからないというプロンプトが表示されるのはなぜだろうか。ただし、LD_PRELOAD を使用して別の共有ライブラリ (「libc.so」ではない) を指定し、malloc 関数を挿入しようとしましたが、うまくいきました。リンク時に使用されなかった共有ライブラリに対してのみ LD_PRELOAD が機能するのはなぜですか???