android dlopen原型在哪个so

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android dlopen原型在哪个so相关的知识,希望对你有一定的参考价值。

1、 .so态库
使用gcc或者g++编译器态库文件(处g++编译器例)
g++ -shared -fPIC -c XXX.cpp
g++ -shared -fPIC -o XXX.so XXX.o
2、 .so态库态调用接口函数说明
态库调用关系需要调用态库程序编译通g++-L-l命令指定例:程序test启需要加载目录/root/src/liblibtest_so1.so态库编译命令照编写执行:
g++ -g -o test test.cpp –L/root/src/lib –ltest_so1
(处我重点讲解态库态调用关于静态通g++编译命令调用式作详细讲解具体相关内容网查询)

Linux提供专门组API用于完打态库查找符号处理错关闭态库等功能
面些接口函数逐介绍(调用些接口需引用文件#include ):
1) dlopen
函数原型:void *dlopen(const char *libname,int flag);
功能描述:dlopen必须dlerrordlsymdlclose前调用表示要库装载内存准备使用要装载库依赖于其库必须首先装载依赖库dlopen操作失败返NULL值;库已经装载则dlopen返同句柄
参数libname般库全路径dlopen直接装载该文件;指定库名称dlopen按照面机制搜寻:
a.根据环境变量LD_LIBRARY_PATH查找
b.根据/etc/ld.so.cache查找
c.查找依/lib/usr/lib目录查找
flag参数表示处理未定义函数式使用RTLD_LAZY或RTLD_NOWRTLD_LAZY表示暂处理未定义函数先库装载内存等用没定义函数再说;RTLD_NOW表示马检查否存未定义函数若存则dlopen失败告终
2) dlerror
函数原型:char *dlerror(void);
功能描述:dlerror获近dlopen,dlsym或dlclose操作错误信息返NULL表示错误dlerror返错误信息同清除错误信息
3) dlsym
函数原型:void *dlsym(void *handle,const char *symbol);
功能描述:dlopen库装载内存dlsym获指定函数(symbol)内存位置(指针)找指定函数则dlsym返NULL值判断函数否存使用dlerror函数
4) dlclose
函数原型:int dlclose(void *);
功能描述:已经装载库句柄减句柄减至零则该库卸载存析构函数则dlclose析构函数调用
3、 普通函数调用
处源码实例说明各源码文件关系:
test_so1.htest_so1.cpptest_so1.so态库
test_so2.htest_so2.cpptest_so2.so态库
test_dl.cpptest_dl执行程序test_dl通dlopen系列等API函数并使用函数指针达态调用同so库test函数目
-
参考技术A 360安全卫士就可以咯

在 C Level 用 dlopen 使用 第三方的 Shared Library (.so)

http://falldog7.blogspot.com/2013/10/android-c-level-dlopen-shared-library-so.html

在 Android 裡,撰寫 JNI C Level 的 code ,不管是想要 load 自己寫的獨立 shared library module (.so),或是想要把第三方的 shared library 拿來用,都必須要多做一些步驟才能達成。

1. 寫個簡單的 libtest.so

test.h

extern "C"
{
int Add(int num);
}

test.cpp

int Add(int num)
{
    return num+1;
}


Android.mk

include $(CLEAR_VARS)
LOCAL_MODULE    := littest
LOCAL_SRC_FILES := test.cpp
include $(BUILD_SHARED_LIBRARY)

 

2. 將已經 compile 好的 libtest.so 放進新的 project 裡

首先,要先把已經 build 好的 shared library 放到 Android 專案目錄裡
而且必須根據平台區分才行:好比 armeabi, armeabi-v7a, x86, mips ,放好各平台 compile 好的 shared library 後,在 Android.mk 裡必須加一段指令,NDK 才會將這個 shared library 包進 .apk 裡

比如,我想要使用 libtest.so ,將各平台 compile 好的 .so 檔放至 mylib 底下

  • mylib (folder示意)
    • armeabi
      • libtest.so
    • aremabi-v7a
      • libtest.so
    • x86
      • libtest.so
    • mips
      • libtest.so


就可以利用 NDK 的變數 $(TARGET_ARCH_ABI) 來區分不同平台的目錄
Android.mk 

include $(CLEAR_VARS)
LOCAL_MODULE := libtest
LOCAL_SRC_FILES := ./mylib/$(TARGET_ARCH_ABI)/libtest.so
include $(PREBUILT_SHARED_LIBRARY)


Build完後,確認一下 Android 專案下的目錄 $PROJECT\lib\<abi>\,照理來說應該會找到 libtest.so

3. 使用 dlopen 控制 libtest.so

typedef int (*fnAdd)(int);
void* hDll = dlopen("/data/data/<package-name>/lib/libtest.so");
if(hDll) {
    fnAdd add = (fnAdd) dlsym(hDll, "Add");
    if(fnAdd){
        printf("10+1=%d\n", fnAdd(10));
    }
}


透過 Eclipse 將 .apk 安裝到手機上後,.so 將會放在 /data/data/<package_name>/libtest.so,這個 package_name 是定義在 AndroidManifest.xml 裡面的。

以上是关于android dlopen原型在哪个so的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 进程注入工具开发 ( EIP 寄存器指向 dlopen 函数 | ESP 寄存器指向栈内存 | 调试程序收回目标进程控制权 )

Android7.0对dlopen的改变

dlopen参数flag的使用

基于 Qt 的 android 应用程序在一台特定设备上启动时崩溃。 “dlopen 失败:libqtforandroid”

pjsip android:dlopen 失败:找不到符号“__aeabi_memclr8

间歇性 Android 应用程序崩溃 java.lang.UnsatisfiedLinkError: dlopen failed