Linux动态加载并调用动态库(.so)实现方式

 更新时间:2026年04月07日 08:56:27   作者:enjoy嚣士  
本文介绍了加载动态链接库的过程以及引用计数机制,并详细描述了头文件中相关函数的作用,还提供了编译动态库和主程序的命令,强调了链接选项的重要性

概念

加载动态链接库,首先为共享库分配物理内存,然后在进程对应的页表项中建立虚拟页和物理页面之间的映射。

你可以认为系统中存在一种引用计数机制, 每当一个进程加载了共享库(在该进程的页表中进行一次映射),引用计数加一;

一个进程显式卸载(通过dlclose等)共享库或进程退出时,引用计数减 一,当减少到0时,系统卸载共享库。

头文件

#include <dlfcn.h>

相关函数介绍

(1)打开动态链接库:dlopen

函数原型
void *dlopen (const char *filename, int flag);
flag:分为这两种 
RTLD_NOW:在dlopen返回前,解析出全部没有定义的符号,解析不出来返回NULL。
RT_GLOBAL:动态库定义的符号可被其后打开的其他库解析。
RT_LOCAL:和上面相反,不能被其他库解析。默认。
RTLD_LAZY:暂缓决定,等有需要时再解出符号


返回值: 
打开错误返回NULL 
成功,返回库引用 
dlopen用于打开指定名字(filename)的动态链接库(最好文件绝对路径),并返回操作句柄。

(2)取函数执行地址:dlsym

函数原型
void *dlsym(void *handle, char *symbol); 
dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的函数的执行代码地址。

(3)关闭动态链接库:dlclose

函数原型
int dlclose (void *handle); 
returns 0 on success, and nonzero on error.
dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。

(4)动态库错误函数:dlerror

函数原型
const char *dlerror(void);
当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功。

示例

#include <stdio.h>  
#include <dlfcn.h>  
  
int main(int argc, char **argv) {  
	void *handle;  
	double (*cosine)(double);  
	char *error;  
  
	handle = dlopen ("/tmp/libtest.so", RTLD_LAZY);  
	if (!handle) {  
		fprintf (stderr, "%s ", dlerror());  
		exit(1);  
	}  
  
	cosine = (double(*)(double))dlsym(handle, "cos");  
	if ((error = dlerror()) != NULL)  {  
		fprintf (stderr, "%s ", error);  
		exit(1);  
	}  
  
	printf ("%f ", (*cosine)(2.0));  
	dlclose(handle);  
	return 0;  
}  

编译

编译动态库命令:

g++ -o libtest.so -rdynamic -shared -fPIC test.cpp

编译主程序命令:

g++ -o mainTest mainTest.cpp -rdynamic -ldl

注意要加-ldl 和 -rdynamic 链接选项

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • CentOS7配置阿里云yum源的方法代码

    CentOS7配置阿里云yum源的方法代码

    这篇文章主要介绍了CentOS7配置阿里云yum源的方法代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • apache后缀名支持 让apache支持apk ipk下载的方法

    apache后缀名支持 让apache支持apk ipk下载的方法

    一般都在mime.types文件中添加相应的后缀,重启apache后即可
    2012-04-04
  • Linux中查看目录下文件数量的几种方法

    Linux中查看目录下文件数量的几种方法

    在管理Linux系统时,经常需要检查特定目录下的文件数量,这可以帮助我们了解目录的内容量和结构,以下是几种在Linux中查看目录下文件数量的方法,每种方法都适用于不同的场景,需要的朋友可以参考下
    2025-08-08
  • 详解把Node.js项目部署到阿里云服务器(CentOs)

    详解把Node.js项目部署到阿里云服务器(CentOs)

    本篇文章主要介绍了把Node.js项目部署到阿里云服务器,非常具有实用价值,需要的朋友可以参考下
    2017-04-04
  • 详解虚拟机下CentOS 6.5配置IP地址的三种方法

    详解虚拟机下CentOS 6.5配置IP地址的三种方法

    本篇文章主要介绍了虚拟机下CentOS 6.5配置IP地址的三种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • CentOS7yum安装PHP7.2的操作方法

    CentOS7yum安装PHP7.2的操作方法

    下面小编就为大家分享一篇CentOS7yum安装PHP7.2的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • 手把手教你在腾讯云上搭建hive3.1.2的方法

    手把手教你在腾讯云上搭建hive3.1.2的方法

    这篇文章主要介绍了手把手教你在腾讯云上搭建hive3.1.2的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Linux 字符设备驱动框架详细介绍

    Linux 字符设备驱动框架详细介绍

    这篇文章主要介绍了Linux 字符设备驱动框架详细介绍的相关资料,字符设备就是字节流形式通讯的I/O设备,绝大部分设备都是字符设备,这里提供简单的实例,需要的朋友可以参考下
    2016-12-12
  • 密码学之apache部署https介绍

    密码学之apache部署https介绍

    大家好,本篇文章主要讲的是密码学之apache部署https介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 在Ubuntu中实现人脸识别登录的完整步骤

    在Ubuntu中实现人脸识别登录的完整步骤

    这篇文章主要给大家介绍了关于在Ubuntu中实现人脸识别登录的完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-06-06

最新评论