2016-06-07 5 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 N тренажере, и он терпит неудачу! dlsym возвращается:

undefined symbol: _ZN3art6Thread17pthread_key_self_E 

Я думаю, "ОК, нет никакого символа сейчас", так что я тяну 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, эми ти там :(

Итак, пока я полностью не эксперт в этих вещах, у меня есть несколько вопросов:

  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: Я вижу, есть два libart.so на Android N, а /system/fake-libs/libart.so пуст. Я предполагаю, что есть проблема, но dlopen ("/ система/Библиотека/libart.so", ...) не работает :(

ответ