我正在尝试使用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字符串“hacked”应该会被看到,由"Hello myPuts“显示。(如果我试图“覆盖”puts函数,它将正确工作)
我遗漏了什么?
发布于 2011-02-03 10:19:32
你应该:
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发布于 2011-02-03 10:17:19
来自man ld.so
LD_PRELOAD
一个空格分隔的列表,该列表包含要在所有其他库之前加载的附加、用户指定的ELF共享库。这可以用于选择性地覆盖中的其他共享库中的函数。
如果myPuts位于链接到主应用程序的共享库中,那么它就能工作,但当应用程序中存在myPuts,并且在外部库中没有解析时,它就不能工作了。
https://stackoverflow.com/questions/4884796
复制相似问题