LD_PRELOAD 帮助
我正在尝试使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
来自 man ld.so
如果 myPuts 位于链接到主应用程序的共享库中,则它可以工作,但当
myPuts 存在于应用程序中,并且未在外部库中解析。
From man ld.so
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.
你应该有:
main.cpp
original.cpp
hacked.cpp
编译全部:
并使用:
You should have:
main.cpp
original.cpp
hacked.cpp
Compiling all:
And using: