1

LD_PRELOAD を使用して so をロードするときに、いくつかの問題が発生しました。

手順は次のとおりです。

  1. libtest.c:

    void fun()
    {
        return 
    }
    
  2. gcc -o libtest.so libtest.c -fPIC --shared

  3. export LD_PRELOAD= pwd/libtest.so

  4. main.c

    extern void fun(); void main() { fun() }

  5. gcc -o メイン -L。main.c -ltest

  6. それで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)

  7. 促進する main を実行./main します: 共有ライブラリのロード中にエラーが発生しました: libtest.so。共有オブジェクト ファイルを開けません: そのようなファイルまたはディレクトリはありません。

LD_PRELOAD変数をエクスポートした後、libtest.soが見つからないというプロンプトが表示されるのはなぜだろうか。ただし、LD_PRELOAD を使用して別の共有ライブラリ (「libc.so」ではない) を指定し、malloc 関数を挿入しようとしましたが、うまくいきました。リンク時に使用されなかった共有ライブラリに対してのみ LD_PRELOAD が機能するのはなぜですか???

4

2 に答える 2

1

*.so の 2 つのバージョンを作成する必要があります。デフォルトの動作を持ち、「-ltest」を介してロードおよびハードリンクされたもの。

次に、デフォルトの libtest.so をビルドnm -Bし、インターセプトすると予想されるシンボルが動的にリンクされていることを証明します。

次に、main.c を main.o にビルドし、main.o をチェックnmして、シンボルに extern 満たされていないリンケージ要件があることも確認します。

./main次に、main.o と libtest.so をリンクして実行します。デフォルトでこの./mainコピーを実行する必要があり、デフォルトの動作を示し、lddコマンドを介して正しい DSO への正しいパスも示します。

...

ここで、LD_PRELOAD バージョンを作成する手順を実行します。

これを と呼びますlibtest2.so。あなたは使用しません-ltest2

要点は、ビルドした人./mainは libtest2.so についてまったく知らないということです。ハード リンケージの依存関係はありません。

libtest2.so には、make foo() が別の文字列/数値を返すなどの代替動作があり、現在の目標は実行時にこの 2 番目のバージョンをインターセプトすることであるため、1 番目のバージョンはデフォルトでは呼び出されません (またはまったく呼び出されません)。LD_PRELOAD 環境を使用する。

LD_PRELOAD=./libtest2.so ./main

...

幸運を。

于 2016-02-20T15:21:28.240 に答える