2011-02-03 60 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