当前位置: 代码网 > 服务器>服务器>Linux > Linux动态加载并调用动态库(.so)实现方式

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

2026年04月07日 Linux 我要评论
概念加载动态链接库,首先为共享库分配物理内存,然后在进程对应的页表项中建立虚拟页和物理页面之间的映射。你可以认为系统中存在一种引用计数机制, 每当一个进程加载了共享库(在该进程的页表中进行一次映射),

概念

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

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

一个进程显式卸载(通过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 链接选项

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com