SylixOS 中动态装载与动态链接的区别及使用方法?

SylixOS 中动态装载与动态链接的区别及使用方法?


问:SylixOS 中动态装载与动态链接的区别及使用方法?

答:

1. 适用范围

本文档适用于对动态装载有了解学习需求以及对动态装载与动态链接两者区别及使用有了解需求的开发人员。

 

2. 原理概述

      动态装载 (Dynamic loading) 意味着在加载或运行时将库(或任何其他二进制文件)加载到内存中。
      动态加载可以类比于插件,也就是说,在动态加载发生之前,程序可以实际执行,在需要时,可以通过调用 “dlopen”、“dlsym”、“dlclose”
      进行动态装载并使用库文件。
      
      动态链接 (dynamic linking) 指的是在编译(汇编)之后,分解字符(resolving symbols)——把名字和地址或者偏移量联系起来。
      动态链接,在可执行文件装载时或运行时,由操作系统的装载程序加载库。大多数操作系统将解析外部引用(比如库)作为加载过程的一部分。

 

3. 准备工作

3.1 环境准备

      1) SylixOS 操作系统;
      2) RealEvo-IDE。


4. 技术实现

4.1 动态装载

      动态装载(英语:Dynamic Loading)是一种程序运行机制,能让计算机程序在运行时(而不是编译时)装载库(或者其他二进制对象)到内存
      中,然后检索库中函数和变量的地址,并运行这些函数或访问这些变量,且能在不需要时将库从内存中卸载。

      SylixOS 动态加载器具备以下功能:
      1) 支持内核模块、位置无关的可执行程序及动态库加载。
      2) 支持加载应用时自动加载应用所依赖的库文件,自动解决依赖关系。
      3) 支持程序运行过程中通过 API 接口手动加载。
      4) 支持 C++,全局对象自动构建、销毁等操作,支持 C++ 异常处理。

      以下为动态加载测试使用流程:
      1) 首先编译自己所需要的动态库文件;
      2) 编译自己的程序,
            a. 通过 “dlopen” 函数进行动态库装载;
            b. 通过 “dlsym” 函数调用动态库中所需要的函数并执行;
            c. 通过 “dlclose” 函数关闭动态库,完成本次动态装载操作。
      3) 将动态库与程序部署到SylixOS系统下运行。

      下图为程序代码以及执行流程:
  1. #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动态链接演示





    • Related Articles

    • SylixOS 功能介绍及版本差异

      SylixOS功能介绍及版本差异 SylixOS 标准版 SylixOS 标准版是 SylixOS 的基础版本,具备如下功能: 兼容 IEEE 1003(ISO/IEC 9945)操作系统接口规范; 兼容 POSIX 1003.1b(ISO/IEC 9945-1)实时编程标准; 支持国军标 GJB7714-2012 操作系统接口规范; 优秀的实时性能(任务调度与切换算法时间复杂度为 O(1)); 支持无限多任务; 抢占式调度支持 256 个优先级; 支持虚拟进程; ...
    • SylixOS lite 版—基于 STM32F767 资源使用情况

      1、基本概念     代码段(text):顾名思义,代码存放的位置,在 STM32 中代码段一般存放于内置 FLASH 中; 已初始化数据段(data):已初始化数据段会分别体现在 FlASH 中和 RAM 中。因为是全局变量,运行过程中需要进行读写操作,因此占用一段 RAM 空间。又因为有初始值,其初始值需要占用 FlASH 空间。   未初始化的数据段(bss):bss 与 data 相同的地方时它也是全局变量,运行过程中需要进行读写操作,因此占用一段 RAM ...
    • error: xxx-sylixos-elf-lzocom.exe

      Q:IDE 在编译工程时出现:xxxx-sylixos-elf-lzocom.exe  应用程序出错。 应用程序无法正常启动(0xc000007b)。请单击“确定”关闭应用程序。信息如下图所示。 安装 vc2010_redist_x86.exe 即可解决此问题, 此文件在 IDE 软件安装包的 Tools 目录下(如 SylixOS IDE 3.9.11_professional\Tools) 。
    • SylixOS上同时运行多个APP提示内存申请失败

      问:SylixOS上同时运行多个APP提示内存申请失败,怎样解决? 答:在 SylixOS 中,所有动态加载的对象,如内核模块、动态链接库、应用程序所使用的内存都来自于虚拟内存空间。虚拟内存空间以页为单位进行管理,对象加载时,只会获得虚拟页面,只有在真正使用时,才会进行物理页面的分配。 系统每启动一个app会预先分配32M左右的虚拟内存,但是不进行映射,使用时才映射物理地址。 例如在FUXI-H2的bsp中,虚拟内存描述符如下: ...
    • 手动修改 SylixOS 工程类型的方法

       问题描述:        当我们想要通过 IDE 重新选择已有 SylixOS Project 的 base 时,如果 base 的类型需要变化,会遇到如下图所示的问题"SylixOS Base project invalid",导致无法选择想要的base。 问题原因:        当base类型变化了,创建SylixOS Project时,工程设置里设定了base的类型。 解决方法一:       ...