一种动态链接库实现方法、系统、计算机设备及存储介质与流程

文档序号:21970607发布日期:2020-08-25 19:00阅读:130来源:国知局
一种动态链接库实现方法、系统、计算机设备及存储介质与流程

本发明涉及嵌入式系统领域,尤其涉及一种动态链接库实现方法、系统、计算机设备及存储介质。



背景技术:

随着工业4.0和物联网的兴起,嵌入式设备日益复杂,因此出现了多分区、运行进程模型的单片机。然而,在多个进程之间,往往有动态共享的代码段部分,这些部分对于每一个进程都是共同的,然而数据段则对各个进程是不同的。在带有mmu的处理器上,我们通常使用页表映射各个进程的放置在不同物理内存地址的数据段到不同进程中的同一个虚拟地址,这样即便数据段的虚拟地址不同,也可以不使用编译器的(pic)。但是在微控制器上情况却不相同:要使用任何的动态链接库,现有技术都要求必须使用位置无关代码,因为微控制器不具备虚拟存储器功能。

现有的嵌入式设备的动态链接库的制作方法大概有如下几种:

将同一个库的代码段和数据段复制两份,放置在不同的进程中。这种做法完全不要求工具链有产生pic的功能,但是对代码段的无端复制是非常浪费微控制器仅有的flash的。如果碰巧代码段的体积比较大(比如某些dsp函数内部的表或者一整个js语言运行时),可能导致微控制器的代码段体积完全失控。

使用位置无关代码。这种方法使用编译器的特殊命令行参数(如gcc的-fpic生成位置无关代码)。然后在每个进程启动之时使用特殊的一小段代码修正该动态链接库的数据链接到不同的进程中的数据段。此种做法仅仅保留了一份代码段,在性能上也没有任何损失,但在各个编译器之间是不兼容的。修正动态链接库的一小段代码在不同的架构和编译器上往往大相径庭,因为不同编译器生成的位置无关代码的具体细节往往有偏差。使用该种方法,对于架构和编译器的适配工作量极大,也即该方法不是编译器(工具链)中立的,无法使用一套代码应付多个场合。

在编写库的时候,就库中添加一个放置有所有的全局变量的结构体对象,然后在每次调用该库时都往代码段传入该结构体对象的指针(类似c库中的file*)。此种做法固然不需要编译器支持pic,也可以只保留一份代码段,但是当该库只有一个进程引用时,我们仍然需要提供该库的结构体对象指针,在访问全局变量时也总是会从这个指针开始,这造成了不必要的性能开销,也造成了代码段的膨胀。也即,如果自始至终只有一个进程引用该库,那么从一开始就完全没有必要使用该结构体对象。



技术实现要素:

本发明所要解决的技术问题在于,提供一种动态链接库实现方法、系统、计算机设备及存储介质,能够解决现有的技术问题。

为了解决上述技术问题,本发明提供了一种动态链接库实现方法,包括:扫描原始库文件的源代码中的全局变量并用宏定义所述全局变量,在所述原始库文件的源代码中的每个非c运行时库的函数上都加上一个用宏定义的结构体指针参数;创建一个头文件并声明一个包括所有全局变量的结构体指针,进而得到满足格式要求的目标库文件;检测所述目标库文件的链接方式并根据链接方式对目标库文件进行相应的配置,其中,如果检测到目标库文件以静态链接方式被编译链接,则代表全局变量的宏会被定义为全局变量本身,并将代表结构体指针的宏定义为空,如果检测到目标库文件以动态链接方式被编译链接,则代表全局变量的宏会被定义为通过结构体存取的全局变量,并将代表结构体指针的宏定义为结构体指针的声明。

优选地,所述动态链接库实现方法还包括:对每一个进程生成额外的代码包裹库的外部接口,隐藏其数据段结构体指针,并且在调用时将数据段结构体指针指向分区的全局变量结构体的位置。

优选地,所述对每一个进程生成额外的代码包裹库的外部接口的方法为:如果生成的接口比原来的接口少了结构体指针,则库的外部接口必须要设置结构体指针供每一个进程传入其私有数据区域的位置,对于每个进程的数据区域的位置,传递一个固定的指针的值到进程中。

优选地,不经过宏在源代码中做替换而直接预处理源代码为最终配置形式,即在动态配置下直接替换全局变量为通过结构体指针访问的全局变量和在每个非c运行时库函数的参数列表中都加上结构体指针。

本发明还提供了一种动态链接库实现系统,包括:预处理模块,用于对库文件进行预处理,其中,预处理模块包括扫描单元、宏定义单元以及创建单元,所述扫描单元用于扫描所述库文件的源代码中的全局变量;所述宏定义单元用于并用宏替换所述全局变量,用于在所述库文件的源代码中的每个非c运行时库的函数上都加上一个用宏定义代表的结构体指针参数,所述创建单元用于创建一个头文件并声明一个包括所有全局变量的结构体指针,进而得到满足格式要求的库文件;检测配置模块,用于检测库文件的链接方式并根据链接方式对库文件进行相应的配置,其中,如果检测到库文件以静态链接方式被编译链接,则代表全局变量的宏会被定义为全局变量本身,并将代表结构体指针的宏定义为空,如果检测到库文件以动态链接方式被编译链接,则代表全局变量的宏会被定义为通过结构体存取得全局变量,并将代表结构体指针的宏定义为结构体指针的声明。

优选地,所述检测配置模块还对每一个进程生成额外的代码包裹库的外部接口,隐藏其数据段结构体指针,并且在调用时将数据段结构体指针指向分区的全局变量结构体的位置。

优选地,所述检测配置模块用于当生成的外部接口比原来的接口少了结构体指针时,给包裹库的外部接口必须要设置结构体指针供每一个进程传入其私有数据区域的位置,对于每个进程的数据区域的位置,传递一个固定的指针的值到进程中。

优选地,预处理模块不经过宏在源代码中做替换而直接预处理源代码为最终配置形式,即在动态配置下直接替换全局变量为通过结构体指针访问的全局变量和在每个非c运行时库函数的参数列表中都加上结构体指针。

本发明还提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机指令,所述处理器执行所述指令时实现任意一项所述方法的步骤。

本发明还提供了一种存储介质,其存储有计算机指令,该程序被处理器执行时实现任意一项所述方法的步骤。

实施本发明的有益效果在于:

本发明提供一种动态链接库实现方法、系统计算机设备及存储介质,可以极大程度地增加微控制器环境下动态链接库的跨工具链可用性,并提高库在静态链接状况下的性能。首先,本发明在进行动态链接时不限于某种工具链本身,没有对工具链的依赖,用户可以自行切换工具链。第二,本发明在使用动态链接和静态链接时对外提供的接口是相同的,底层数据的访问被隐藏,不需要用户显式地传入指向全局数据段的指针。第三,本发明在静态链接下由于不存在结构体指针,因此可以完全消除由此指针造成的代码膨胀和性能损失,达到了整个系统性能的最大化。第四,如果使用的库文件本身(比如其他开源库)不直接满足库配置模块的格式要求,那么可以通过库文件预处理模块将库文件变为符合要求的格式,大大增加了本发明能使用的库的范围。

附图说明

图1是本发明提供的动态链接库实现方法流程图;

图2是本发明提供的动态链接库实现系统示意图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述。仅此声明,本发明在文中出现或即将出现的上、下、左、右、前、后、内、外等方位用词,仅以本发明的附图为基准,其并不是对本发明的具体限定。

如图1所示,本发明提供了一种动态链接库实现方法,包括:

s101,扫描库文件的源代码中的全局变量并用宏定义所述全局变量,

s102,在所述库文件的源代码中的每个非c运行时库的函数上都加上一个用宏定义代表的结构体指针参数;

s103,创建一个头文件并声明一个包括所有全局变量的结构体指针,进而得到满足格式要求的库文件;

s104,检测库文件的链接方式并根据链接方式对库文件进行相应的配置,其中,如果检测到库文件以静态链接方式被编译链接,则代表全局变量的宏会被定义为全局变量本身,并将代表结构体指针的宏定义为空,如果检测到库文件以动态链接方式被编译链接,则代表全局变量的宏会被定义为通过结构体存取的全局变量,并将代表结构体指针的宏定义为结构体指针的声明。

优选地,所述动态链接库实现方法还包括:对每一个进程生成额外的代码包裹库的外部接口,隐藏其数据段结构体指针,并且在调用时将数据段结构体指针指向分区的全局变量结构体的位置。这样,用户就完全注意不到结构体指针本身,使用动态和静态链接的外部接口本身并无任何区别。

进一步地,所述对每一个进程生成额外的代码包裹库的外部接口的方法为:如果生成的接口比原来的接口少了结构体指针,则库的外部接口必须要设置结构体指针供每一个进程传入其私有数据区域的位置,对于每个进程的数据区域的位置,传递一个固定的指针的值到进程中。

以c类语言表示的源码举例,例如:

库的接口为func(ptr,param1,param2)

在进程1中包裹为:

proc1_func(param1,param2)//包裹库外部接口进程

{

func(proc1_data,param1,param2)//库的外部接口

}

在进程2中包裹为:

proc2_func(param1,param2)//包裹库外部接口进程

{

func(proc2_data,param1,param2)//库的外部接口

}

更佳地,不经过宏在源代码中做替换而直接预处理源代码为最终配置形式,即在动态配置下直接替换全局变量为通过结构体指针访问的全局变量和在每个非c运行时库函数的参数列表中都加上结构体指针。

如图2所示,本发明还提供了一种动态链接库实现系统,包括:预处理模块1,用于对库文件进行预处理,其中,预处理模块1包括扫描单元101、宏定义单元102以及创建单元103,所述扫描单元101用于扫描所述库文件的源代码中的全局变量并用宏替换所述全局变量,所述宏定义单元102用于在所述库文件的源代码中的每个非c运行时库的函数上都加上一个用宏定义代表的结构体指针参数,所述创建单元103用于创建一个头文件并声明一个包括所有全局变量的结构体指针,进而得到满足格式要求的库文件;检测配置模块2,用于检测库文件的链接方式并根据链接方式对库文件进行相应的配置,其中,如果检测到库文件以静态链接方式被编译链接,则代表全局变量的宏会被定义为全局变量本身,并将代表结构体指针的宏定义为空,如果检测到库文件以动态链接方式被编译链接,则代表全局变量的宏会被定义为通过结构体存取得全局变量,并将代表结构体指针的宏定义为结构体指针的声明。

优选地,所述检测配置模块2还对每一个进程生成额外的代码包裹库的外部接口,隐藏其数据段结构体指针,并且在调用时将数据段结构体指针指向分区的全局变量结构体的位置。

更佳地,所述检测配置模块用于当生成的外部接口比原来的接口少了结构体指针时,给包裹库的外部接口必须要设置结构体指针供每一个进程传入其私有数据区域的位置,对于每个进程的数据区域的位置,传递一个固定的指针的值到进程中。

进一步地,预处理模块不经过宏在源代码中做替换而直接预处理源代码为最终配置形式,即在动态配置下直接替换全局变量为通过结构体指针访问的全局变量和在每个非c运行时库函数的参数列表中都加上结构体指针。

由于本发明采取结构体指针访问全局变量,因此是工具链中立的,不依赖工具链本身的功能。本发明在动态链接的场合下生成的接口无结构体指针,因此用户也免去了在动态和静态使用的场合下适配不同接口的麻烦,同一份库代码在静态和动态链接下切换完全不需要修改代码。

本实施给出一个非常简要的具体实施例,阐述该方法如何生成一个具体的动态链接库。具体如下:

某公司研发某基于javascript编程的智能硬件产品。该产品有两条产品线,其中一条产品线只允许用户运行一个javascript脚本,另一条产品线则允许用户并行运行多个javascript脚本。由于javascript运行时环境可能会崩溃,因此我们不希望将多个javascript脚本放置在一个进程内部,必须要使用多个进程,每个运行一个javascript脚本。由于javascript运行时是一个库,因此我们不希望系统中出现多份代码段副本。首先,由于javascript运行时是开源软件,因此需要运行库文件预处理模块生成其可被库配置器模块配置的javascript运行时库文件本身。然后,在单一javascript脚本的产品线上使用静态链接,此时配置器将结构体指针宏消去,并且将直接生成静态链接的、无性能损失的代码。在多javascript脚本的产品线上使用动态链接,此时由配置器在胶水代码中生成包裹接口并且在包裹接口内部传入指向静态定义结构体的指针给库,对外仍然表现为与静态配置一样的接口,使得该公司既可以使用同一份代码段不需要显式地更改代码以传入结构体指针。实现方便的动态链接。在该实施例中,该公司自始至终无须进行涉及到编译器和工具链本身的任何特点,因为本发明是与工具链无关的,也不依赖于工具链生成位置无关代码。

本发明还提供了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机指令,所述处理器执行所述指令时实现上述方法的步骤。

本发明还提供了一种存储介质,其存储有计算机指令,该程序被处理器执行时实现上述方法的步骤。以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围。

所述动态链接库实现系统可以运行于桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备中。本领域技术人员可以理解,所述例子仅仅是动态链接库实现系统的示例,并不构成对动态链接库实现系统的限定,可以包括比例子更多或更少的部件,或者组合某些部件,或者不同的部件,例如所述动态链接库实现系统还可以包括输入输出设备、网络接入设备、总线等。

所称处理器可以是中央处理单元(centralprocessingunit,cpu),还可以是其他通用处理器、数字信号处理器(digitalsignalprocessor,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)、现场可编程门阵列(field-programmablegatearray,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,所述处理器是所述动态链接库实现系统运行系统的控制中心,利用各种接口和线路连接整个动态链接库实现系统可运行系统的各个部分。

所述存储器可用于存储所述计算机程序和/或模块,所述处理器通过运行或执行存储在所述存储器内的计算机程序和/或模块,以及调用存储在存储器内的数据,实现所述动态链接库实现系统的各种功能。所述存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如硬盘、内存、插接式硬盘,智能存储卡(smartmediacard,smc),安全数字(securedigital,sd)卡,闪存卡(flashcard)、至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。

尽管本公开的描述已经相当详尽且特别对几个所述实施例进行了描述,但其并非旨在局限于任何这些细节或实施例或任何特殊实施例,而是应当将其视作是通过参考所附权利要求考虑到现有技术为这些权利要求提供广义的可能性解释,从而有效地涵盖本公开的预定范围。此外,上文以发明人可预见的实施例对本公开进行描述,其目的是为了提供有用的描述,而那些目前尚未预见的对本公开的非实质性改动仍可代表本公开的等效改动。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1