繁体   English   中英

LD_PRELOAD帮助

[英]LD_PRELOAD help

我正在尝试使用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函数,它可以正常工作)

我错过了什么?

来自男人ld.so

LD_PRELOAD

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

如果myPuts位于链接到主应用程序的共享库中,那么它将起作用,但是当myPuts存在于应用程序中并且未在外部库中解析时。

你应该有:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM