2011-07-07 82 views
11

我需要從另一個程序中調用一個函數。如果其他程序是一個庫,我可以簡單地使用dlopen和dlsym來獲取該函數的句柄。不幸的是,另一個程序是一個Unix可執行文件,並且將它作爲一個庫進行構建並不是一種選擇。對可執行文件試圖執行dlopen()給出了這樣的錯誤消息:在可執行文件上使用dlopen()

dlopen([...]/testprogram, 1): no suitable image found. Did find: [...]/testprogram: can't map

這並不奇怪,因爲dlopen的意思爲使用庫,而不是可執行文件。有沒有辦法讓dlopen和dlsym與可執行文件一起工作?如果沒有,是否有另一種實現同樣目標的途徑?

回答

7

無法將可執行文件作爲庫打開。可執行文件的入口點將嘗試重新初始化C庫,並接管指針brk。這會破壞你的malloc堆。另外,可執行文件很可能映射到一個固定的地址,不需要重定位,如果這個地址與已經加載的任何東西重疊,那麼出於這個原因也不可能映射它。

您需要將其他程序重構爲庫,或將RPC接口添加到其他程序。

請注意,這不一定適用於PIE可執行文件。但是,除非可執行文件專門設計爲dlopen() ed,否則這是不安全的,因爲main()將不會運行,因此將不會發生在main()中完成的任何初始化。

+3

正如在這裏討論的:http://stackoverflow.com/questions/6617099/call-function-in-unrelated-executable-linux/6619977#6619977,這個答案是錯誤的PIE可執行文件,這真的是一種特殊的形式共享庫(甚至有ET_DYN e_type)。 –

6

在某些ELF系統(特別是Linux)上,您可以使用dlopen() PIE可執行文件。當使用GCC,剛編譯-fpie-fPIE的可執行文件,並用-pie鏈接它,以及使用--dynamic-list-rdynamic導出適當的碼元(更詳細地this other SO answer說明。

+0

A [類似的答案](http://stackoverflow.com/questions/19713517/how-to-self-dlopen-an-executable-binary/19716028#19716028)。 –

0

要添加到加載的可執行文件的能力通過dlopen的是註冊爲拒絕glibc RFE(請求增強)詳細瞭解RFE和某些特殊情況的可能方法,可在

[http://sourceware.org/bugzilla/show_bug.cgi?id= 11754] [1]

排除PIE會有很多問題後面的場景來實現這樣的功能。

0

這裏的工具可以精確地處理ASLR/PIE和非ASLR/PIE。在x86,ARM和MIPS上進行編譯(僅限32位)。編輯Makefile以設置ARCH參數。

http://rtfc.org.uk/cliapi.html

這是我的工具,但它似乎做你想要什麼。讓我知道,如果它不適合你。

我很欣賞我對這次晚會有多遲,但嘿。

相關問題