gpt4 book ai didi

android - dlsym : undefined symbol, 安卓 N

转载 作者:IT王子 更新时间:2023-10-29 00:38:55 27 4
gpt4 key购买 nike

我想在我的应用程序中从 Android 运行时共享库​​中读取值。从 Android 5 开始,当引入了新的运行时并且 libart.so 首次出现时,我用这段代码成功地做到了:

 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
%

好的,那里是空的:(

所以,虽然我不是这些方面的专家,但我有一些问题:

  1. 为什么 readelf 输出为空?我忘记了一些标志?
  2. .protected 在 objdump 输出中意味着什么?我已经阅读了一些有关它的内容,但并不真正理解。也许你能得到很好的解释?
  3. 为什么 dlsym 在新版本的 Android 上返回错误?有什么区别?

顺便说一句,我在两个 Android 版本上为我的应用程序转储了 /proc/self/maps 文件,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("/system/lib/libart.so", ...) 不起作用:(

最佳答案

在 Android N 中你不能打开一些私有(private) so 文件( https://developer.android.com/about/versions/nougat/android-7.0-changes.html#ndk )

但是你可以打开 libart.so for Android-N 使用这个: https://github.com/crmulliner/adbi/blob/master/hijack/hijack.c或者 https://github.com/avs333/Nougat_dlfunctions

关于android - dlsym : undefined symbol, 安卓 N,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37683416/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com