LD_PRELOAD帮助

时间:2011-02-03 10:13:02

标签: c++ unix shared-libraries ld

我正在尝试使用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

应该看到字符串“Hello hacked myPuts”,出现“Hello myPuts”。 (如果我尝试“覆盖”puts函数,它可以正常工作)

我错过了什么?

2 个答案:

答案 0 :(得分:6)

来自man ld.so

  

LD_PRELOAD

     

以空格分隔的列表,其中包含要在所有其他库之前加载的其他用户指定的ELF共享库。这可用于有选择地覆盖其他共享库中的功能

如果myPuts位于链接到主应用程序的共享库中,它将起作用,但不会 myPuts存在于应用程序中,无法在外部库中解析。

答案 1 :(得分: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