2011-02-03 33 views
3

我正在尝试使用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:

出现

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

“你好砍死myPuts” 该字符串应该可以看出, “你好myPuts”:

g++ -shared -fPIC hacked.cpp 

我试试。 (如果我试图“覆盖”放置功能,它工作正常)

我错过了什么?

+0

如果你发布的代码块,你可以缩进每一行用最少的4个空格,该网站会自动格式它作为代码。这种方法比反引号的优点是可以获得语法高亮显示。您还可以突出显示整个区块,然后单击工具栏上的“{}”按钮。只是为了您将来的参考。 :-) – 2011-02-03 10:16:46

+0

谢谢,会这样做!:-) – krisy 2011-02-03 10:44:08

回答

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 
6

从人的ld.so

LD_PRELOAD

的额外的,用户指定的,ELF共享库,用空格分开列表中的所有其他前被加载。这可以用于选择性地覆盖其他共享库中的功能。

如果myPuts是链接到主应用程序,将工作共享库,而不是在 myPuts存在于应用程序和外部库没有得到解决。

+0

请注意,如果应用程序的构建方式使得有问题的函数在最终链接之后仍然是一个弱符号,则有可能从共享库中覆盖它的函数 - 但这需要应用程序开发人员的协作。 – bdonlan 2011-02-03 11:07:30