首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

主要可执行文件上的dlopen()/ dlsym():它有多便携?

主要可执行文件上的dlopen()/dlsym()是一组在Linux系统中用于动态加载共享库并在运行时解析符号的函数。它们是C语言中的函数,提供了一种方便的方式来实现动态链接和运行时加载的功能。

dlopen()函数用于打开一个共享库文件,并返回一个句柄,该句柄可以用于后续的操作。dlsym()函数则用于在已打开的共享库中查找指定的符号,并返回该符号对应的地址。

这组函数的便携性非常高,因为它们是标准的POSIX接口,几乎在所有的Linux发行版和其他类Unix系统上都可以使用。它们提供了一种跨平台的方式来实现动态加载和符号解析的功能,使得开发人员可以编写可移植的代码。

使用dlopen()/dlsym()的主要优势包括:

  1. 动态加载:dlopen()函数允许在程序运行时动态加载共享库,而不需要在编译时将所有的依赖库链接到可执行文件中。这样可以减小可执行文件的大小,并且可以根据需要加载所需的库,提高了灵活性和可扩展性。
  2. 符号解析:dlsym()函数可以在已加载的共享库中查找指定的符号,并返回其地址。这使得程序可以在运行时动态地调用共享库中的函数或访问共享库中的变量,实现了动态扩展和插件化的功能。
  3. 模块化开发:使用dlopen()/dlsym()可以将程序的功能模块化,将不同的功能实现封装在独立的共享库中。这样可以提高代码的可维护性和复用性,方便进行模块的替换和升级。
  4. 跨语言支持:dlopen()/dlsym()可以用于C和C++等编程语言,也可以与其他语言的接口进行交互。这使得开发人员可以使用不同的编程语言来实现不同的功能,并通过共享库的方式进行集成。

主要应用场景包括:

  1. 插件系统:dlopen()/dlsym()可以用于实现插件系统,允许在程序运行时加载和卸载插件,扩展程序的功能。
  2. 动态链接库:dlopen()/dlsym()是实现动态链接库的基础,可以将一些通用的功能封装在共享库中,供多个程序共享使用。
  3. 扩展性和灵活性要求高的系统:对于需要在运行时根据需求加载不同模块的系统,使用dlopen()/dlsym()可以提供更高的灵活性和扩展性。

腾讯云相关产品和产品介绍链接地址:

腾讯云提供了丰富的云计算产品和服务,包括云服务器、云数据库、云存储、人工智能等。以下是一些与dlopen()/dlsym()相关的腾讯云产品:

  1. 云函数(SCF):腾讯云云函数是一种无服务器的事件驱动计算服务,可以将函数作为共享库打包,并通过dlopen()/dlsym()进行动态加载和调用。详情请参考:云函数产品介绍
  2. 容器服务(TKE):腾讯云容器服务是一种高度可扩展的容器管理服务,可以将应用程序打包成容器镜像,并在容器中使用dlopen()/dlsym()进行动态加载和调用。详情请参考:容器服务产品介绍
  3. 人工智能平台(AI Lab):腾讯云人工智能平台提供了丰富的人工智能服务和工具,可以与dlopen()/dlsym()结合使用,实现动态加载和调用机器学习模型等功能。详情请参考:人工智能平台产品介绍

请注意,以上链接仅供参考,具体的产品选择应根据实际需求进行评估和选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

一种Android App在Native层动态加载so库方案

这篇文章通过实战案例,介绍了一种有条理组织Native层代码层级结构方法。并且,在良好代码层级、作用分工基础,实现了动态按需加载、卸载so库。...Native层so库动态加载实现 在Native层C/C++代码环境,so库动态加载是使用dlopen()、dlsym()和dlclose()这三个函数实现。...,实际还是不一样数据类型。...这是由于SD卡在Android系统挂载并不具有可执行文件权限,所以SD卡挂载目录不能直接用来作为可执行文件运行目录,使用前应该把可执行文件复制到APP内部存储再运行。...dlopen函数使用需要兼容C++ dlopen、dlclose、dlsym函数是C语言库里面的函数,自身是没有考虑到C++支持,调用dlopen无法直接加载C++类及其成员函数。

7.3K60

【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取注入 libbridge.so 动态库中 load 函数地址 并 通过 远程调用 执行该函数 )

文章目录 一、dlsym 函数简介 二、获取 目标进程 linker 中 dlsym 函数地址 三、远程调用 目标进程 linker 中 dlsym 函数 获取 注入 libbridge.so 动态库中...load 函数地址 四、远程调用 目标进程 中 libbridge.so 动态库中 load 函数 一、dlsym 函数简介 ---- dlsym 是 Dynamic Library Symbol...: void* dlsym(void* handle, constchar* symbol) 参数说明 : ① void* handle : dlopen 打开 动态链接库 返回值; ② constchar.../ 可执行文件某个方法地址 , 参考 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中 /system/lib/libc.so 动态库中...动态库代码 , 在该换行代码中 , 只是调用 dlopen 函数加载了真正 libnative.so 动态库 , 这个动态库是进行逆向操作主要库 , 执行核心逻辑 ; 先远程注入 libbridge.so

85410
  • dlsym用法_DLSS模式

    大家好,又见面了,我是你们朋友全栈君。 dlsym dlsym,dlvsym – 从一个动态链接库或者可执行文件中获取到符号地址。...详解 函数dlsym()第一个参数是一个指向已经加载动态目标的句柄,这个句柄可以是dlopen()函数返回。 其中symbol参数是一个以null结尾符号名。...返回值是这个符号加载到内存中地址。如果这个符号 在指定目标 或者 在由dlopen(3)装载指定目标时自动装载其他共享目标中都没有找到,dlsym()返回NULL指针。...(dlsym在这些动态目标中执行广度优先搜索)。 由于符号值本身可能实际就是NULL,因此,返回NULL不能直接用来判断是否出错!...这个搜索范围包含可执行文件全局符号以及这个可执行文件依赖项(也就是使用RTLD_GLOBAL标志动态加载共享目标) RTLD_NEXT 在当前搜索顺序中找,在当前目标之后,要找符号下一次出现地方

    96120

    android平台注入技术

    Android注入技术应用场景主要是进行一些非法操作和实现如游戏辅助功能软件、恶意功能软件。 下面主要进行对zygote注入、ptrace注入、修改so文件注入,这三种注入方式进行详细解析。...通过直接远程调用dlopendlsym、dlclose等函数加载被注入so模块,并执行指定代码。...关键ptrace直接调用系统函数实现 ptraceshellcode注入原理 shellcode注入就是通过将dlopen/dlsym库函数操作放在shellcode代码中,注入函数只是通过对远程...ptrace注入shellcode详细步骤 1.在shellcode中编写好dlopendlsym等函数调用,来加载so模块和执行函数,但需要将参数地址、函数地址、寄存器地址先随便填充值为我们真实地址保留...通过修改ELF二进制可执行文件,并在ELF文件中添加自己代码,使得可执行文件在运行时会先执行自定义添加代码,最后在执行ELF文件原始逻辑。

    1K31

    【Android 逆向】修改运行中 Android 进程内存数据 ( Android 命令行中获取要调试应用进程 PID | 进程注入调试进程内存 so 库 )

    逆向】修改运行中 Android 进程内存数据 ( 运行环境搭建 Android 模拟器安装 | 拷贝 Android 平台可执行文件和动态库到 /data/system ) 先安装 Android...Android 平台可执行文件和动态库到 /data/system ) 博客中 , 拷贝了 2 个文件到 /data/system/debug/ 目录下 , 先为两个文件赋予 777 权限 , 即所有的执行权限...: 0xb7710450, dlsym: 0xb7710610, dlclose: 0xb7710390, dlerror: 0xb77101f0 library path = /data/system.../debug/libbridge.so [+] Calling dlopen in target process. [+] Target process returned from dlopen, return...value=b2c287b4, pc=0 [+] Calling dlsym in target process. [+] Target process returned from dlsym, return

    71710

    ubuntu gcc编译时对’xxxx’未定义引用问题

    ,编译为.o(obj) 文件没有问题,但是编译(这一步应该是链接)为可执行文件时候会出现找不到’xxx’定义情况。...,主要是C/C++编译为obj文件时候并不需要函数具体实现,只要有函数原型即可。...但是在链接为可执行文件时候就必须要具体实现了。如果错误是未声明引用,那就是找不到函数原型,解决办法这里就不细致说了,通常是相关头文件未包含。...比如上面的例子,是因为缺失了dlopendlsym、dlerror、dlclose这些函数实现,这几个函数是用于加载动态链接库,编译时候需要添加-ldl来使用dl库(这是静态库,在系统目录下/usr...但是看上面编译时候是有添加-ldl选项,那么为什么不行呢? gcc 依赖顺序问题 这个主要原因是gcc编译时候,各个文件依赖顺序问题。

    8K20

    动态库制作与两种使用方式你掌握了吗?

    前言 在《如何制作属于自己静态库》中简单介绍了静态库制作方法,但实际动态库使用更为广泛,至于原因,在《静态库和动态库区别》一文中已有说明。本文介绍动态库制作方法以及两种使用方式。...使用时链接 为了使用这种方式,需要使用几个函数dlopendlsym,dlclose,dlerror,其原型分别如下: #include void *dlopen(const char...dlsym函数用于从动态库中查找需要使用函数; dlclose函数用于卸载已加载动态库; dlerror函数用于打印动态库相关错误。...: 使用dlopen打开动态库 使用dlsym找到需要使用符号 调用动态库中函数 dlopen关闭(卸载)动态库 在文本代码中,用到了函数指针,相关内容可参考《高级指针话题-函数指针》。...本文总结如下: 程序运行时不能脱离动态库 动态库有两种常见使用方式,一种是加载是链接,一种是运行时链接 只要函数声明没有改变,动态库中函数实现更新不需要重新编译可执行文件

    1.5K50

    分享一个绕过移动端系统限制增强版dlfunctions库

    注:目前实现方式理论还是比较通用,至少我这Android 10测试ok,但还没完整详细测试过,是否使用请自行评估。...相关原理 具体实现原理还是比较简单主要还是借鉴了一种绕过Android P对非SDK接口限制简单方法思想和实现方式。...从而绕过Android Nclassloader-namespace限制,将系统/system/lib中任意so库加载到maps中,然后再通过fake dlopen方式去dlsym。...iOS 虽然ios可以直接使用dlopen,但是审核上会有风险,苹果有可能会对提交AppStoreapp扫描相关dlopen/dlsym等调用,来判断是否存在一些敏感私有调用。...为了在通过调用一些私有接口时候避免被苹果检测到,byOpen也通过自己实现dlopen/dlsym直接从已经加载进来images列表里面直接查找对应symbol地址来调用。

    1.5K30

    Go标准库plugin源码分析----动态库使用

    details/79959894 本文公众号文章链接:https://mp.weixin.qq.com/s/2MKjUUJ6QxJieW4BGvhbxg Go通常都是编译打包成一个可执行文件...,好处是不需要考虑依赖库,一个可执行文件,拷贝就可以直接执行。...当然还有一个cgo,如果不支持cgo的话,也是无法实现plugin。 那么看最后一个文件 src/plugin/plugin_dlopen.go ?...然后就是一个cgo代码。其中封装了两个函数dlopendlsym。 其实看到这两个函数,就应该很熟悉了。 ? 这个是linux种标准动态链接加载接口。...当然plugin只实现了封装了dlopendlsym,两个函数。这个和文档中所提供接口和描述是符合。 只提供了加载,并没有提供关闭。 继续看源码 ?

    1.3K30

    Linux 编译动态库_makefile编译动态库

    真名是动态链接库真实名字,一般总是在别名基础添加一个版本号信息。除此之外还有一个链接名,他是在程序链接时候使用名字。...使用动态链接库 在编译程序时候,使用动态链接库和静态链接库是一致, 使用“-l库名”形式,编译器在生成可执行文件时候会链接该链接库文件。...而动态加载库可以使用程序方法控制什么时候 加载。 动态加载库主要函数有: dlopen(), dlclose(), dlsym()和dlerror()。...6.1 打开动态库dlopen()函数 函数dlopen()按照用户指定方式打开动态链接库。...void *dlsym(void *handle, char *symbol) # handle : 为使用函数dlopen()获取到动态链接库指针 # symbol : 函数名称 # 返回值为函数指针

    6.1K20

    Android安全-SO动态库注入

    dlopendlsym函数绝对地址; 0x04 获取并保存目标进程堆栈,设置dlopen函数相关参数,将要注入SO绝对路径压栈; 0x05 调用dlopen...,解除关联,完成SO动态库注入; (注:实际,0x06和0x07并不属于SO动态库注入步骤,然而仅仅注入是完全没有意义,通常我们需要执行SO中函数) 0x3 实现 0x01...0x03 获取目标进程dlopendlsym函数绝对地址: 大概思路是这样:首先通过遍历/proc/pid/maps文件分别得到本进程中dlopen函数所在动态库基地址local_module_base...dlsym同理,不再详述。...调用dlsym函数,获取SO中要执行函数地址: 实现方式与调用dlopen函数类似,不再详述。

    2.6K20

    Android 5.0 到 Android 6.0 + 深坑之一 之 .so 动态库适配

    问题来了:     发生环境:此类问题一般发生在 Android 6.0 及其以上系统,具体也存在于其他 api 版本,主要集中在 api >=23;     具体表现是:同一个 APP 在 api...现在我用一句话说白它,就是:不同链接方式时,dlopen会打开指定系统中(手机中)或提供动态库,并使用 dlsym 获取符号地址,也就是说,如果,在此时手机中如果找不到,那么就会出问题,一般和 API...主要是两种,静态链接,动态链接:     动态链接,是指在生成可执行文件时不将所有程序用到函数链接到一个文件,因为有许多函数在操作系统带dll文件中,当程序运行时直接从操作系统中找。...插件加载形式有:     1)dlopen     2)dlsym     3)dlclose   dlopen打开指定系统中(手机中)动态库。...并使用 dlsym 获取符号地址,也就是说,如果,在此时手机中如果找不到,那么就会出问题,一般和 API 有关系。

    1.9K100

    应用程序设计:在动态库中如何调用外部函数?

    /lib.so 但是张三偏偏不这么做,为了炫技,他选择使用 dlopen 动态加载方式,来把我从硬盘上加载到进程中。 咱们来一起围观一下张三写可执行程序代码: ?...张三编译得到可执行文件 main 之后,执行结果完全正确,很开心! ?...张三心想:我是使用 dlopen 方式来动态加载动态库文件,不需要对可执行程序重新编译或者链接,直接运行就完事了!...于是他二话不说,直接就把我拿过去,丢在他可执行程序目录下,然后执行 main 程序。 可是这一次,他看到结果却是: dlopen failed! 为什么会加载失败呢?上次明明是正常执行!...这个时候,张三再次使用我时候,就不需要导出他 main.c 里那个函数 func_in_main 了,实际他可以把这个函数从代码中删掉!

    2.7K20

    掌握死锁检测:策略和最佳实践

    2.1、dlsym()函数获取共享对象或可执行文件中符号地址。...>void *dlvsym(void *handle, char *symbol, char *version);// Link with -ldl.描述:函数dlsym()接受dlopen()返回动态加载共享对象...如果在指定对象或加载对象时dlopen()自动加载任何共享对象中找不到该符号,dlsym()将返回NULL。(dlsym()执行搜索是通过这些共享对象依赖关系树进行广度优先搜索。)...由于符号值实际可能是NULL(因此,dlsym()NULL返回值不必指示错误),因此测试错误正确方法是调用dlerror()以清除任何旧错误条件,然后调用dlsym。...搜索将包括可执行文件及其依赖项中全局符号,以及使用RTLD_GLOBAL标志动态加载共享对象中符号。RTLD_NEXT在当前对象之后,按搜索顺序查找所需符号下一个匹配项。

    14610

    静态链接库和动态链接库区别

    将libmyhello.so拷贝到可执行文件main同一目录下。再次运行:....3.3、动态库初始化和解析Windows下动态库加载,卸载都会有初始化函数以及卸载函数来完成库初始化以及资源回收,linux当然也可以实现,这些初始化函数主要包含两个部分:动态库构造和析构函数机制...函数dlopen:打开指定动态链接库文件原型为: void *dlopen (const char *filename, int flag);dlopen用于打开指定名字(filename)动态链接库...函数dlsym : 取函数执行地址原型为: void *dlsym(void *handle, char *symbol);dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应函数执行代码地址...-lmymath链接静态库可执行程序明显比链接动态库可执行文件大。6、查看库中符号1、使用nm命令可以打印出库中涉及到所有符号。

    8.3K21

    Android so 加载原理分析

    (void * handle); //关闭动态库 对于动态库加载过程先通过dlopen()打开动态库文件,再通过dlsym()获取动态库对象地址,加载完成则需要dlclose()关闭动态库。...: 检查该动态库是否已加载; 通过dlopen打开动态共享库; 创建SharedLibrary共享库,并添加到libraries_列表; 通过dlsym获取JNI_OnLoad符号所对应方法, 并调用该方法...无论哪种方式,最终都会调用到LoadNativeLibrary()方法,该方法主要操作: 通过dlopen打开动态共享库; 通过dlsym获取JNI_OnLoad符号所对应方法; 调用该加载库中JNI_OnLoad...Linux环境下加载动态库主要包括如下函数,位于头文件#include 中: void *dlopen(const char *filename, int flag); //打开动态链接库...,所以编译时候带上-std=c++11,另外使用了头文件dlfcn.h需要带上-ldl,编译生成main文件即是二进制可执行文件,需要将动态库放在同级目录下执行。

    7.9K31

    Linux动态链接库.so文件创建与使用

    静态函数库现在已经不在像以前用得那么多了,主要是共享函数库与之相比较有很多优势原因。慢慢地,大家都喜欢使用共享函数库了。...这些函数库如何使用 在基于GNU glibc系统里,包括所有的linux系统,启动一个ELF格式二进制可执行文件会自动启动和运行一个program loader。...我们后面会继续讨论这个问题。   4.2. dlerror() 通过调用dlerror()函数,我们可以获得最后一次调用dlopen(),dlsym(),或者dlclose()错误信息。 ...4.3. dlsym() 如果你加载了一个DL函数库而不去使用当然是不可能了,使用一个DL函数库主要一个函数就是dlsym(),这个函数在一个已经打开函数库里面查找给定符号。...这个函数如下定义:         void * dlsym(void *handle, char *symbol); 函数中参数handle就是由dlopen打开后返回句柄,symbol是一个以NIL

    9.3K51
    领券