2013-01-20 123 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