SylixOS动态加载器系列文章(3) 使用API及shell命令
来源:互联网 发布:厦门建研集团待遇 知乎 编辑:程序博客网 时间:2024/06/06 08:54
SylixOS兼容posix标准,所有动态库API也使用posix标准的API接口。
动态库常用API
1. 加载动态库
程序运行过程中动态加载库的函数原型如下:
#include <dlfcn.h>
void *dlopen (const char *pcFile, int iMode);
函数原型分析:
l 返回加载完成后的模块句柄,如果失败则返回NULL。
l 参数pcFile是库文件路径,SylixOS加载器会检测pcFile是否为路径,如果是则加载该路径对应的文件,如果不是则在动态库文件搜索路径中查找名称为pcFile的文件,动态库文件搜索路径参考1.2.2节。
l 参数iMode以掩码形式表示库的加载属性,其中RTLD_GLOBAL掩码位表示模块为全局模块,只有全局模块能导出符号到内核符号表。
2. 查找符号
在以加载动态库中查找符号的函数原型如下:
#include <dlfcn.h>
void *dlsym (void *pvHandle, const char *pcName);
函数原型分析:
l 返回符号地址,如果查找失败则返回NULL。
l 参数pvHandle为模块句柄,由dlopen返回。
l 参数pcName是被查找的符号名称。
3. 卸载动态库
卸载动态库函数原型如下:
#include <dlfcn.h>
int dlclose (void *pvHandle);
函数原型分析:
l 成功返回0,失败返回错误码。
l 参数pvHandle为模块句柄,由dlopen返回。
4. 获取错误信息
获取加载错误信息函数原型如下:
#include <dlfcn.h>
Char *dlerror (void);
函数原型分析:
l 返回带有错误信息的字符串,注意该字符串不能被释放。
代码示例
程序清单1‑1 app程序源码
#include<stdio.h>
#include<dlfcn.h>
int main (intargc, char *argv[])
{
void *so_hander;
void (*sub_fun)();
printf("Hello World!\n");
so_hander = dlopen("libsubfun.so",RTLD_GLOBAL);
if (!so_hander) {
printf("%s \n",dlerror());
return -1;
}
sub_fun = dlsym(so_hander, "lib_func_test");
if (!sub_fun) {
printf("%s \n",dlerror());
return -2;
}
sub_fun();
dlclose(so_hander);
return 0;
}
程序清单1‑2 动态链接库源码
#include<stdio.h>
voidlib_func_test (void)
{
printf("hello librarylib_func_test() run!\n");
}
程序运行结果如下:
[root@sylixos_station:/]#cd /apps/app
[root@sylixos_station:/apps/app]#./app
Hello World!
hello librarylib_func_test() run!
其它API
下面函数可获取比指定地址小的且离指定地址最近的符号信息。
#include <dlfcn.h>
int dladdr (void *pvAddr, Dl_info *pdlinfo);
函数原型分析:
l 返回大于0表示成功,其它表示失败。
l 参数pvAddr为符号地址。
l 参数pdlinfo保存返回的符号信息,以下是它的成员信息。
表1‑1 符号信息结构体选项
结构成员名
解释
const char *dli_fname
模块文件路径
Void *dli_fbase
模块加载地址
const char *dli_sname
符号名称
Void *dli_saddr
符号地址
动态链接库Shell命令
查看动态链接库
运行modules可查看系统当前所加载所有模块,包括内核模块、应用程序可执行文件以及应用程序动态库。
[root@sylixos_station:/]# modules
NAME HANDLE TYPE GLB BASE SIZE SYMCNT
------------------------------ -------- ------ ----------- -------- --------
VPROCESS: kernel pid: 0 TOTAL MEMORY: 32768
+ xsiipc.ko 30c5dfa8 KERNEL YESc00e9000 633c 14
VPROCESS: app pid: 3 TOTAL MEMORY: 65536 <vp ver:1.3.4>
+ app 30c639c8 USER YES c0008000 83d8 2
+ libvpmpdm.so 30c63f20 USER YES c0018000 d39c 70
+ libsubfun.so 30c63e58 USER YES c0028000 8344 2
total modules : 4
如果只想看内核模块,则运行lsmod命令。
[root@sylixos_station:/]# lsmod
NAME HANDLE TYPE GLB BASE SIZE SYMCNT
------------------------------ -------- ------ ----------- -------- --------
VPROCESS: kernel pid: 0 TOTAL MEMORY: 32768
+ xsiipc.ko 30c5dfa8 KERNEL YESc00e9000 633c 14
total modules : 1
加载内核模块
使用modulereg命令加载内核模块。
[root@sylixos_station:/]# modulereg/lib/modules/xinput.ko
module /lib/modules/xinput.ko register ok,handle : 0x30c64ae8
卸载内核模块
使用moduleunreg命令卸载内核模块。注意,moduleunreg的命令参数是模块句柄,所以在卸载之前需使用modules或lsmod命令获取模块句柄。
[root@sylixos_station:/]# lsmod
NAME HANDLE TYPE GLB BASE SIZE SYMCNT
------------------------------ -------- ------ ----------- -------- --------
VPROCESS: kernel pid: 0 TOTAL MEMORY: 49152
+ xsiipc.ko 30c5dfa8 KERNEL YESc00e9000 633c 14
+ xinput.ko 30c64ae8 KERNEL YESc210e000 21d0 1
total modules : 2
[root@sylixos_station:/]# moduleunreg 30c64ae8
module /lib/modules/xinput.ko unregister ok.
SylixOS官网:www.sylixos.com
SylixOS源码下载:git.sylixos.com
SylixOS百科:wiki.sylixos.com
- SylixOS动态加载器系列文章(3) 使用API及shell命令
- SylixOS动态加载器系列文章(5) 应用程序加载原理
- SylixOS动态加载器系列文章(1) ELF文件格式
- SylixOS动态加载器系列文章(2) 功能介绍
- SylixOS动态加载器系列文章(6) C++支持
- SylixOS动态加载器系列文章(7) ARM体系结构相关
- SylixOS动态加载器系列文章(4) 内核模块加载原理
- 动态加载系列文章
- SylixOS Shell使用
- ldd命令及动态库加载
- 深度剖析类加载器系列文章:二、类的主动使用和被动使用
- SylixOS 驱动程序加载
- Redis起步安装及基本命令--JAVA(系列文章一)
- Android Apk资源加载机制源码分析以及资源动态加载实现系列文章
- 常用Shell命令及Vi的使用
- Lightmapping使用及动态加载lightmap方案
- 淘宝API开发系列---淘宝API的测试及使用
- 淘宝API开发系列---淘宝API的测试及使用
- 算法---fbnc数列
- LPTSTR、LPCSTR、LPCTSTR、LPSTR的来源及意义
- 《不要一个人吃饭( Never Eat Alone)》
- Android 百分比布局库(percent-support-lib) 解析与扩展
- FaceBook/infer-linux下源码环境搭建
- SylixOS动态加载器系列文章(3) 使用API及shell命令
- 字符串匹配——KMP算法
- 国内最全最详细的Hadoop2.2.0集群的HA高可靠的最简单配置
- C++文件操作详解(ifstream、ofstream、fstream)
- select ......for update 语句解释 (文章中有些地方描述的不是很准确)
- Android studio LogCat 显示
- Python Unittest 自动化单元测试框架Demo
- apache 与 tomcat的关系
- 【Scala】Scala的Predef对象