【Linux】LD_PRELAADの使い方


LD_PRELAADは、環境変数であり、ダイナミックライブラリのロードに用いられ、ダイナミックライブラリのロードの優先度が最も高く、一般的には、そのロード順序はLD_である.PRELOAD>LD_LIBRARY_PATH>/etc/ld.so.cache>/lib>/usr/lib.プログラムでは外部ライブラリの関数を呼び出すことがよくあります.mallocを例にとると、カスタムmalloc関数があれば、動的ライブラリにコンパイルした後、LD_を通じてPRELAADロードは、プログラムでmalloc関数を呼び出すと、実は私たちがカスタマイズした関数を呼び出すので、次の例で説明します.
// test.c
#include 
#include 

int main()
{
    int i = 0;
    for (; i < 5; ++i) {
        char *c = (char*)malloc(sizeof(char));
        if (NULL == c) {
            printf("malloc fails
"
); } else { printf("malloc ok
"
); } } return 0; }

コンパイル実行の結果は次のとおりです.
$gcc -o test test.c
$./test
malloc ok
malloc ok
malloc ok
malloc ok
malloc ok

プログラムの実行に問題はないことがわかります.私たちは少し修正してmallocをカスタマイズします.
// preload.c
#include 
#include 

void* malloc(size_t size)
{
    printf("%s size: %lu
"
, __func__, size); return NULL; }

次に、カスタムmallocをダイナミックライブラリにパッケージします.
$gcc -shared -fpic -o libpreload.so preload.c

次にLD_を使用PRELAADはlibpreloadをロードする.so、状況を見てみましょう.
$LD_PRELOAD=./libpreload.so ./test
malloc size: 1
malloc fails
malloc size: 1
malloc fails
malloc size: 1
malloc fails
malloc size: 1
malloc fails
malloc size: 1
malloc fails

見たでしょう、5回もmallocは失敗して、LDだと知らなかったらPRELAADがおかしいのは、長い間分析しても原因が見つからないかもしれません.このLD_PRELAADは両刃の剣を使って、私たちを助けることができて、もし心があれば、それは意外なサプライズがあるかもしれません.