首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LD_PRELOAD帮助

LD_PRELOAD帮助
EN

Stack Overflow用户
提问于 2011-02-03 10:13:02
回答 2查看 1.4K关注 0票数 3

我正在尝试使用LD_PRELOAD。

original.cpp

代码语言:javascript
复制
void myPuts() {  
    puts ("Hello myPuts");  
}  
int main() {  
    myPuts();  
    return 0;  
}

hacked.cpp

代码语言:javascript
复制
void myPuts() {  
    std::cout >> "Hello hacked myPuts";  
}

我编译了original.cpp:

代码语言:javascript
复制
g++ original.cpp

和hacked.cpp:

代码语言:javascript
复制
g++ -shared -fPIC hacked.cpp

我试着:

代码语言:javascript
复制
LD_PRELOAD=./hacked.so ./original.out

字符串“hacked”应该会被看到,由"Hello myPuts“显示。(如果我试图“覆盖”puts函数,它将正确工作)

我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-03 10:19:32

你应该:

main.cpp

代码语言:javascript
复制
int main() {  
    myPuts();  
    return 0;  
}

original.cpp

代码语言:javascript
复制
void myPuts() {  
    puts ("Hello myPuts");  
}  

hacked.cpp

代码语言:javascript
复制
void myPuts() {  
    std::cout << "Hello hacked myPuts";  
}

汇编所有:

代码语言:javascript
复制
g++ -shared -fPIC original.cpp -o liboriginal.so
g++ -shared -fPIC hacked.cpp -o libhacked.so
g++ main.cpp -loriginal -o main.out

并使用:

代码语言:javascript
复制
LD_PRELOAD=./libhacked.so ./main.out
票数 3
EN

Stack Overflow用户

发布于 2011-02-03 10:17:19

来自man ld.so

LD_PRELOAD

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

如果myPuts位于链接到主应用程序的共享库中,那么它就能工作,但当应用程序中存在myPuts,并且在外部库中没有解析时,它就不能工作了。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4884796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档