CN101441566B - 一种在嵌入式平台上动态链接程序的方法 - Google Patents
一种在嵌入式平台上动态链接程序的方法 Download PDFInfo
- Publication number
- CN101441566B CN101441566B CN200810180934.2A CN200810180934A CN101441566B CN 101441566 B CN101441566 B CN 101441566B CN 200810180934 A CN200810180934 A CN 200810180934A CN 101441566 B CN101441566 B CN 101441566B
- Authority
- CN
- China
- Prior art keywords
- application program
- interface class
- function
- middle layer
- interface
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 34
- 230000006870 function Effects 0.000 claims abstract description 158
- 238000005538 encapsulation Methods 0.000 claims description 8
- 230000008569 process Effects 0.000 claims description 8
- 210000003813 thumb Anatomy 0.000 claims description 4
- 238000010586 diagram Methods 0.000 description 6
- 230000008676 import Effects 0.000 description 5
- 238000011161 development Methods 0.000 description 4
- 239000012467 final product Substances 0.000 description 3
- 238000012545 processing Methods 0.000 description 3
- 208000004350 Strabismus Diseases 0.000 description 2
- 239000000284 extract Substances 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 239000002699 waste material Substances 0.000 description 2
- 230000000712 assembly Effects 0.000 description 1
- 238000000429 assembly Methods 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000000605 extraction Methods 0.000 description 1
- JEIPFZHSYJVQDO-UHFFFAOYSA-N ferric oxide Chemical compound O=[Fe]O[Fe]=O JEIPFZHSYJVQDO-UHFFFAOYSA-N 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 230000004807 localization Effects 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 239000000203 mixture Substances 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 239000000047 product Substances 0.000 description 1
- 239000011800 void material Substances 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45508—Runtime interpretation or emulation, e g. emulator loops, bytecode interpretation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
本发明实施例公开了一种嵌入式平台和在嵌入式平台上动态链接程序的方法。该嵌入式平台包括中间层;中间层包括接口类,每个接口类由嵌入式操作***的多个函数接口封装得到,每个接口类对应一个虚拟函数表,该虚拟函数表的各个元素与所述多个函数接口一一对应。待链接的应用程序包括接口类。将所述应用程序编译成位置独立的代码段、且由该应用程序的不同的函数编译出的代码段的存储位置互不相交,将编译出的所有代码段直接拷贝至嵌入式操作***内存;通过创建接口类指针,将接口类指针在中间层的接口类和所述应用程序的接口类之间传递实现程序动态链接。应用本发明能够提高动态链接程序的执行速度。
Description
技术领域
本发明涉及嵌入式技术领域,尤其涉及一种在嵌入式平台上动态链接程序的方法。
背景技术
众所周知,程序链接技术分为静态链接技术和动态链接技术。采用静态链接技术时,在编译阶段,应用程序的地址是确定的,如果当前有多个应用程序调用了函数库里的函数,则需要在内存中拷贝的函数库的份数与所述应用程序个数相同,这将浪费内存空间。而动态链接技术通过提供一种导入库来定位函数库中的函数,这种导入库中仅存储对函数之间的调用关系的描述,并不存储实际的代码,从而能够节约内存空间。
目前,在手机等嵌入式产品中,已经实现了程序的动态链接,其采用的是ELF动态链接的方式,具体请见图1。
图1是现有技术中采用可执行和链接格式(Executable and LinkingFormat,ELF)方式实现程序动态链接的示意图。
如图1所示,采用ELF方式实现程序动态链接时,首先将应用程序编译成ELF格式文件,然后采用ELF加载(ELF LOADER)程序对生成的ELF文件进行函数重定位和变量重定位,再将重定位后的ELF文件加载至嵌入式操作***(OS)中,最后,该嵌入式操作***根据该重定位后的函数和变量的位置链接各个函数和变量,从而实现程序的动态链接。
采用ELF方式实现程序动态链接时,ELF加载程序起着重要作用,其用于将应用程序中的函数和变量的地址与嵌入式操作***中的地址对接。具体地,ELF加载程序从ELF格式文件中提取有用信息,计算ELF格式文件中的各个函数和变量重定位后的地址,然后按照该地址对函数和变量进行重定位。
可见,采用ELF方式实现程序的动态加载时,由于需要从ELF格式文件中提取有用信息,并对这些有用信息进行计算,这一方面导致动态链接程序速度较慢,另一方面,也浪费计算资源。
发明内容
有鉴于此,本发明的目的在于提供一种可以广泛应用的在嵌入式平台上动态链接程序的方法,以提高动态链接程序的速度。
为达到上述目的,本发明的技术方案具体是这样实现的:
一种在嵌入式平台上动态链接程序的方法,该嵌入式平台包括中间层;所述中间层包括一个或多个接口类,每个接口类由嵌入式操作***的多个函数接口封装得到,每个接口类对应一个虚拟函数表,该虚拟函数表的各个元素与所述多个函数接口一一对应;所述中间层通过所述接口类调用所述嵌入式操作***的多个函数接口;待链接的应用程序包括一个或多个接口类,每个接口类由该应用程序的多个函数接口封装得到,每个接口类对应一个虚拟函数表,该虚拟函数表的各个元素分别与所述应用程序的多个函数接口一一对应,该方法包括:
将所述应用程序编译成位置独立的代码段、且由该应用程序的不同的函数编译出的代码段的存储位置互不相交,使得应用程序能够在任意存储空间内运行、且应用程序的各个函数能够被独立地调用;将编译出的所有代码段直接拷贝至嵌入式操作***内存;
通过创建接口类指针,将接口类指针在中间层的接口类和所述应用程序的接口类之间传递实现程序动态链接。
可见,本发明从嵌入式操作***封装出中间层,该中间层包括一个或多个接口类,每个接口类由嵌入式操作***的多个函数接口封装得到,每个接口类对应一个虚拟函数表,该虚拟函数表的各个元素与所述多个函数接口一一对应,待链接的应用程序包括一个或多个接口类,每个接口类由该应用程序的多个函数接口封装得到,每个接口类对应一个虚拟函数表,该虚拟函数表的各个元素分别与所述应用程序的多个函数接口一一对应,将所述应用程序编译成位置独立的代码段、且由该应用程序的不同的函数编译出的代码段的存储位置互不相交,使得应用程序能够在任意存储空间内运行、且应用程序的各个函数能够被独立地调用;将编译出的所有代码段直接拷贝至嵌入式操作***内存,通过创建接口类指针,将接口类指针在中间层的接口类和所述应用程序的接口类之间传递实现程序动态链接。
由于各个接口类指针一旦被创建,则该接口类指针对应的虚拟函数表的各个元素对应的函数接口则也被实例化,即,这些函数相应地被赋予实际的地址,此时,中间层的接口类对应的各个函数和应用程序对应的各个函数之间通过虚拟函数表实现了动态链接。因此,本发明通过创建接口类指针,将该接口类指针在中间层的接口类和所述应用程序的接口类之间传递,可以实现程序的动态链接。
并且,由于程序的动态链接是通过创建接口类指针、并在中间层的接口类和应用程序的接口类之间传递所述接口类指针实现的,因此,在将由应用程序编译出的文件加载至内存时,无需从该文件中提取信息来重新计算各个编译代码在内存中的位置,减少了实现程序动态链接所需的时间,提高了程序动态链接的速度。
附图说明
图1是现有技术中采用ELF方式实现程序动态链接的示意图;
图2是本发明的嵌入式平台结构图;
图3是在图2所示嵌入式平台上动态链接应用程序的示意图;
图4是本发明中间层和应用程序之间的交互示意图;
图5是以一种即时通讯(IM)工具为核心的无线动态应用程序开发环境。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明进一步详细说明。
图2是本发明的嵌入式平台结构图。如图2所示,该嵌入式平台包括中间层。
本发明从嵌入式操作***封装出中间层,该中间层由接口类组成,每个接口类对应一个虚拟函数表,虚拟函数表的各个元素与操作***的各个函数接口对应。
在从嵌入式操作***封装中间层时,可以将嵌入式操作***的所有函数中、应用程序常用的函数接口封装进中间层,其中,将功能相关联的函数的接口封装为一个接口类。例如将画图函数的接口、文字编辑函数的接口、网络连接函数的接口和信息发送函数的接口封装进中间层,并将画图函数的接口和文字编辑函数的接口封装为一个文档处理接口类,将网络链接函数的接口和信息发送函数的接口封装为一个网络接口类。每个接口类相当于一个组件程序,因此,中间层实际上相当于由多个组件程序组成。
图3是在图2所示嵌入式平台上动态链接应用程序的示意图。
如图3所示,本发明动态链接程序的过程包括:BIN文件编译生成、BIN文件下载存储、BIN文件加载和程序动态链接阶段。
本发明在图2所示的操作***上实现动态链接的应用程序也由一个或多个接口类组成,每个接口类由该应用程序的多个函数接口封装得到,每个接口类对应了一个虚拟函数表,每个虚拟函数表的各个元素分别与所述应用程序的多个函数接口一一对应。与中间层的接口类的组成方式相同,应用程序的接口类中的各个接口对应的函数也是彼此相关联的函数。在应用程序中,每个接口类也相当于一个组件程序。因此,通过接口类来实现应用程序,实际上相当于将应用程序划分为多个组件程序。
需要说明的是,要在嵌入式平台上实现程序的动态链接,需要解决以下四个问题:函数导入问题、函数引出问题、子函数调用问题和全局变量定位问题。
函数导入问题是指,需要动态链接的应用程序如何通过中间层调用嵌入式操作***的函数;函数引出问题是指,嵌入式操作***如何通过中间层调用应用程序的函数;子函数调用问题是指,应用程序中的子函数是如何被该应用程序或者中间层调用的;全局变量定位问题是指,如果应用程序中包含全局变量,如何实现在将应用程序链接到嵌入式平台后,将该应用程序中的全局变量在所述嵌入式平台中实现重定位。
函数导入问题和函数引出问题主要涉及BIN文件编译生成阶段和程序动态链接阶段;子函数调用问题和全局变量定位问题主要涉及BIN文件编译生成阶段。
下面以图3所示的四个阶段为顺序,针对ARM嵌入式操作平台的特性,介绍在图2所示嵌入式平台上实现程序动态链接的方法。
一、BIN文件编译生成阶段
首先,应用程序开发人员需要采用接口类的形式编写应用程序,需保证应用程序由接口类组成,每个接口类由该应用程序的一个或多个函数接口封装得到,每个接口类对应了一个虚拟函数表,每个虚拟函数表的各个元素分别对应了不同的函数接口,即,相当于将应用程序划分为多个组件程序,将每个组件程序编写成一个接口类。
然后,将应用程序编译成位置独立(Position Independence Code,IPC)的代码,并且该代码是BIN文件的形式。其中,位置独立的代码是指,其运行不依赖于具体的存储位置,而可以在任意存储空间内运行的代码。
具体地,当采用ARM ADS1.2编译器编译应用程序时,可以通过编译选项ACPS/ROPI将应用程序的代码段编译生成为位置独立(PositionIndependence Code,IPC)的代码段,其中ROPI选项的作用是编译出的只读段的位置是独立的。
由于将应用程序编译成了位置独立的代码,因此,在BIN文件加载阶段,可以将BIN文件加载至嵌入式平台的内存的任意存储位置运行。
由于将应用程序划分为多个组件程序,而中间层也是由多个组件程序实现,因此,应用程序和中间层可以通过组件程序之间的交互、或者说通过接口类,来实现函数的导入和引出。关于应用程序和中间层如何通过接口类实现函数的导入和引出,将在程序动态链接阶段予以详细说明。
对于子函数调用问题,本发明通过在BIN文件编译生成阶段中,将该应用程序中的各个函数编译成彼此位置独立、且互不交叉的代码段,使得各个函数可以彼此独立的运行,从而方便调用各个不同的函数、而不会影响其他函数。
具体地,当采用ARM ADS1.2编译器编译应用程序时,可以通过采用ZO编译选项将该应用程序中的各个函数编译成彼此位置独立、且互不交叉的代码段。
例如,假设有如下的应用程序:
假设appMain函数始终被编译在BIN文件的首地址0x00000000处,采用ACPS/ROPI和ZO编译选项对该应用程序进行编译,则编译结果如表一:
函数 | 地址 |
appMain | PC+0x00 |
fun1 | PC+0x0A |
表一
在表一中,PC是BIN文件的首地址;0x0A代表函数fun1的偏移地址。
由表一可见,将应用程序编译成位置独立、且各个函数彼此独立互不交叉的代码段后,各个函数之间的跳转是相对跳转,具体跳转到何处由偏移地址决定,这样,应用程序中的各个函数均可以被该应用程序内部的函数或者该应用程序外部的函数独立地调用。
对于全局变量定位问题,可以采用两种处理方式,其一是将全局变量放在应用程序的结构体中,因此,在将结构体被编译成位置独立的代码段时,将结构体中的全局变量也编译进了该位置独立的代码段,其二是全局变量编译成位置独立的数据段。采用前一种处理方式能够同时将多个应用程序加载在图2所示的嵌入式平台上,但是由于全局变量存储在应用程序的结构体中,因此,在使用全局变量时,需要到相应的结构体中取所述全局变量,操作较复杂。采用后一种处理方式时,由于全局变量被编译成位置独立的数据段,因此,可以将全局变量存放在结构体以外的位置,通常将全局变量存储在代码段所在的随机存储器(RAM)存储空间之后的存储空间内,以避免数据越界访问。
当采用ARM ADS1.2编译器编译应用程序时,可以通过编译选项ACPS/RWPI将应用程序的数据段编译生成位置独立(Position IndependenceCode,IPC)的数据段,位置独立的数据段是指,可以拷贝至RAM的任意存储空间内运行的数据段。编译选项ACPS/RWPI将应用程序的数据段编译成位置独立的数据段,该数据段存储在([R9]+OFFSET)存储空间内,其中[R9]表示寄存器R9的值,OFFSET是偏移地址的值。为了防止数据越界访问,可以将寄存器R9的值设置为内存缓冲(BUFFER)的首地址加上BIN文件大小的值,即,将全局变量存储在有应用程序编译得到的BIN文件之后。
由于将全局变量编译成位置独立的数据段时,需要用到寄存器R9,因此,采用后一种全局变量定位方法时,只能实现各个应用程序的单加载,即,无法实现多个应用程序同时加载。
另外,在BIN文件编译生成阶段,需要将应用程序的主函数、即应用程序的函数入口编译在BIN文件的首地址处,以保证日后动态链接程序时可以定位到应用程序的各个组件程序。具体地,在编译应用程序的过程中设置应用程序的入口函数为-first即可。
在采用ARM ADS1.2编译器编译应用程序时,可以采用thumb模式将应用程序编译成BIN文件,采用thumb模式编译出的代码的函数地址比通常应用arm模式编译出来代码的函数地址要往后偏移一个32位(即偏移4个字节)的地址,在嵌入式操作***首次通过中间层调用应用程序时,将应用程序入口函数指针指向应用程序BIN所在内存缓冲区的首地址偏移4个字节的位置处并执行应用程序,例如,如果BIN文件的首地址是0x8000,则创建的入口函数指针应该指向0x8004处。
采用thumb模式编译应用程序时,应用程序中的每条指令被编译成两个字节(而采用arm模式编译则是每条指令4个字节),能够减小编译出的BIN文件的大小,同时也能够提高应用程序运行的速度,节省功耗。
综上,在BIN文件编译生成阶段,将应用程序编译成BIN文件,该应用程序的入口函数位于BIN文件的首地址处,将该应用程序编译成位置独立的代码段、且该应用程序的不同函数编译出的代码段彼此之间的存储空间不相交,将应用程序中的全局变量编译成位置独立的数据段、或者将全局变量存放在应用程序的结构体中。
二、BIN文件下载存储阶段
在BIN文件下载存储阶段,直接将这些BIN文件拷贝至文件***。
三、BIN文件加载阶段
当需要加载BIN文件时,将该BIN文件从文件***直接拷贝至内存,而无需对BIN文件进行解析、或利用BIN文件中的信息进行计算。
四、程序动态链接阶段
在程序动态链接阶段,通过创建实际的接口类指针,在中间层的接口类和应用程序的接口类之间传递接口类指针,来实现函数的导入和引出。
对于函数导入问题,应用程序通过创建中间层的接口类的指针,将创建的该接口类指针指向嵌入式操作***的函数所在的中间层接口类,通过该中间层接口类对应的虚拟函数表的相应元素实例化相应函数,来调用嵌入式操作***的函数。
例如,假设中间层中包括一个IFastString接口类,该IFastString接口类中包含虚拟函数表指针pvt,该虚拟函数表中包含三个子函数IFastString_Realase、IFastringString_GetLength和IfastString_Find。
表二是IFastString接口类的结构示意表。
表二
应用程序在调用IFastString接口类的函数时,创建IFastString接口类指针,并为该指针指向的虚拟函数表的三个成员IFastString_Realase、IFastringString_GetLength和IfastString_Find赋予实际的函数地址,这样,应用程序就可以定位到嵌入式操作***中的IFastString_Realase、IFastringString_GetLength和IfastString_Find这三个函数。
因此,应用程序在调用嵌入式操作***的函数时,通过管理接口类(例如Shell接口类)来创建中间层中各种不同的接口类指针,并根据接口类的标识(ID)创建相应的接口类并实例化该接口类里虚拟函数表里各元素对应的接口函数,应用程序使用其创建的接口类指针定位到该指针指向的虚拟函数表中相应接口的函数。其中,中间层的接口类ID是在编写中间层时确定的,应用程序在调用中间层的接口类时,将待调用的接口类的ID传递给管理接口类,管理接口类根据该ID创建相应的接口类指针并传回给应用程序。
因此,应用程序的入口函数可以采用下述形式:
int appMain(Shell*ptr,void**ppobj)
{
return 0;
}
应用程序通过创建接口类指针和虚拟函数表的各个元素对应的函数接口ID,将该接口类指针指向虚拟函数表,并通过所述函数接口ID调用虚拟函数表中相应函数接口对应的函数。
对于函数引出问题,由于应用程序也是采用接口类的形式编写的,即应用程序由接口类组成,每个接口类对应一个虚拟函数表,该虚拟函数表的各个元素与各个函数接口对应,因此,应用程序通过创建该应用程序自身接口类指针,将该接口类里的虚拟函数表的各元素实例化后传递给中间层保存,中间层需要调用应用程序的函数时,直接调用中间层保存的应用程序的接口类的相应函数接口即可,这样就完成了函数引出的过程。
对于函数导入过程,应用程序通过管理接口类创建接口类指针,指向中间层的接口类。对于函数引出过程,由于在编写应用程序时就将应用程序的各个接口类实例化了,因此,将由应用程序编译出的BIN文件加载到中间层时(即加载BIN文件),相当于将应用程序已经实例化的接口类直接拷贝到中间层中,嵌入式操作***如果要调用应用程序的接口类,即如果要实现函数引出,则直接调用拷贝到中间层的应用程序接口类即可。
综上,本发明通过从嵌入式操作***封装中间层、利用接口类将应用程序编划分为多个组件程序,可以使得中间层和应用程序之间,通过组件实现交互,具体请参见图4。
图4是本发明中间层和应用程序之间的交互示意图。
在图4中,当应用程序需要通过中间层调用嵌入式操作***时,应用程序通过创建接口类指针指向中间层中相应的接口类,实现组件交互;当中间层需要调用应用程序时,中间层通过已保存的应用程序接口类指针来调用相应的应用程序,该应用程序接口类指针是由应用程序自身创建并保存在中间层中的。
从操作***封装出中间层后,由于中间层和应用程序可以通过接口类实现中间层和应用程序中各个组件程序的交互,因此,可以在中间层上开发相应的应用程序。
图5是以一种即时通讯(IM)工具为核心的无线动态应用程序开发环境。
如图5所示,该开发环境包括嵌入式操作***、动态应用程序中间层平台(SDK)和动态应用程序。其中的SDK即为前文所述由嵌入式操作***封装出的中间层,动态应用程序即为前文所述以接口类形式编写的应用程序。
图5中的动态应用程序包括能够实现基础的IM功能的组件A、实现IM游戏的组件B、实现IM宠物功能的组件C、实现IM视频功能的组件D、实现IM音乐功能的组件E、用于扩展应用的组件F和组件G。组件A、组件F和组件G通过接口类与中间层交互,组件B至组件E在组件A被加载的基础上再加载运行,就是同时运行多个组件的情况,组件B至组件E可以通过其接口类与组件A的接口类通信,实现应用程序插件化的过程。
图5中,在编译时,将SDK和嵌入式操作***同时编译并下载到芯片中,而对于动态应用程序,则以接口类形式编写能够实现具体应用功能的动态应用程序,再采用图3所示方法对动态应用程序单独编译,然后下载到芯片中的文件***,在需要加载应用程序时将其直接拷贝至嵌入式操作***内存,最后SDK和动态应用程序通过接口类进行交互。
由上述技术方案可见,由于将应用程序编译成BIN文件下载后,在需要运行应用程序时,只需直接将其拷贝至内存,后续的函数导入和引出问题则由中间层和应用程序通过创建实际的接口类指针、并在彼此之间传递接口类指针来自动实现,无需对BIN文件进行解析或计算,从而提高了动态链接程序的速度。
并且,由于将同一应用程序编译成BIN文件与编译成ELF文件相比,编译出的BIN文件占用的存储空间仅是ELF文件占用的存储空间的三分之一,因此,将应用程序编译成BIN文件还可以节省内存空间。
另外,由于中间层和应用程序之间是通过接口类实现交互的,这种交互是组件级的,因此,有利于应用程序组件化升级和更新,以及中间层的组件式更新,或者两者同步更新,甚至可以有效利用中间层或应用程序的已有组件程序构建全新应用,实现应用程序插件化。通过搭建合理的应用层平台,还可以简化应用程序的开发。这对于非智能手机操作***的应用程序开发非常有益。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围,凡在本发明的精神和原则之内所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (9)
1.一种在嵌入式平台上动态链接程序的方法,其特征在于,该嵌入式平台包括中间层;所述中间层包括一个或多个接口类,每个接口类由嵌入式操作***的多个函数接口封装得到,每个接口类对应一个虚拟函数表,该虚拟函数表的各个元素与所述多个函数接口一一对应;所述中间层通过所述接口类调用所述嵌入式操作***的多个函数接口;待链接的应用程序包括一个或多个接口类,每个接口类由该应用程序的多个函数接口封装得到,每个接口类对应一个虚拟函数表,该虚拟函数表的各个元素分别与所述应用程序的多个函数接口一一对应,该方法包括:
将所述应用程序编译成位置独立的代码段、且由该应用程序的不同的函数编译出的代码段的存储位置互不相交;将编译出的所有代码段拷贝至嵌入式操作***内存;
通过创建接口类指针,将接口类指针在中间层的接口类和所述应用程序的接口类之间传递实现程序动态链接。
2.如权利要求1所述的方法,其特征在于,所述应用程序包括全局变量,该方法进一步包括:
将所述应用程序中的全局变量编译成位置独立的数据段,将该数据段存储在所述位置独立的代码段之后,实现程序动态链接过程中的全局变量重定位。
3.如权利要求1所述的方法,其特征在于,所述应用程序包括全局变量和结构体,该方法进一步包括:
将所述应用程序中的全局变量存储在该应用程序的结构体中;
所述编译成位置独立的代码段包括:将所述结构体编译成位置独立的代码段。
4.如权利要求1所述的方法,其特征在于,将所述应用程序编译成位置独立的代码段、且由该应用程序的不同的函数编译出的代码段的存储位置互不相交为:
采用嵌入式操作***ARM ADS1.2编译器中的编译选项ACPS/ROPI和ZO编译所述应用程序。
5.如权利要求2所述的方法,其特征在于,将所述应用程序中的全局变量编译成位置独立的数据段为:
采用嵌入式操作***ARM ADS1.2编译器中的编译选项ACPS/RWPI编译所述应用程序。
6.如权利要求1所述的方法,其特征在于,所述创建接口类指针,将接口类指针在中间层的接口类和所述应用程序的接口类之间传递包括:
在所述应用程序调用嵌入式操作***的函数时,应用程序通过管理接口类创建中间层的接口类指针,该指针指向中间层的接口类,将该接口类指针传递给应用程序的接口类;
应用程序通过创建该应用程序自身的接口类指针,将该接口类里的虚拟函数表的各元素实例化后传递给中间层保存,中间层需要调用应用程序的函数时,调用中间层保存的应用程序的接口类的相应函数接口。
7.如权利要求1所述的方法,其特征在于,所述位置独立的代码段为二进制BIN文件。
8.如权利要求7所述的方法,其特征在于,所述编译为:
采用thumb模式编译应用程序;
所述通过创建接口类指针,将接口类指针在中间层的接口类和所述应用程序的接口类之间传递实现程序动态链接包括:
在嵌入式操作***首次通过中间层调用应用程序时,创建应用程序入口函数指针并将其指向应用程序的BIN文件所在内存缓冲区的首地址偏移4个字节的位置处,运行入口函数。
9.如权利要求1所述的方法,其特征在于,所述创建接口类指针,将接口类指针在中间层的接口类和所述应用程序的接口类之间传递包括:
当应用程序需要通过中间层调用嵌入式操作***时,应用程序通过创建接口类指针指向中间层中相应的接口类;
当中间层需要调用应用程序时,中间层通过已保存的应用程序接口类指针调用相应的应用程序,该应用程序接口类指针是由应用程序自身创建并保存在中间层中的。
Priority Applications (9)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200810180934.2A CN101441566B (zh) | 2008-11-18 | 2008-11-18 | 一种在嵌入式平台上动态链接程序的方法 |
JP2011536728A JP5295379B2 (ja) | 2008-11-18 | 2009-08-18 | 組み込みプラットフォームにおけるプログラムの動的リンキング方法および組み込みプラットフォーム |
BRPI0921579A BRPI0921579A2 (pt) | 2008-11-18 | 2009-08-18 | método para ligar dinamicamente programa em plataforma embutida e plataforma embutida |
CA2744108A CA2744108C (en) | 2008-11-18 | 2009-08-18 | Method for dynamically linking program on embedded platform and embedded platform |
RU2011124353/08A RU2473111C1 (ru) | 2008-11-18 | 2009-08-18 | Способ динамической компоновки программы на встроенной платформе и встроенная платформа |
MX2011005232A MX2011005232A (es) | 2008-11-18 | 2009-08-18 | Método para enlazar dinámicamente el programa de plataforma integrada y plataforma integrada. |
PCT/CN2009/073324 WO2010057388A1 (zh) | 2008-11-18 | 2009-08-18 | 一种嵌入式平台和在嵌入式平台上动态链接程序的方法 |
KR1020117014209A KR101318313B1 (ko) | 2008-11-18 | 2009-08-18 | 임베디드 플랫폼에서 프로그램을 동적 링크하는 방법 및 임베디드 플랫폼이 기록된 컴퓨터로 판독가능한 기록매체 |
US13/109,384 US8499291B2 (en) | 2008-11-18 | 2011-05-17 | Method for dynamically linking program on embedded platform and embedded platform |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200810180934.2A CN101441566B (zh) | 2008-11-18 | 2008-11-18 | 一种在嵌入式平台上动态链接程序的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101441566A CN101441566A (zh) | 2009-05-27 |
CN101441566B true CN101441566B (zh) | 2012-04-25 |
Family
ID=40726014
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN200810180934.2A Active CN101441566B (zh) | 2008-11-18 | 2008-11-18 | 一种在嵌入式平台上动态链接程序的方法 |
Country Status (9)
Country | Link |
---|---|
US (1) | US8499291B2 (zh) |
JP (1) | JP5295379B2 (zh) |
KR (1) | KR101318313B1 (zh) |
CN (1) | CN101441566B (zh) |
BR (1) | BRPI0921579A2 (zh) |
CA (1) | CA2744108C (zh) |
MX (1) | MX2011005232A (zh) |
RU (1) | RU2473111C1 (zh) |
WO (1) | WO2010057388A1 (zh) |
Families Citing this family (33)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101441566B (zh) | 2008-11-18 | 2012-04-25 | 腾讯科技(深圳)有限公司 | 一种在嵌入式平台上动态链接程序的方法 |
CN101673204A (zh) * | 2009-08-13 | 2010-03-17 | 上海酷吧信息技术有限公司 | 一种基于arm的手机应用程序动态加载方法 |
JP2011123842A (ja) * | 2009-12-14 | 2011-06-23 | Ricoh Co Ltd | 画像形成装置、機能追加方法、及びプログラム |
CN102169432B (zh) * | 2010-02-25 | 2014-09-03 | 腾讯科技(深圳)有限公司 | 一种as语言接口函数及调用方法 |
CN101814020A (zh) * | 2010-04-15 | 2010-08-25 | 长沙理工大学 | 一种基于嵌入式的程序快速执行方法及*** |
US8522066B2 (en) | 2010-06-25 | 2013-08-27 | Intel Corporation | Providing silicon integrated code for a system |
CN102004638B (zh) * | 2010-09-28 | 2015-07-22 | 中兴通讯股份有限公司 | 一种手持式读写器二次的开发方法和开发*** |
CN102486735A (zh) * | 2010-12-02 | 2012-06-06 | 腾讯科技(深圳)有限公司 | 一种手机软件动态加载方法及装置 |
CN102591687A (zh) * | 2011-12-30 | 2012-07-18 | 广东中钰科技有限公司 | 一种抄表终端切换表计规约的应用***以及方法 |
CN102902542B (zh) * | 2012-09-27 | 2016-06-01 | Tcl通力电子(惠州)有限公司 | 虚拟接口配置方法和装置 |
CN103218428B (zh) * | 2013-04-09 | 2016-07-06 | 深圳市九洲电器有限公司 | 一种动态链接方法及*** |
US9213531B2 (en) * | 2014-05-01 | 2015-12-15 | Google Inc. | Methods to eliminate extra memory loads while accessing global variables in position independent code |
US20160274878A1 (en) * | 2015-03-19 | 2016-09-22 | Google Inc. | Methods and systems for removing plt stubs from dynamically linked binaries |
CN106990996B (zh) * | 2017-04-06 | 2021-02-02 | 青岛海信移动通信技术股份有限公司 | 应用程序调用框架层接口的方法及装置 |
CN107729085A (zh) * | 2017-10-19 | 2018-02-23 | 北京空间飞行器总体设计部 | 一种支持地址重定向的星载软件动态加载方法 |
CN107943681A (zh) * | 2017-12-08 | 2018-04-20 | 郑州云海信息技术有限公司 | 内存占用情况分析方法、装置、设备及计算机存储介质 |
CN109947460B (zh) * | 2017-12-21 | 2022-03-22 | 鼎捷软件股份有限公司 | 程序连结方法及程序连结*** |
CN108446149B (zh) * | 2018-02-28 | 2021-07-20 | 北京凌宇智控科技有限公司 | 一种第三方动态库接口拦截方法及*** |
CN110795200A (zh) * | 2018-08-01 | 2020-02-14 | 北京钛云物联科技有限公司 | 一种适用于Java运行环境的装置及其实现方法 |
CN112969999A (zh) * | 2019-01-31 | 2021-06-15 | 宝马股份公司 | 用于在控制器上执行程序组件的方法、计算机可读存储介质、控制器和*** |
KR20200116373A (ko) | 2019-04-01 | 2020-10-12 | 에스케이하이닉스 주식회사 | 메모리 시스템, 메모리 컨트롤러 및 그 동작 방법 |
CN110109703A (zh) * | 2019-05-27 | 2019-08-09 | 烟台万泉数字科技有限公司 | 小型plc中实现带静态数据功能的子程序 |
CN112241271A (zh) * | 2019-07-17 | 2021-01-19 | 西安旌旗电子股份有限公司 | 一种嵌入式软件的部分升级方法 |
US11556458B2 (en) * | 2019-07-26 | 2023-01-17 | Vmware, Inc. | Efficient fuzz testing of low-level virtual devices |
CN110569040A (zh) * | 2019-09-17 | 2019-12-13 | 深圳市优创亿科技有限公司 | 一种在嵌入式***内安装、运行应用程序的方法 |
CN110659088B (zh) * | 2019-09-20 | 2022-11-25 | 浙江杰芯科技有限公司 | 一种嵌入式环境下程序扩展的方法及*** |
CN110990018B (zh) * | 2019-10-29 | 2023-03-24 | 北京全路通信信号研究设计院集团有限公司 | 一种嵌入式***的编译方法及编译*** |
CN111124610B (zh) * | 2019-12-19 | 2024-01-23 | 北京炎黄盈动科技发展有限责任公司 | 一种应用容器中应用程序调用方法、装置及存储介质 |
CN111190623A (zh) * | 2019-12-25 | 2020-05-22 | 北京中科晶上超媒体信息技术有限公司 | 一种嵌入式操作***的远程更新方法 |
CN112256281A (zh) * | 2020-09-23 | 2021-01-22 | 深圳市芯盛智能信息有限公司 | 一种嵌入式***应用程序动态加载的方法 |
CN112559094B (zh) * | 2020-12-15 | 2024-04-02 | 浙江中控技术股份有限公司 | 一种c++模块接口的调用方法及装置 |
CN115617422A (zh) * | 2022-12-19 | 2023-01-17 | 深圳华大北斗科技股份有限公司 | 基于内存动态加载的嵌入式开放sdk模组及其搭建方法 |
CN116700838B (zh) * | 2023-06-09 | 2024-02-02 | 广州万彩信息技术有限公司 | 一种as语言接口函数、音视频处理方法和*** |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1801093A (zh) * | 2006-01-17 | 2006-07-12 | 浙江大学 | Java操作***中类装载的实现方法 |
CN1866202A (zh) * | 2005-05-18 | 2006-11-22 | 大唐移动通信设备有限公司 | 嵌入式设备的驱动方法 |
CN101271402A (zh) * | 2007-03-20 | 2008-09-24 | 华为技术有限公司 | 一种调用函数的方法及*** |
Family Cites Families (26)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH0656581B2 (ja) * | 1987-12-24 | 1994-07-27 | 富士通株式会社 | オブジェクト指向プログラミング方式 |
US5640550A (en) * | 1994-04-15 | 1997-06-17 | Coker; Drake | Computer system for generating SQL statements from COBOL code |
US5835743A (en) * | 1994-06-30 | 1998-11-10 | Sun Microsystems, Inc. | Application binary interface and method of interfacing binary application program to digital computer |
JP2005302055A (ja) * | 1995-07-14 | 2005-10-27 | Sony Corp | データ処理方法および装置 |
JP2001506028A (ja) * | 1996-12-13 | 2001-05-08 | メイヴス インターナショナル ソフトウェア,インコーポレイテッド | コンピュータソフトウェアアプリケーションの開発および実行のための方法、システムおよびデータ構造 |
US7409694B2 (en) * | 1998-09-09 | 2008-08-05 | Microsoft Corporation | Highly componentized system architecture with loadable virtual memory manager |
GB2406416A (en) * | 2000-10-31 | 2005-03-30 | Advanced Risc Mach Ltd | Describing an integrated circuit configuration |
US7003768B2 (en) * | 2001-03-15 | 2006-02-21 | Sun Microsystems, Inc. | Method and apparatus for class intialization barriers and access to class variables in multitasking virtual machines |
US20030074487A1 (en) * | 2001-10-17 | 2003-04-17 | Tankut Akgul | Dynamic operating system |
US6907519B2 (en) * | 2001-11-29 | 2005-06-14 | Hewlett-Packard Development Company, L.P. | Systems and methods for integrating emulated and native code |
US7086049B2 (en) * | 2002-02-26 | 2006-08-01 | International Business Machines Corporation | Background code update for embedded systems |
US20040103073A1 (en) * | 2002-11-21 | 2004-05-27 | Blake M. Brian | System for and method of using component-based development and web tools to support a distributed data management system |
US7103723B2 (en) * | 2003-02-25 | 2006-09-05 | Intel Corporation | Priority-based code cache management |
KR100518584B1 (ko) * | 2003-07-12 | 2005-10-04 | 삼성전자주식회사 | 공유 라이브러리 시스템 및 상기 시스템 구축 방법 |
GB2406663B (en) * | 2003-10-01 | 2006-03-22 | Toshiba Res Europ Ltd | Flexible protocol stack |
GB2411494B (en) * | 2004-02-27 | 2006-04-12 | Toshiba Res Europ Ltd | Protocol stack with modification facility |
US7503040B2 (en) * | 2004-09-30 | 2009-03-10 | International Business Machines Corporation | Configuring a shared library to accommodate relocatable data in a pervasive device |
US7512699B2 (en) * | 2004-11-12 | 2009-03-31 | International Business Machines Corporation | Managing position independent code using a software framework |
US7516449B2 (en) * | 2005-01-04 | 2009-04-07 | International Business Machines Corporation | Run-time type conversion |
US7546507B1 (en) * | 2005-12-02 | 2009-06-09 | Altera Corporation | Method and apparatus for debugging semiconductor devices |
US20070180509A1 (en) * | 2005-12-07 | 2007-08-02 | Swartz Alon R | Practical platform for high risk applications |
CN101131635B (zh) * | 2006-08-24 | 2010-04-07 | 凌阳科技股份有限公司 | 动态链接函数库与主应用程序共享静态链接函数库的方法 |
US7930709B2 (en) * | 2006-10-02 | 2011-04-19 | Red Hat, Inc. | Methods and apparatus for a dynamic linker speed up |
GB2442495B (en) * | 2006-10-02 | 2009-04-01 | Transitive Ltd | Method and apparatus for handling dynamically linked function cells with respect to program code conversion |
US8327316B2 (en) * | 2008-09-30 | 2012-12-04 | Ics Triplex Isagraf Inc. | Compilation model |
CN101441566B (zh) * | 2008-11-18 | 2012-04-25 | 腾讯科技(深圳)有限公司 | 一种在嵌入式平台上动态链接程序的方法 |
-
2008
- 2008-11-18 CN CN200810180934.2A patent/CN101441566B/zh active Active
-
2009
- 2009-08-18 CA CA2744108A patent/CA2744108C/en active Active
- 2009-08-18 JP JP2011536728A patent/JP5295379B2/ja active Active
- 2009-08-18 KR KR1020117014209A patent/KR101318313B1/ko active IP Right Grant
- 2009-08-18 MX MX2011005232A patent/MX2011005232A/es active IP Right Grant
- 2009-08-18 BR BRPI0921579A patent/BRPI0921579A2/pt not_active Application Discontinuation
- 2009-08-18 WO PCT/CN2009/073324 patent/WO2010057388A1/zh active Application Filing
- 2009-08-18 RU RU2011124353/08A patent/RU2473111C1/ru active
-
2011
- 2011-05-17 US US13/109,384 patent/US8499291B2/en active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1866202A (zh) * | 2005-05-18 | 2006-11-22 | 大唐移动通信设备有限公司 | 嵌入式设备的驱动方法 |
CN1801093A (zh) * | 2006-01-17 | 2006-07-12 | 浙江大学 | Java操作***中类装载的实现方法 |
CN101271402A (zh) * | 2007-03-20 | 2008-09-24 | 华为技术有限公司 | 一种调用函数的方法及*** |
Also Published As
Publication number | Publication date |
---|---|
US8499291B2 (en) | 2013-07-30 |
BRPI0921579A2 (pt) | 2018-10-09 |
KR20110086759A (ko) | 2011-07-29 |
CA2744108C (en) | 2015-03-17 |
US20110219363A1 (en) | 2011-09-08 |
MX2011005232A (es) | 2011-11-29 |
JP5295379B2 (ja) | 2013-09-18 |
CN101441566A (zh) | 2009-05-27 |
CA2744108A1 (en) | 2010-05-27 |
RU2473111C1 (ru) | 2013-01-20 |
WO2010057388A1 (zh) | 2010-05-27 |
KR101318313B1 (ko) | 2013-10-15 |
JP2012509531A (ja) | 2012-04-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101441566B (zh) | 一种在嵌入式平台上动态链接程序的方法 | |
US10795660B1 (en) | Live code updates | |
EP2619687B1 (en) | Sharing virtual functions in a shared virtual memory between heterogeneous processors of a computing platform | |
US7739696B2 (en) | Message translation systems and methods | |
EP2494454A1 (en) | Two way communication support for heterogenous processors of a computer platform | |
CN105242962A (zh) | 基于异构众核的轻量级线程快速触发方法 | |
US20050071809A1 (en) | System and method for serializing objects in a compiled programming language | |
CN111580798B (zh) | 一种动态链接库实现方法、***、计算机设备及存储介质 | |
CN113986206A (zh) | 插件加载***的构建方法、插件加载***及计算设备 | |
US9176718B2 (en) | Java program for emulating the memory management of a C program and corresponding method | |
WO2019105565A1 (en) | Systems for compiling and executing code within one or more virtual memory pages | |
CN102141917A (zh) | 基于IronPython脚本语言的多业务联动实现方法 | |
RU2554509C2 (ru) | Система и способ распределенных вычислений | |
KR20100110710A (ko) | 동적 라이브러리를 갖는 인터페이스를 간단히 하는 방법, 시스템 및 컴퓨터 프로그램 제품 | |
CN112306539B (zh) | 一种单片机应用层开发方法、***、终端及介质 | |
CN104281443A (zh) | 利用tcm实现代码、数据替换的方法 | |
CN104331277A (zh) | 一种可直接升级的图像素材的量产方法 | |
Aravinth et al. | Building a React-Like Library | |
Houser et al. | Eoops: an object-oriented programming system for Emacs-Lisp | |
CN104536740A (zh) | 计算平台的异质处理器之间的共享虚拟存储器中的虚函数共享 | |
CN103092684A (zh) | 一种调用com对象中多个接口的方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |