2016-06-07 12 views
2

Ich möchte Wert von der Android Runtime Shared Library in meiner Anwendung lesen. Da Android 5, wenn die neue Laufzeit eingeführt wurde und libart.so hat zum ersten Mal erscheint, ich tue es erfolgreich mit diesem Code: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_); 

Ich teste diesen Code auf Android N-Simulator, und es scheitert! dlsym kehrt:

undefined symbol: _ZN3art6Thread17pthread_key_self_E 

Ich denke, "OK, gibt es kein Symbol jetzt", so ziehe ich den libart.so von Simulator und sehen:

% ./i686-linux-android-nm ~/Desktop/libart.so | grep pthread_key 
00736ea0 B _ZN3art6Thread17pthread_key_self_E 

hmm ...

% ./i686-linux-android-objdump -T ~/Desktop/libart.so | grep pthread_key 
00736ea0 g DO .bss 00000004 Base  .protected _ZN3art6Thread17pthread_key_self_E 

hmm ..

% ./i686-linux-android-readelf -a ~/Desktop/libart.so | grep pthread_key_self 
    % 

OK, emp ty dort :(

Also, während ich in diesen Dingen nicht vollständig Experte bin, habe ich ein paar Fragen:

  1. Warum ist readelf Ausgabe leer ist? Es gibt einige Flaggen, die ich vergessen habe?
  2. Was bedeutet .protected in Objdump-Ausgabe? Ich habe einiges darüber gelesen, verstehe es aber nicht wirklich. Kann es sein, dass du eine gute Erklärung bekommst?
  3. Warum gibt dlsym Fehler bei neuen Versionen von Android zurück? Was ist der Unterschied?

BTW, abgeladen ich /proc/self/maps Datei für meine Anwendung auf beiden Android-Versionen und grep libart.so gibt mir:

  • Android L (der gut arbeitet):

    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 (funktioniert nicht):

    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 
    

Danke für jede Information!

upd: Ich sehe, es gibt zwei libart.so auf Android N, und /system/fake-libs/libart.so ist leer. Ich nehme an, es ist ein Problem, aber dlopen ("/ system/lib/libart.so", ...) nicht funktioniert :(

Antwort