我想从我的应用程序中的Android运行时共享库中读取值。 由于Android 5,当引入新的运行时和libart.so
已经第一次出现,我成功地使用此代码做:dlsym:undefined symbol,Android N
std::unique_ptr<void, int(*)(void*)> handle {
dlopen("libart.so", RTLD_NOW | RTLD_GLOBAL),
&dlclose
};
constexpr char THREAD_KEY_NAME[] = "_ZN3art6Thread17pthread_key_self_E";
key_ = static_cast<pthread_key_t *>(dlsym(handle.get(), THREAD_KEY_NAME));
LOG("Current thread: ", key_);
我测试在Android模拟器ň这个代码,它失败! dlsym
回报:
undefined symbol: _ZN3art6Thread17pthread_key_self_E
我觉得 “OK,没有符号现在”,所以我拉从模拟器libart.so看到:
% ./i686-linux-android-nm ~/Desktop/libart.so | grep pthread_key
00736ea0 B _ZN3art6Thread17pthread_key_self_E
嗯......
% ./i686-linux-android-objdump -T ~/Desktop/libart.so | grep pthread_key
00736ea0 g DO .bss 00000004 Base .protected _ZN3art6Thread17pthread_key_self_E
嗯..
% ./i686-linux-android-readelf -a ~/Desktop/libart.so | grep pthread_key_self
%
OK,EMP TY有:(
所以,虽然我并不完全在专家的这些事情,我有一些问题:
- 为什么
readelf
输出是空的?有一些标志我忘了? .protected
在objdump输出中意味着什么?我已经阅读了一些关于它的内容,但不太了解。可能你可以得到很好的解释?- 为什么
dlsym
在新版本的Android上返回错误?有什么区别?
BTW,我甩/proc/self/maps
文件为我的应用上都的Android版本和grep libart.so
给我:
的Android L(工作正常):
b40f3000-b45f3000 r-xp 00000000 1f:00 777 /system/lib/libart.so b45f3000-b45fb000 r--p 004ff000 1f:00 777 /system/lib/libart.so b45fb000-b45fc000 rw-p 00507000 1f:00 777 /system/lib/libart.so
的Android N(不起作用):
aaef1000-aaef2000 r-xp 00000000 fd:00 729 /system/fake-libs/libart.so aaef2000-aaef3000 r--p 00000000 fd:00 729 /system/fake-libs/libart.so aaef3000-aaef4000 rw-p 00001000 fd:00 729 /system/fake-libs/libart.so abc53000-ac373000 r-xp 00000000 fd:00 1034 /system/lib/libart.so ac374000-ac37c000 r--p 00720000 fd:00 1034 /system/lib/libart.so ac37c000-ac37e000 rw-p 00728000 fd:00 1034 /system/lib/libart.so
感谢您的任何信息!
upd:我看到在Android N上有两个libart.so,而/system/fake-libs/libart.so是空的。我想有一个问题,但dlopen的( “/系统/ lib中/ libart.so”,...)不工作:(