我正在尝试使用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函数,它可以正常工作)
我错过了什么?
答案 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