zl程序教程

您现在的位置是:首页 >  其它

当前栏目

dlopen 和 dlsym 动态调用函数

动态 调用函数
2023-09-14 09:06:34 时间

dlopen 打开一个库,获取句柄。打开so文件获取句柄(看作基地址)
dlsym 在打开的库中查找符号的值。 (so里面查某个函数地址)
dlclose 关闭句柄。
dlerror 返回一个描述最后一次调用dlopen、dlsym,或 dlclose 的错误信息的字符串。

#import <dlfcn.h>
 
typedef int (*printf_func_pointer) (const char * __restrict, ...);
 
void dynamic_call_function(){
    
    //动态库路径
    char *dylib_path = "/usr/lib/libSystem.dylib";
    
    //打开动态库
    void *handle = dlopen(dylib_path, RTLD_GLOBAL | RTLD_NOW);
    if (handle == NULL) {
        //打开动态库出错
        fprintf(stderr, "%s\n", dlerror());
    } else {
        
        //获取 printf 地址
        printf_func_pointer printf_func = dlsym(handle, "printf");
        
        //地址获取成功则调用
        if (printf_func) {
            int num = 100;
            printf_func("Hello exchen.net %d\n", num);
            printf_func("printf function address 0x%lx\n", printf_func);
        }
        
        dlclose(handle); //关闭句柄
    }
}
 
int main(int argc, char * argv[]) {
    @autoreleasepool {
        
        dynamic_call_function();
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}