2

ロードされているライブラリに引数を渡すことは可能ですかLD_PRELOAD:

LD_PRELOAD=lib.so ./program

このライブラリに引数を渡すにはどうすればよいですか?

4

1 に答える 1

7

通常、環境変数を使用してこれを行います。たとえば、次のようなものがあります。

#include <iostream>
#include <stdlib.h>

void init() __attribute__ ((constructor));
void init() {
  std::cout << "Init: " << getenv("MYLIB") << std::endl;
}

次のことができます。

MYLIB=hi LD_PRELOAD=./test.so /bin/echo
初期: こんにちは

これはコンストラクター ( GCC 拡張機能) で使用する必要はありませんが、多くの場合、それらを使用するのに便利な場所です。

私が過去に行ったことは、これを「通常の」アプリケーションのように見えるシェル スクリプト ラッパーと組み合わせて使用​​することでした。シェル スクリプトはその引数を受け取り、ライブラリが必要とする環境変数にそれらをプッシュしてexecから、介入するプログラムをロードします。あまりにも壊れやすく邪魔にならずに、ユーザーにそのように「感じ」ます。

/proc/self/cmdline必要に応じて、現在のプロセスのコマンド ラインを直接読み取るために read することで、これを行うこともできます。個人的には、あなたが取り組んでいるプロセスにできるだけ干渉することは避けたいと思います。

于 2012-07-15T13:20:34.997 に答える