LD_PRELOAD 帮助

发布于 2024-10-15 12:20:35 字数 641 浏览 5 评论 0原文

我正在尝试使用 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 myPuts”看到字符串“Hello hacked myPuts”出现。 (如果我尝试“覆盖”puts 函数,它会正常工作)

我错过了什么?

I'm trying to use LD_PRELOAD.

original.cpp

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

hacked.cpp

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

I compile original.cpp:

g++ original.cpp

And hacked.cpp:

g++ -shared -fPIC hacked.cpp

I try:

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

The string "Hello hacked myPuts" should be seen, by "Hello myPuts" appears.
(If I try to "overwrite" the puts function, it works correctly)

What am I missing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

晨曦÷微暖 2024-10-22 12:20:35

来自 man ld.so

LD_PRELOAD

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

如果 myPuts 位于链接到主应用程序的共享库中,则它可以工作,但当
myPuts 存在于应用程序中,并且未在外部库中解析。

From man ld.so

LD_PRELOAD

A whitespace-separated list of additional, user-specified, ELF shared libraries to be loaded before all others. This can be used to selectively override functions in other shared libraries.

If myPuts was in shared library linked to main application it would work, but not when
myPuts exists in the application and does not resolved in an external library.

九局 2024-10-22 12:20:35

你应该有:

ma​​in.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

You should have:

main.cpp

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

original.cpp

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

hacked.cpp

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

Compiling all:

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

And using:

LD_PRELOAD=./libhacked.so ./main.out
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文