问:SylixOS 中动态装载与动态链接的区别及使用方法?
答:
1. 适用范围
本文档适用于对动态装载有了解学习需求以及对动态装载与动态链接两者区别及使用有了解需求的开发人员。
2. 原理概述
动态装载 (Dynamic loading) 意味着在加载或运行时将库(或任何其他二进制文件)加载到内存中。
动态加载可以类比于插件,也就是说,在动态加载发生之前,程序可以实际执行,在需要时,可以通过调用 “dlopen”、“dlsym”、“dlclose”
进行动态装载并使用库文件。
动态链接 (dynamic linking) 指的是在编译(汇编)之后,分解字符(resolving symbols)——把名字和地址或者偏移量联系起来。
动态链接,在可执行文件装载时或运行时,由操作系统的装载程序加载库。大多数操作系统将解析外部引用(比如库)作为加载过程的一部分。
2) RealEvo-IDE。
动态装载(英语:Dynamic Loading)是一种程序运行机制,能让计算机程序在运行时(而不是编译时)装载库(或者其他二进制对象)到内存
中,然后检索库中函数和变量的地址,并运行这些函数或访问这些变量,且能在不需要时将库从内存中卸载。
SylixOS 动态加载器具备以下功能:
1) 支持内核模块、位置无关的可执行程序及动态库加载。
2) 支持加载应用时自动加载应用所依赖的库文件,自动解决依赖关系。
3) 支持程序运行过程中通过 API 接口手动加载。
4) 支持 C++,全局对象自动构建、销毁等操作,支持 C++ 异常处理。
1) 首先编译自己所需要的动态库文件;
2) 编译自己的程序,
a. 通过 “dlopen” 函数进行动态库装载;
b. 通过 “dlsym” 函数调用动态库中所需要的函数并执行;
c. 通过 “dlclose” 函数关闭动态库,完成本次动态装载操作。
3) 将动态库与程序部署到SylixOS系统下运行。
下图为程序代码以及执行流程:
#include <stdio.h>
#include <dlfcn.h>
int main (int argc, char *argv[])
{
void *so_handler;
void (*sub_fun)();
fprintf(stdout, "Hello World!\n");
so_handler = dlopen("libdltest.so", RTLD_GLOBAL);
if (!so_handler) {
fprintf(stderr, "%s \n",dlerror());
return (-1);
}
sub_fun = dlsym(so_handler, "lib_func_test");
if (!sub_fun) {
fprintf(stderr, "%s \n",dlerror());
return (-2);
}
sub_fun();
dlclose(so_handler);
return (0);
}
图 4-1动态装载函数及演示
4.2 动态链接
动态链接(英语:Dynamic Loading),他是使得不同的程序开发者和部门能够相对独立地开发和测试自己的程序模块,从某种意义上来讲大大
促进了程序的开发效率,原先限制程序的规模也随之扩大。
RealEvo-IDE 工具支持在编译时配置动态链接库,以下为具体使用流程:
1) 创建应用工程,并在应用工程调用动态库程序并声明;
2) 应用工程的link配置中选择对应动态库的文件进行链接配置后编译工程;
3) 将动态库与应用程序都上传到 SylixOS 系统指定目录下;
4) 在 SylixOS 系统下运行该程序,能够正确调用动态库函数。
图 4-2配置动态链接库文件
图 4-3动态链接演示