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


0 0
原创粉丝点击