3

LD_PRELOADを使おうとしています。

original.cpp

void myPuts() {  
    puts ("Hello myPuts");  
}  
int main() {  
    myPuts();  
    return 0;  
}

hacked.cpp

void myPuts() {  
    std::cout >> "Hello hacked myPuts";  
}

original.cppをコンパイルします:

g++ original.cpp

そしてhacked.cpp:

g++ -shared -fPIC hacked.cpp

私は試してみます:

LD_PRELOAD=./hacked.so ./original.out

「HellomyPuts」が表示されると、「HellohackedmyPuts」という文字列が表示されます。(puts関数を「上書き」しようとすると、正しく機能します)

私は何が欠けていますか?

4

2 に答える 2

6

manld.soから

LD_PRELOAD

他のすべてのライブラリよりも先にロードされる、ユーザー指定の追加のELF共有ライブラリの空白で区切られたリスト。これは、他の共有ライブラリの関数を選択的にオーバーライドするために使用できます。

myPutsがメインアプリケーションにリンクされた共有ライブラリにある場合は機能しますが、myPutsがアプリケーションに存在し、外部ライブラリで解決されない場合は機能しません。

于 2011-02-03T10:17:19.350 に答える
3

あなたが持っている必要があります:

main.cpp

int main() {  
    myPuts();  
    return 0;  
}

original.cpp

void myPuts() {  
    puts ("Hello myPuts");  
}  

hacked.cpp

void myPuts() {  
    std::cout << "Hello hacked myPuts";  
}

すべてをコンパイルする:

g++ -shared -fPIC original.cpp -o liboriginal.so
g++ -shared -fPIC hacked.cpp -o libhacked.so
g++ main.cpp -loriginal -o main.out

そして使用する:

LD_PRELOAD=./libhacked.so ./main.out
于 2011-02-03T10:19:32.787 に答える