CN103218428A - 一种动态链接方法及*** - Google Patents
一种动态链接方法及*** Download PDFInfo
- Publication number
- CN103218428A CN103218428A CN2013101211166A CN201310121116A CN103218428A CN 103218428 A CN103218428 A CN 103218428A CN 2013101211166 A CN2013101211166 A CN 2013101211166A CN 201310121116 A CN201310121116 A CN 201310121116A CN 103218428 A CN103218428 A CN 103218428A
- Authority
- CN
- China
- Prior art keywords
- function
- built
- application
- address
- jump
- 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.)
- Granted
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
本发明适用于计算机软件技术领域,提供了一种动态链接方法及***,所述方法包括:读取可执行连接格式ELF的库;复制库函数的跳转地址至应用的跳转表预留空间,复制库函数的代码段至应用的应用部分预留空间,所述库函数的代码段在库中和应用中的地址一致;应用调用库函数时,在应用的跳转表中查询库函数的跳转地址,根据所述库函数的跳转地址,跳转到库函数的代码段执行;库函数调用应用时,在应用的跳转表中查询应用对应的函数地址,根据所述应用对应的函数地址,跳转到应用的代码段执行。本发明通过将库函数的跳转地址和代码段复制到应用中,解决了现有技术存在的一些***不支持动态链接库的情况下,应用无法调用动态链接库的问题。
Description
技术领域
本发明属于计算机软件技术领域,尤其涉及一种动态链接方法及***。
背景技术
动态链接库(英文:Dynamic Link Library,简称:DLL)是一个包含可由多个程序同时使用的代码和数据的库,DLL不是一个可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数,函数的可执行代码位于一个DLL中,该DLL包含一个或多个已经被编译、链接并与使用它们的进程分开存储的函数。DLL还有助于共享数据和资源。
但是动态链接依赖于***的支持,在Linux***下通过动态链接的函数就可以完成动态链接库的链接,而一些***不支持动态链接。
发明内容
本发明实施例的目的在于提供一种动态链接方法及***,以解决现有技术存在的,一些***不支持动态链接,应用无法调用动态链接库的问题。
本发明的实施例是这样实现的,一种动态链接方法,所述方法包括以下步骤:
读取可执行连接格式ELF的库,所述可执行连接格式ELF的库包括:库函数的跳转地址和库函数的代码段;
复制库函数的跳转地址至应用的跳转表预留空间,复制库函数的代码段至应用的应用部分预留空间,所述库函数的代码段在库中和应用中的地址一致;
应用调用库函数时,在应用的跳转表中查询库函数的跳转地址,根据所述库函数的跳转地址,跳转到库函数的代码段执行;
库函数调用应用时,在应用的跳转表中查询应用对应的函数地址,根据所述应用对应的函数地址,跳转到应用的代码段执行。
本发明的实施例的另一目的在于提供一种动态链接***,所述***包括:
读取单元,用于读取可执行连接格式ELF的库,所述可执行连接格式ELF的库包括:库函数的跳转地址和库函数的代码段;
复制单元,用于复制库函数的跳转地址至应用的跳转表预留空间,复制库函数的代码段至应用的应用部分预留空间,所述库函数的代码段在库中和应用中的地址一致;
第一调用单元,用于应用调用库函数时,在应用的跳转表中查询库函数的跳转地址,根据所述库函数的跳转地址,跳转到库函数的代码段执行;
第二调用单元,用于库函数调用应用时,在应用的跳转表中查询应用对应的函数地址,根据所述应用对应的函数地址,跳转到应用的代码段执行。
本发明实施例通过将库函数的跳转地址以及库函数的代码段复制到应用中,使得应用和库函数可以相互调用,解决了现有技术存在的,一些***不支持动态链接的情况下,应用无法调用动态链接库的问题。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的动态链接方法的实现流程图;
图2是本发明实施例提供的可执行连接格式的库的结构示意图;
图3是本发明实施例提供的复制之前的应用的结构示意图;
图4是本发明实施例提供的复制之后的应用的结构示意图;
图5是本发明实施例提供的动态链接***的模块结构图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明实施例提供了动态链接方法,所述方法的执行主体是动态库链接***,所述方法如图1所示,具体步骤包括:
S11、读取可执行连接格式(英文:Executable and Linkable Format,简称:ELF)的库。
在步骤所述S11之前,ELF的库通过编译链接DLL和手工创建的跳转表构成,图2为可执行连接格式的库的结构示意图,所述ELF的库包括现行输出跳转表、虚拟输入跳转表和应用部分,所述现行输出跳转表存储库函数的跳转地址和属性,应用部分存储了库函数的代码段、数据和静态数据。
S12、复制所述库函数的跳转地址至应用的跳转表预留空间,复制库函数的代码段至应用的应用部分预留空间。
需要说明的是,库函数的跳转地址用于应用或者其它函数调用库函数时,通过所述库函数的跳转地址找到库函数的代码段的位置;库函数的代码段从库中复制到应用中,库函数的代码段存储的地址不变,否则通过库函数的跳转地址无法准确找到库函数的代码段。
图3为复制之前的应用的结构示意图,图4为复制之后的应用的结构示意图,复制的过程包括:复制图2中现行输出跳转表至图3中虚拟输出跳转表,复制图2中的代码段、数据和静态数据区至图3中应用的应用部分预留的空间。
S13、应用调用库函数时,在应用的跳转表查询库函数的跳转地址,根据所述库函数的跳转地址,跳转到库函数的代码段执行;
S14、库函数调用应用时,在应用的跳转表中查询应用对应的函数地址,根据所述应用对应的函数地址,跳转到应用的代码段执行。
需要说明的是,在没有复制库函数的跳转地址和库函数的代码段之前,在应用的跳转表中就存储有应用对应的函数地址。
如图4所示,虚拟输出跳转表和现行输入跳转表统称应用的跳转表,在DLL结束部分上面的代码段、数据和静态数据是从库中复制过来的,DLL结束部分下面的代码、数据和静态数据是复制之前应用中存在的;步骤1是应用调用库函数时,在虚拟输出跳转表中找到库函数的跳转地址,然后步骤2是跳转到库函数的代码段执行;步骤3是库函数调用应用对应的函数时,在现行输入跳转表中找到应用对应的函数地址,然后步骤4是跳转到应用的代码段执行。
需要说明的是,库函数和应用的函数之间可能会存在相互调用的关系,通过上述方法实现了库函数和应用的函数相互调用,使得应用和动态链接库方便、灵活地互相调用。
在本实施例中,通过将库函数的跳转地址复制到应用的跳转表,可以使得应用调用库函数时,在应用的跳转表找到库函数的跳转地址并根据所述跳转地址跳转到库函数的代码段执行,实现了应用对动态链接库的调用,解决了现有技术存在的一些***不支持动态链接时,应用无法调用动态链接库的问题。
本发明实施例提供了动态链接***,所述***如图5所示,具体包括:
读取单元51,用于读取ELF的库,所述ELF的库包括:库函数的跳转地址、库函数的属性、库函数的代码段、库函数的数据和库函数的静态数据。
复制单元52,用于复制库函数的跳转地址至应用的跳转表预留空间,复制库函数的代码段至应用的应用部分预留空间,所述库函数的代码段在库中和应用中的地址一致。
第一调用单元53,用于应用调用库函数时,在应用的跳转表中查询库函数的跳转地址,根据所述库函数的跳转地址,跳转到库函数的代码段执行。
第二调用单元54,用于库函数调用应用时,在应用的跳转表中查询应用对应的函数地址,根据所述应用对应的函数地址,跳转到应用的代码段执行。
本领域普通技术人员可以理解为上述实施例所包括的各个模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能模块的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。
本领域普通技术人员还可以理解,实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以在存储于可读取存储介质中,所述的存储介质,包括ROM/RAM等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (4)
1.一种动态链接方法,其特征在于,所述方法包括:
读取可执行连接格式ELF的库,所述可执行连接格式ELF的库包括:库函数的跳转地址和库函数的代码段;
复制库函数的跳转地址至应用的跳转表预留空间,复制库函数的代码段至应用的应用部分预留空间,所述库函数的代码段在库中和应用中的地址一致;
应用调用库函数时,在应用的跳转表中查询库函数的跳转地址,根据所述库函数的跳转地址,跳转到库函数的代码段执行;
库函数调用应用时,在应用的跳转表中查询应用对应的函数地址,根据所述应用对应的函数地址,跳转到应用的代码段执行。
2.如权利要求1所述的方法,其特征在于,所述读取可执行连接格式ELF的库之前包括:
编译链接动态链接库DLL和手工创建的跳转表构成ELF的库。
3.一种动态链接***,其特征在于,所述***包括:
读取单元,用于读取可执行连接格式ELF的库,所述可执行连接格式ELF的库包括:库函数的跳转地址和库函数的代码段;
复制单元,用于复制库函数的跳转地址至应用的跳转表预留空间,复制库函数的代码段至应用的应用部分预留空间,所述库函数的代码段在库中和应用中的地址一致;
第一调用单元,用于应用调用库函数时,在应用的跳转表中查询库函数的跳转地址,根据所述库函数的跳转地址,跳转到库函数的代码段执行;
第二调用单元,用于库函数调用应用时,在应用的跳转表中查询应用对应的函数地址,根据所述应用对应的函数地址,跳转到应用的代码段执行。
4.如权利要求3所述的***,其特征在于,所述***还包括:
编译单元,用于编译链接动态链接库DLL和手工创建的跳转表构成ELF的库。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310121116.6A CN103218428B (zh) | 2013-04-09 | 2013-04-09 | 一种动态链接方法及*** |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310121116.6A CN103218428B (zh) | 2013-04-09 | 2013-04-09 | 一种动态链接方法及*** |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103218428A true CN103218428A (zh) | 2013-07-24 |
CN103218428B CN103218428B (zh) | 2016-07-06 |
Family
ID=48816215
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310121116.6A Expired - Fee Related CN103218428B (zh) | 2013-04-09 | 2013-04-09 | 一种动态链接方法及*** |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103218428B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105677435A (zh) * | 2015-12-30 | 2016-06-15 | 小米科技有限责任公司 | 函数的调用方法、装置及终端 |
CN105955762A (zh) * | 2016-04-19 | 2016-09-21 | 北京金山安全软件有限公司 | 一种注入动态链接库文件的方法、装置及电子设备 |
CN106354536A (zh) * | 2016-08-31 | 2017-01-25 | 北京奇虎科技有限公司 | 在Windows***中加载Linux***ELF文件的方法及装置 |
WO2017015856A1 (zh) * | 2015-07-28 | 2017-02-02 | 华为技术有限公司 | 一种调用操作***库的方法、装置及*** |
WO2018086313A1 (zh) * | 2016-11-10 | 2018-05-17 | 华为技术有限公司 | 一种函数地址的获取方法以及电子设备 |
CN109144575A (zh) * | 2017-06-16 | 2019-01-04 | 北京海誉动想科技股份有限公司 | 跨操作***运行应用的装置、方法、电子设备和存储器 |
CN111142969A (zh) * | 2019-12-27 | 2020-05-12 | 贵阳动视云科技有限公司 | 64位程序调用32位程序模块的方法、装置、介质及设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6708330B1 (en) * | 2000-06-13 | 2004-03-16 | Cisco Technology, Inc. | Performance improvement of critical code execution |
CN101026825A (zh) * | 2005-12-01 | 2007-08-29 | 三星电子株式会社 | 用于补丁最小化工具的***和方法 |
CN101026826A (zh) * | 2005-12-01 | 2007-08-29 | 三星电子株式会社 | 用于提供在无线装置中使用的整体映像的***和方法 |
CN101441566A (zh) * | 2008-11-18 | 2009-05-27 | 腾讯科技(深圳)有限公司 | 一种嵌入式平台和在嵌入式平台上动态链接程序的方法 |
-
2013
- 2013-04-09 CN CN201310121116.6A patent/CN103218428B/zh not_active Expired - Fee Related
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6708330B1 (en) * | 2000-06-13 | 2004-03-16 | Cisco Technology, Inc. | Performance improvement of critical code execution |
CN101026825A (zh) * | 2005-12-01 | 2007-08-29 | 三星电子株式会社 | 用于补丁最小化工具的***和方法 |
CN101026826A (zh) * | 2005-12-01 | 2007-08-29 | 三星电子株式会社 | 用于提供在无线装置中使用的整体映像的***和方法 |
CN101441566A (zh) * | 2008-11-18 | 2009-05-27 | 腾讯科技(深圳)有限公司 | 一种嵌入式平台和在嵌入式平台上动态链接程序的方法 |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2017015856A1 (zh) * | 2015-07-28 | 2017-02-02 | 华为技术有限公司 | 一种调用操作***库的方法、装置及*** |
CN107615243A (zh) * | 2015-07-28 | 2018-01-19 | 华为技术有限公司 | 一种调用操作***库的方法、装置及*** |
CN107615243B (zh) * | 2015-07-28 | 2019-12-13 | 华为技术有限公司 | 一种调用操作***库的方法、装置及*** |
CN105677435A (zh) * | 2015-12-30 | 2016-06-15 | 小米科技有限责任公司 | 函数的调用方法、装置及终端 |
CN105955762A (zh) * | 2016-04-19 | 2016-09-21 | 北京金山安全软件有限公司 | 一种注入动态链接库文件的方法、装置及电子设备 |
CN106354536A (zh) * | 2016-08-31 | 2017-01-25 | 北京奇虎科技有限公司 | 在Windows***中加载Linux***ELF文件的方法及装置 |
WO2018086313A1 (zh) * | 2016-11-10 | 2018-05-17 | 华为技术有限公司 | 一种函数地址的获取方法以及电子设备 |
CN109144575A (zh) * | 2017-06-16 | 2019-01-04 | 北京海誉动想科技股份有限公司 | 跨操作***运行应用的装置、方法、电子设备和存储器 |
CN109144575B (zh) * | 2017-06-16 | 2021-07-16 | 北京海誉动想科技股份有限公司 | 跨操作***运行应用的装置、方法、电子设备和存储器 |
CN111142969A (zh) * | 2019-12-27 | 2020-05-12 | 贵阳动视云科技有限公司 | 64位程序调用32位程序模块的方法、装置、介质及设备 |
Also Published As
Publication number | Publication date |
---|---|
CN103218428B (zh) | 2016-07-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103218428A (zh) | 一种动态链接方法及*** | |
CN103473067B (zh) | 嵌入式Linux分区与数据还原方法、***及***开发方法 | |
CN110457045B (zh) | 组件化合并编译方法、装置、设备和存储介质 | |
US8707286B2 (en) | Unique context-based code enhancement | |
CN103365668A (zh) | 一种动态链接库装载和链接的方法、装置 | |
CN104714788A (zh) | 一种软件安装包自动生成的方法及装置 | |
JP2005032259A (ja) | 共有ライブラリーシステム及び前記システム構築方法 | |
US10768944B2 (en) | Method and system for customizing desktop launcher of mobile terminal | |
CN101980157A (zh) | 移动终端开机启动方法及移动终端 | |
CN110716845B (zh) | 一种Android***的日志信息读取的方法 | |
CN105426223A (zh) | 应用加载方法和装置 | |
CN101403966B (zh) | 一种实现可移植软件的方法 | |
CN101763273A (zh) | 一种在嵌入式***的扩展存储器中动态装入代码的方法 | |
CN104063284A (zh) | 运行应用程序的方法和装置 | |
KR101036675B1 (ko) | Efi 기반 펌웨어에서의 프리 efi 초기화 모듈의 전역변수 사용법 | |
CN101930377B (zh) | 一种动态获取uid的链接库编译方法 | |
CN103514004A (zh) | Windows***下的***环境管理方法及装置 | |
CN104063234A (zh) | 一种兼容方法及装置 | |
CN115700470A (zh) | 文件加载的处理方法和装置,计算机存储介质和电子设备 | |
CN101650668A (zh) | 虚拟环境的实现方法及装置 | |
CN102216901B (zh) | 组件扩展方法和装置 | |
CN105786613A (zh) | 提高内存利用效率的方法 | |
CN104331311A (zh) | 一种升级包生成方法和装置 | |
CN109918059B (zh) | 应用的功能扩展方法、装置、终端设备和存储介质 | |
CN103235745A (zh) | 一种地址冲突检测方法及装置 |
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 | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20160706 Termination date: 20180409 |