2016-06-07 263 views
2

我想從我的應用程序中的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有:(

所以,雖然我並不完全在專家的這些事情,我有一些問題:

  1. 爲什麼readelf輸出是空的?有一些標誌我忘了?
  2. .protected在objdump輸出中意味着什麼?我已經閱讀了一些關於它的內容,但不太瞭解。可能你可以得到很好的解釋?
  3. 爲什麼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」,...)不工作:(

回答