2013-01-20 121 views
3

我不知道LD_PRELOAD現在是否支持更新的Android版本?Android 4.2 - 是否支持LD_PRELOAD?

在4.0 ICS的時候不是,並在文檔中(NDK文檔/ SYSTEM-ISSUES.html)仍然有:

No support for LD_LIBRARY_PATH, LD_PRELOAD, RTLD_LOCAL and many other options. 

但是前幾天我用我的Android LD_LIBRARY_PATH 4.2 Galaxy Nexus和它的工作(!)。

在此先感謝!

+0

我記得讓那些工作之一,但人們不禁要問,你打算用它做什麼 - 正常的Android操作過程中,執行exec()是不是真的使用,所以有這樣的背景沒有太多機會產生效果。如果您想明確知道,請檢查源代碼,在鏈接器二進制文件上運行字符串,或者測試它。 –

+0

我從來沒有使用LD_PRELOAD,但它不知道我是否可以在android中做這樣的事情:http://www.linuxjournal.com/article/7795 –

+0

但是用它做什麼?如果您正在處理正確的Android代碼,那麼您將會將jni庫加載到現有的進程中,在這種情況下,您可以首先使用替換函數加載庫 - 但要注意,大多數系統庫都是預加載的在你寫的第一行代碼運行之前。鏈接器預加載變量實際應用的情況是,如果您實際執行二進制文件 - 在unix傳統中操作比android更多。 –

回答

0

一般來說,LD_LIBRARY_PATH已經在工程構建(也稱爲根植設備)上工作了很長一段時間。問題在於這對生產構建沒有幫助 - 不是因爲加載程序已更改,而是因爲您的應用程序的環境受到保護。

+0

嗯是的,我的設備是一個根源。這是否也意味着我可以認爲LD_LIBRARY_PATH(或更好的LD_PRELOAD)存在於「所有」路由設備上?我已經接受,我的應用程序將需要根植設備(可悲)。正如我已經傷心 - 我甚至不知道LD_PRELOAD是否可以工作,我是新手。 –

+0

看着AOSP bionic/linker/linker.c,'LD_PRELOAD'沒有被解析。同樣證明,您可以假定所有根設備上的加載程序都會考慮對「LD_LIBRARY_PATH」所做的更改。請參閱https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/m6OddFQINxs和https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/2iy4zeyoVKU 。實質上,LD_LIBRARY_PATH在加載器(或進程,如果您關心的)啓動時被解析,只能在根設備上進行控制。 –

+0

謝謝你的迴應,這有幫助。現在,我必須看看我是否可以用這個:) –

5

儘管官方的NDK-r9d文檔仍然表示相同,但​​事實證明,LD_PRELOAD在根設備上工作。 運行

adb shell 
setprop wrap.com.xyz.yourapp LD_PRELOAD=/path/to/your/library.so 
stop 
start 

將庫推送到設備後。 我在ANDROID-19模擬器上成功試用了它,以提供函數的替代定義。

看看這個鏈接 - http://cedricvb.be/post/intercepting-android-native-library-calls/

+0

對我來說太晚了,但絕對是一個很好的提示和非常有趣:) –

+1

真棒的答案。雖然屬性值不能超過91個字符,但有一點需要注意,所以您需要確保/ to/your/library.so路徑很短(特別是如果您需要多個庫)。 – JonnyBoy