CN112559064A - 一种启动动态链接程序的方法和装置 - Google Patents
一种启动动态链接程序的方法和装置 Download PDFInfo
- Publication number
- CN112559064A CN112559064A CN201910905160.3A CN201910905160A CN112559064A CN 112559064 A CN112559064 A CN 112559064A CN 201910905160 A CN201910905160 A CN 201910905160A CN 112559064 A CN112559064 A CN 112559064A
- Authority
- CN
- China
- Prior art keywords
- shared library
- construction
- symbol
- executable program
- identifier
- 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.)
- Pending
Links
Images
Classifications
-
- 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/445—Program loading or initiating
-
- 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/44505—Configuring for program initiating, e.g. using registry, configuration files
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本申请公开了一种启动动态链接程序的方法和装置,包括:获取可执行程序的第一构建标识;对于可执行程序依赖的每一个共享库,在将共享库加载到内存中后,将共享库的基地址放入缓冲区中,获取共享库的第二构建标识;在将可执行程序依赖的所有共享库加载到内存中后,当缓存的对应关系中的构建标识序列中存在与特定构建标识序列相同的构建标识序列时,从缓存的对应关系中,查找特定构建标识序列对应的符号、共享库信息和偏移;其中,对应关系为构建标识序列、符号、共享库信息和偏移之间的对应关系;特定构建标识序列为由获得的第一构建标识和所有共享库的第二构建标识组成;根据缓冲区中共享库的基地址、共享库信息和偏移计算符号的地址信息。
Description
技术领域
本发明涉及计算机技术,尤指一种启动动态链接程序的方法和装置。
背景技术
当前的通用计算机系统中大量使用共享库以节约磁盘空间,使用共享库的可执行程序,被称为动态链接程序。动态链接程序在启动时,需要先经历一个动态链接过程,才能真正开始执行。在动态链接过程的整个流程中,计算共享库中的符号的地址的这个步骤非常耗时。对于引用了很多共享库的大型程序,这个步骤往往是启动过程的瓶颈。
目前业界解决该问题的主要方法有两种。
第一种方法(常被称为lazy binding)是减少启动时的计算量,只在确实需要的时候才进行符号的地址的计算。这种方法能够很好的将函数符号的地址的计算分散到可执行程序启动后的运行过程中,从而加速启动过程。但是,由于数据符号的访问在运行时无法被很好的截获,所有数据符号的地址的计算都不能通过这种方法来计算。由于上述缺陷的存在,虽然业界已经广泛的使用了lazy binding技术,但是动态链接程序的启动的加速优化仍需继续研究和完善。
第二种方法(常被称为prelink)是将各个共享库的地址空间预先分配好,这样一来所有符号的地址可以在启动前预先计算出来,并写入动态链接程序中。这个技术较为完美的解决了速度相关的所有问题,但是其安全性和易用性都有较大缺陷。首先,prelink要求所有地址是固定的,这和整个业界的地址随机化努力背道而驰,地址随机化是一项重要的基础安全措施,在可以预见的将来并无替代方案。从发展趋势上看,与地址随机化从原理上冲突的prelink技术应用范围会越来越窄。其次,prelink技术需要一套外部机制来标记和仲裁共享库的地址,这套机制不仅消耗大量CPU来进行地址分配和仲裁,从而拖慢硬件执行速度;而且为了添加相关地址标记,还会修改共享库和可执行程序,由于可执行程序和共享库被修改了,校验码就发生了变化,但是实际内容并没有变化,而是prelink相关信息变化了,从而干扰到程序校验机制的正常工作。由于上述缺陷的存在,prelink技术没有被广泛使用。
发明内容
本发明实施例提供了一种启动动态链接程序的方法和装置,能够在支持地址随机化配置的情况下,提高动态链接程序的启动速度。
本发明实施例提供了一种启动动态链接程序的方法,包括:
获取可执行程序的第一构建标识;
对于所述可执行程序依赖的每一个共享库,在将所述共享库加载到内存中后,将所述共享库的基地址放入缓冲区中,获取所述共享库的第二构建标识;
在将所述可执行程序依赖的所有所述共享库加载到内存中后,当缓存的对应关系中的构建标识序列中存在与特定构建标识序列相同的构建标识序列时,从缓存的对应关系中,查找所述特定构建标识序列对应的符号、符号所属的共享库信息和符号在共享库中的偏移;其中,所述对应关系为构建标识序列、符号、符号所属的共享库信息和符号在共享库中的偏移之间的对应关系;所述特定构建标识序列为由获得的第一构建标识和所有共享库的第二构建标识组成;
根据所述缓冲区中共享库的基地址、所述符号所属的共享库信息和所述符号在共享库中的偏移计算所述符号的地址信息。
本发明实施例提供了一种启动动态链接程序的装置,包括处理器和计算机可读存储介质,所述计算机可读存储介质中存储有指令,当所述指令被所述处理器执行时,实现上述任一种启动动态链接程序的方法。
本发明实施例提供了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任一种启动动态链接程序的方法的步骤。
本发明实施例提供了一种启动动态链接程序的装置,包括:
第一获取模块,用于获取可执行程序的第一构建标识;
第二获取模块,用于对于所述可执行程序依赖的每一个共享库,在将所述共享库加载到内存中后,将所述共享库的基地址放入缓冲区中,获取所述共享库的第二构建标识;
地址信息获取模块,用于在将所述可执行程序依赖的所有所述共享库加载到内存中后,当缓存的对应关系中的构建标识序列中存在与特定构建标识序列相同的构建标识序列时,从缓存的对应关系中,查找所述特定构建标识序列对应的符号、符号所属的共享库信息和符号在共享库中的偏移;其中,所述对应关系为构建标识序列、符号、符号所属的共享库信息和符号在共享库中的偏移之间的对应关系;所述特定构建标识序列为由获得的第一构建标识和所有共享库的第二构建标识组成;根据所述缓冲区中共享库的基地址、所述符号所属的共享库信息和所述符号在共享库中的偏移计算所述符号的地址信息。
本发明实施例包括:获取可执行程序的第一构建标识;对于所述可执行程序依赖的每一个共享库,在将所述共享库加载到内存中后,将所述共享库的基地址放入缓冲区中,获取所述共享库的第二构建标识;在将所述可执行程序依赖的所有所述共享库加载到内存中后,当缓存的对应关系中的构建标识序列中存在与特定构建标识序列相同的构建标识序列时,从缓存的对应关系中,查找所述特定构建标识序列对应的符号、符号所属的共享库信息和符号在共享库中的偏移;其中,所述对应关系为构建标识序列、符号、符号所属的共享库信息和符号在共享库中的偏移之间的对应关系;所述特定构建标识序列为由获得的第一构建标识和所有共享库的第二构建标识组成;根据所述缓冲区中共享库的基地址、所述符号所属的共享库信息和所述符号在共享库中的偏移计算所述符号的地址信息。本发明实施例通过缓存的对应关系实现地址信息的快速计算,而不需要查找地址信息,在支持地址随机化配置的情况下,提高了动态链接程序的启动速度。
本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点可通过在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。
附图说明
附图用来提供对本发明技术方案的进一步理解,并且构成说明书的一部分,与本申请的实施例一起用于解释本发明的技术方案,并不构成对本发明技术方案的限制。
图1为传统的启动动态链接程序的方法的流程图;
图2为本发明一个实施例提出的启动动态链接程序的方法的流程图;
图3为本发明的实例1的启动动态链接程序的方法的流程图;
图4为本发明的实例2的启动动态链接程序的方法的流程图;
图5为本发明另一个实施例提出的启动动态链接程序的装置的结构组成示意图。
具体实施方式
下文中将结合附图对本发明的实施例进行详细说明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。
在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行。并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
参见图1,传统的启动动态链接程序的方法包括:
步骤100、动态装载器获得控制权,完成自身的初始化工作。
步骤101、动态装载器解析输入参数,获得可执行程序的名称。
步骤102、动态装载器解析可执行程序得到可执行程序依赖的共享库,将可执行程序依赖的共享库加载到内存中,将共享库的基地址缓存到内存中。
步骤103、动态装载器查找可执行程序的每一个符号所属的共享库信息和符号在共享库中的偏移;根据每一个符号所属的共享库的基地址、每一个符号在共享库中的偏移计算每一个符号的地址信息,根据符号的地址信息进行动态重定位。
步骤104、动态装载器调用可执行程序的所有初始化函数,将控制权交给可执行程序。
传统的启动动态链接程序的方法中,查找符号的地址的步骤耗时占比可能高达30%~50%。
参见图2,本发明一个实施例提出了一种启动动态链接程序的方法,包括:
步骤200、获取可执行程序的第一构建标识。
在本发明实施例中,可以采用以下任一种方法获取可执行程序的第一构建标识。
方法一、当在构建可执行程序时为可执行程序加上第一构建标识时,那么可执行程序中存在第一构建标识,可以直接从可执行程序中获取可执行程序的第一构建标识;当在构建可执行程序时没有为可执行程序加上第一构建标识时,那么可执行程序中不存在第一构建标识,可以显示告警信息,也可以不显示告警信息;或者采用方法二获取第一构建标识。
该方法中,在构建可执行程序时为可执行程序加上第一构建标识时,例如,可以采用单向哈希算法(如sha、md5等)计算可执行程序的哈希值,将计算得到的哈希值作为第一构建标识;又如,也可以直接生成一个足够长的随机字符串作为第一构建标识;将得到的第一构建标识放入可执行程序中即可。
方法二、当在构建可执行程序时没有为可执行程序加上第一构建标识时,可执行程序中不存在第一构建标识,那么可以使用以下任意一个作为可执行程序的第一构建标识:
可执行程序的文件名和可执行程序的修改时间;
可执行程序的文件名和可执行程序的文件大小;
可执行程序的文件名、可执行程序的修改时间和可执行程序的文件大小。
其中,可执行程序的文件名用于区分不同的可执行程序,可执行程序的修改时间和文件大小用于区分同一个可执行程序的不同版本,采用修改时间和文件大小两个信息来区分同一个可执行程序的不同版本的原因是:可执行程序的修改时间不是那么可靠,这是由于存在可执行程序的内容被修改,但是修改时间没有变更的可能性。
步骤201、对于可执行程序依赖的每一个共享库,在将共享库加载到内存中后,将共享库的基地址放入缓冲区中,获取共享库的第二构建标识。
在本发明实施例中,缓冲区可以是如数组、列表、队列等,具体的形式不用于限定本发明实施例的保护范围。
在本发明实施例中,可以采用以下任一种方法获取共享库的第二构建标识。
方法一、当在构建共享库时为共享库加上第二构建标识时,那么共享库中存在第二构建标识,可以直接从共享库中获取共享库的第二构建标识;当在构建共享库时没有为共享库加上第二构建标识时,那么共享库中不存在第二构建标识,可以显示告警信息,也可以不显示告警信息;或者采用方法二获取第二构建标识。
该方法中,在构建共享库时为共享库加上第二构建标识时,例如,可以采用单向哈希算法(如sha、md5等)计算共享库的哈希值,将计算得到的哈希值作为第二构建标识;又如,也可以直接生成一个足够长的随机字符串作为第二构建标识;将得到的第二构建标识放入共享库中即可。
方法二、当在构建共享库时没有为共享库加上第二构建标识时,共享库中不存在构建标识,那么可以使用以下任意一个作为共享库的第二构建标识:
共享库的文件名和共享库的修改时间;
共享库的文件名和共享库的文件大小;
共享库的文件名、共享库的修改时间和共享库的文件大小。
其中,共享库的文件名用于区分不同的共享库,共享库的修改时间和文件大小用于区分同一个共享库的不同版本,采用修改时间和文件大小两个信息来区分同一个共享库的不同版本的原因是:共享库的修改时间不是那么可靠,这是由于存在共享库的内容被修改,但是修改时间没有变更的可能性。
步骤202、在将所述可执行程序依赖的所有所述共享库加载到内存中后,当缓存的对应关系中的构建标识序列中存在与特定构建标识序列相同的构建标识序列时,从缓存的对应关系中,查找所述特定构建标识序列对应的符号、符号所属的共享库信息和符号在共享库中的偏移;其中,所述对应关系为构建标识序列、符号、符号所属的共享库信息和符号在共享库中的偏移之间的对应关系;所述特定构建标识序列为由获得的第一构建标识和所有共享库的第二构建标识组成。
在本发明实施例中,在对比两个构建标识序列是否相同时,应该对比两个构建标识序列中包含的构建标识个数是否相同,并且处于同一位置的构建标识是否相同,只有包含的构建标识个数相同,并且所有处于同一位置的两个构建标识相同时,才确定两个构建标识序列是相同的。例如,构建标识序列1依次包括:第一构建标识1、第二构建标识2、第二构建标识3;构建标识序列2依次包括:第一构建标识4、第二构建标识5、第二构建标识6;那么只有当第一构建标识1和第一构建标识4相同,第二构建标识2和第二构建标识5相同,第二构建标识3和第二构建标识6相同时,才认为构建标识序列1和构建标识序列2相同。
步骤203、根据缓冲区中共享库的基地址、符号所属的共享库信息和符号在共享库中的偏移计算符号的地址信息。
在本发明实施例中,符号的地址信息为符号所属的共享库的基地址+符号在共享库中的偏移。
在本发明另一个实施例中,当缓存的对应关系中的构建标识序列中不存在与特定构建标识序列相同的构建标识序列时,该方法还包括:
查找所述可执行程序的每一个所述符号所属的共享库信息和所述符号在所述共享库中的偏移;根据每一个所述符号所属的共享库的基地址、每一个所述符号在所述共享库中的偏移计算每一个所述符号的地址信息;
将特定构建标识序列、符号、符号所属的共享库信息和符号在共享库中的偏移之间的对应关系进行缓存。
在本发明实施例中,在将对应关系进行缓存时,可以将对应关系缓存到内存中,或者将对应关系缓存到磁盘文件中。当将对应关系缓存到磁盘文件中时,对应关系可以得到永久保存。
在本发明另一个实施例中,当无法获得可执行程序的第一构建标识,或无法获得至少一个共享库的第二构建标识时,该方法还包括:
查找所述可执行程序的每一个所述符号所属的共享库信息和所述符号在所述共享库中的偏移;根据每一个所述符号所属的共享库的基地址、每一个所述符号在所述共享库中的偏移计算每一个所述符号的地址信息。
在本发明实施例中,步骤200可以在步骤201之前执行,也可以在步骤201之后执行,当步骤200在步骤201之前执行时,构建标识序列中第一构建标识位于第二构建标识之前;当步骤200在步骤201之后执行时,构建标识序列中第一构建标识位于第二构建标识之后;当然,第一构建标识还可以位于构建标识序列中的其他位置,具体的位置不用于限定本发明实施例的保护范围,本发明实施例强调的是构建标识序列中各构建标识的顺序和内容均一致时,说明可执行程序的版本和共享库的版本相同。
本发明实施例通过缓存的对应关系实现地址信息的快速计算,而不需要查找地址信息,在支持地址随机化配置的情况下,提高了动态链接程序的启动速度。
实例1
本实例描述通过,在构建可执行程序时为可执行程序加上第一构建标识,在构建共享库时为共享库加上第二构建标识的方式,实现动态链接程序的快速启动的方法。参见图3,该方法包括:
步骤300、动态装载器获得控制权,完成自身的初始化工作。
步骤301、动态装载器解析输入参数,获得可执行程序的名称。
步骤302、动态装载器解析可执行程序得到可执行程序依赖的共享库。
步骤303、动态装载器将“可快速启动”标志设置为true,设置共享库加载序号idx为0,构建第一数组so_addr用于存放共享库的加载基地址,构建第二数组buff用于存放构建标识序列。
步骤304、动态装载器判断可执行程序是否存在第一构建标识,当可执行程序不存在第一构建标识时,显示告警(可选动作),将“可快速启动”标识设置为false;当可执行程序存在第一构建标识时,将可执行程序的第一构建标识加入到第二数组buff的尾部。
步骤305、对于可执行程序依赖的每一个共享库,动态装载器在将共享库加载到内存中后,将共享库的基地址放入so_addr[idx]中,并将idx值加1。
步骤306、动态装载器判断共享库是否存在第二构建标识,当共享库不存在第二构建标识时,显示告警(可选动作),将“可快速启动”标识设置为false;当共享库存在第二构建标识时,将共享库的第二构建标识加入到第二数组buff的尾部。
步骤307、动态装载器加载完成所有共享库后,检查“可快速启动”标识是否为ture。当“可快速启动”标识为false时,执行步骤308和步骤312;当“可快速启动”标识为true时,执行步骤309~312。
步骤308、动态装载器查找可执行程序依赖的所有共享库的所有符号的地址信息,根据查找到的符号的地址信息进行动态重定位。
步骤309、动态装载器判断缓存的对应关系中的构建标识序列中是否存在与buff中的内容相同的构建标识序列;当缓存的对应关系中的构建标识序列中不存在与buff中的内容相同的构建标识序列时,执行步骤310和步骤312;当缓存的对应关系中的构建标识序列中存在与buff中的内容相同的构建标识序列时,执行步骤311和步骤312。
步骤310、动态装载器查找所有共享库的所有符号的地址信息,根据查找到的符号的地址信息(包括共享库的基地址+符号在共享库中的偏移)进行动态重定位;将buff中的内容(即构建标识序列)、符号、符号所属的共享库信息(即idx)和符号在共享库中的偏移offset之间的对应关系缓存到磁盘文件中。
步骤311、动态装载器从缓存的磁盘文件中读出buff中的内容对应的符号、符号所属的共享库信息(即idx)和符号在共享库中的偏移offset,通过so_addr[idx]+offset的方法就能算出符号的地址信息,根据符号的地址信息进行动态重定位。
步骤312、动态装载器调用可执行程序的所有初始化函数,将控制权交给可执行程序。
本发明实施例中,可以将步骤303~步骤311嵌入动态装载器中实现。其原因是这样做效率最高,复杂性较低,工作量较小。但是,出于功能隔离或版权限制等考虑,完全可以将步骤303~步骤311独立作为一个模块或者程序。
实例2
实例1中,为了保证启动加速后的正确性,需要,在构建可执行程序时为可执行程序加上第一构建标识,在构建共享库时为共享库加上第二构建标识,但是对于一些历史遗留系统,或者使用第三方供应商(因而无法重新编译链接)的系统,这种约束可能无法得到满足。
本实例使用文件名加修改时间,或文件名加文件大小,或文件名、修改时间加文件大小作为构建标识,以去除对构建过程的依赖。参见图4,该方法包括:
步骤400、动态装载器获得控制权,完成自身的初始化工作。
步骤401、动态装载器解析输入参数,获得可执行程序的名称。
步骤402、动态装载器解析可执行程序得到可执行程序依赖的共享库。
步骤403、动态装载器设置共享库加载序号idx为0,构建第一数组so_addr用于存放共享库的加载基地址,构建第二数组buff用于存放构建标识序列。
步骤404、动态装载器判断可执行程序是否存在第一构建标识,当可执行程序不存在第一构建标识时,读取可执行程序的修改时间和文件大小,使用文件名、修改时间加文件大小作为第一构建标识,将第一构建标识加入到第二数组buff的尾部;当可执行程序存在第一构建标识时,将可执行程序的第一构建标识加入到第二数组buff的尾部。
步骤405、对于可执行程序依赖的每一个共享库,动态装载器在将共享库加载到内存中后,将共享库的基地址放入so_addr[idx]中,并将idx值加1。
步骤406、动态装载器判断共享库是否存在第二构建标识,当共享库不存在第二构建标识时,读取共享库的修改时间和文件大小,使用文件名、修改时间加文件大小作为第二构建标识,将第二构建标识加入到第二数组buff的尾部;当共享库存在第二构建标识时,将共享库的第二构建标识加入到第二数组buff的尾部。
步骤407、动态装载器加载完所有共享库后,判断缓存的对应关系中的构建标识序列中是否存在与buff中的内容相同的构建标识序列;当缓存的对应关系中的构建标识序列中不存在与buff中的内容相同的构建标识序列时,执行步骤408和步骤410;当缓存的对应关系中的构建标识序列中存在与buff中的内容相同的构建标识序列时,执行步骤409和步骤410。
步骤408、动态装载器查找所有共享库的所有符号的地址信息,根据查找到的符号的地址信息(包括共享库的基地址+符号在共享库中的偏移)进行动态重定位;将buff中的内容(即构建标识序列)、符号、符号所属的共享库信息(即idx)和符号在共享库中的偏移offset之间的对应关系缓存到磁盘文件中。
步骤409、动态装载器从缓存的磁盘文件中读出buff中的内容对应的符号、符号所属的共享库信息(即idx)和符号在共享库中的偏移offset,通过so_addr[idx]+offset的方法就能算出符号的地址信息,根据符号的地址信息进行动态重定位。
步骤410、动态装载器调用可执行程序的所有初始化函数,将控制权交给待加载的可执行程序。
由于可动态按照文件名、修改时间再加文件大小来构建标识,本实例如图4所示实施时,总是能成功进行快速启动。该实施方式的劣势在于,修改时间相对不那么可靠,这是由于存在共享库的内容被修改,但是修改时间没有变更的可能性。考虑到构建标识中还包含文件大小,对于共享库这样的二进制文件来说,共享库变更后构建标识仍然相同的可能性是很低的。
本发明另一个实施例提出了一种启动动态链接程序的装置,包括处理器和计算机可读存储介质,所述计算机可读存储介质中存储有指令,当所述指令被所述处理器执行时,实现上述任一种启动动态链接程序的方法。
本发明另一个实施例提出了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任一种启动动态链接程序的方法的步骤。
参见图5,本发明另一个实施例提出了一种启动动态链接程序的装置,包括:
第一获取模块501,用于获取可执行程序的第一构建标识;
第二获取模块502,用于对于所述可执行程序依赖的每一个共享库,在将所述共享库加载到内存中后,将所述共享库的基地址放入缓冲区中,获取所述共享库的第二构建标识;
地址信息获取模块503,用于在将所述可执行程序依赖的所有所述共享库加载到内存中后,当缓存的对应关系中的构建标识序列中存在与特定构建标识序列相同的构建标识序列时,从缓存的对应关系中,查找所述特定构建标识序列对应的符号、符号所属的共享库信息和符号在共享库中的偏移;其中,所述对应关系为构建标识序列、符号、符号所属的共享库信息和符号在共享库中的偏移之间的对应关系;所述特定构建标识序列为由获得的第一构建标识和所有共享库的第二构建标识组成;根据所述缓冲区中共享库的基地址、所述符号所属的共享库信息和所述符号在共享库中的偏移计算所述符号的地址信息。
在本发明实施例中,第一获取模块501可以采用以下任一种方法获取可执行程序的第一构建标识。
方法一、当在构建可执行程序时为可执行程序加上第一构建标识时,那么可执行程序中存在第一构建标识,可以直接从可执行程序中获取可执行程序的第一构建标识;当在构建可执行程序时没有为可执行程序加上第一构建标识时,那么可执行程序中不存在第一构建标识,可以显示告警信息,也可以不显示告警信息;或者采用方法二获取第一构建标识。
该方法中,在构建可执行程序时为可执行程序加上第一构建标识时,例如,可以采用单向哈希算法(如sha、md5等)计算可执行程序的哈希值,将计算得到的哈希值作为第一构建标识;又如,也可以直接生成一个足够长的随机字符串作为第一构建标识;将得到的第一构建标识放入可执行程序中即可。
方法二、当在构建可执行程序时没有为可执行程序加上第一构建标识时,可执行程序中不存在第一构建标识,那么可以使用以下任意一个作为可执行程序的第一构建标识:
可执行程序的文件名和可执行程序的修改时间;
可执行程序的文件名和可执行程序的文件大小;
可执行程序的文件名、可执行程序的修改时间和可执行程序的文件大小。
其中,可执行程序的文件名用于区分不同的可执行程序,可执行程序的修改时间和文件大小用于区分同一个可执行程序的不同版本,采用修改时间和文件大小两个信息来区分同一个可执行程序的不同版本的原因是:可执行程序的修改时间不是那么可靠,这是由于存在可执行程序的内容被修改,但是修改时间没有变更的可能性。
在本发明实施例中,缓冲区可以是如数组、列表、队列等,具体的形式不用于限定本发明实施例的保护范围。
在本发明实施例中,第二获取模块502可以采用以下任一种方法获取共享库的第二构建标识。
方法一、当在构建共享库时为共享库加上第二构建标识时,那么共享库中存在第二构建标识,可以直接从共享库中获取共享库的第二构建标识;当在构建共享库时没有为共享库加上第二构建标识时,那么共享库中不存在第二构建标识,可以显示告警信息,也可以不显示告警信息;或者采用方法二获取第二构建标识。
该方法中,在构建共享库时为共享库加上第二构建标识时,例如,可以采用单向哈希算法(如sha、md5等)计算共享库的哈希值,将计算得到的哈希值作为第二构建标识;又如,也可以直接生成一个足够长的随机字符串作为第二构建标识;将得到的第二构建标识放入共享库中即可。
方法二、当在构建共享库时没有为共享库加上第二构建标识时,共享库中不存在构建标识,那么可以使用以下任意一个作为共享库的第二构建标识:
共享库的文件名和共享库的修改时间;
共享库的文件名和共享库的文件大小;
共享库的文件名、共享库的修改时间和共享库的文件大小。
其中,共享库的文件名用于区分不同的共享库,共享库的修改时间和文件大小用于区分同一个共享库的不同版本,采用修改时间和文件大小两个信息来区分同一个共享库的不同版本的原因是:共享库的修改时间不是那么可靠,这是由于存在共享库的内容被修改,但是修改时间没有变更的可能性。
在本发明实施例中,符号的地址信息为符号所属的共享库的基地址+符号在共享库中的偏移。
在本发明实施例中,在对比两个构建标识序列是否相同时,应该对比两个构建标识序列中包含的构建标识个数是否相同,并且处于同一位置的构建标识是否相同,只有包含的构建标识个数相同,并且所有处于同一位置的的两个构建标识相同时,才确定两个构建标识序列是相同的。例如,构建标识序列1依次包括:第一构建标识1、第二构建标识2、第二构建标识3;构建标识序列2依次包括:第一构建标识4、第二构建标识5、第二构建标识6;那么只有当第一构建标识1和第一构建标识4相同,第二构建标识2和第二构建标识5相同,第二构建标识3和第二构建标识6相同时,才认为构建标识序列1和构建标识序列2相同。
在本发明另一个实施例中,地址信息获取模块503还用于:
当缓存的对应关系中的构建标识序列中不存在与特定构建标识序列相同的构建标识序列时,查找所述可执行程序的每一个所述符号所属的共享库信息和所述符号在所述共享库中的偏移;根据每一个所述符号所属的共享库的基地址、每一个所述符号在所述共享库中的偏移计算每一个所述符号的地址信息;
将特定构建标识序列、符号、符号所属的共享库信息和符号在共享库中的偏移之间的对应关系进行缓存。
在本发明实施例中,地址信息获取模块503在将对应关系进行缓存时,可以将对应关系缓存到内存中,或者将对应关系缓存到磁盘文件中。当将对应关系缓存到磁盘文件中时,对应关系可以得到永久保存。
在本发明另一个实施例中,地址信息获取模块503还用于:
当无法获得可执行程序的第一构建标识,或无法获得至少一个共享库的第二构建标识时,查找所述可执行程序的每一个所述符号所属的共享库信息和所述符号在所述共享库中的偏移;根据每一个所述符号所属的共享库的基地址、每一个所述符号在所述共享库中的偏移计算每一个所述符号的地址信息。
在本发明实施例中,步骤200可以在步骤201之前执行,也可以在步骤201之后执行,当步骤200在步骤201之前执行时,构建标识序列中第一构建标识位于第二构建标识之前;当步骤200在步骤201之后执行时,构建标识序列中第一构建标识位于第二构建标识之后;当然,第一构建标识还可以位于构建标识序列中的其他位置,具体的位置不用于限定本发明实施例的保护范围,本发明实施例强调的是构建标识序列中各构建标识的顺序和内容均一致时,说明可执行程序的版本和共享库的版本相同。
本发明实施例通过缓存的对应关系实现地址信息的快速计算,而不需要查找地址信息,在支持地址随机化配置的情况下,提高了动态链接程序的启动速度。
虽然本发明所揭露的实施方式如上,但所述的内容仅为便于理解本发明而采用的实施方式,并非用以限定本发明。任何本发明所属领域内的技术人员,在不脱离本发明所揭露的精神和范围的前提下,可以在实施的形式及细节上进行任何的修改与变化,但本发明的专利保护范围,仍须以所附的权利要求书所界定的范围为准。
Claims (9)
1.一种启动动态链接程序的方法,包括:
获取可执行程序的第一构建标识;
对于所述可执行程序依赖的每一个共享库,在将所述共享库加载到内存中后,将所述共享库的基地址放入缓冲区中,获取所述共享库的第二构建标识;
在将所述可执行程序依赖的所有所述共享库加载到内存中后,当缓存的对应关系中的构建标识序列中存在与特定构建标识序列相同的构建标识序列时,从缓存的对应关系中,查找所述特定构建标识序列对应的符号、符号所属的共享库信息和符号在共享库中的偏移;其中,所述对应关系为构建标识序列、符号、符号所属的共享库信息和符号在共享库中的偏移之间的对应关系;所述特定构建标识序列为由获得的第一构建标识和所有共享库的第二构建标识组成;
根据所述缓冲区中共享库的基地址、所述符号所属的共享库信息和所述符号在共享库中的偏移计算所述符号的地址信息。
2.根据权利要求1所述的方法,其特征在于,当所述缓存的对应关系中的构建标识序列中不存在与所述特定构建标识序列相同的构建标识序列时,该方法还包括:
查找所述可执行程序的每一个所述符号所属的共享库信息和所述符号在所述共享库中的偏移;根据每一个所述符号所属的共享库的基地址、每一个所述符号在所述共享库中的偏移计算每一个所述符号的地址信息;
将所述特定构建标识序列、符号、符号所属的共享库信息和符号在共享库中的偏移之间的对应关系进行缓存。
3.根据权利要求2所述的方法,其特征在于,其中,所述将对应关系进行缓存包括:
将所述对应关系缓存到内存中,或者将所述对应关系缓存到磁盘文件中。
4.根据权利要求1所述的方法,其特征在于,当无法获得所述可执行程序的第一构建标识,或无法获得至少一个所述共享库的第二构建标识时,该方法还包括:
查找所述可执行程序的每一个所述符号所属的共享库信息和所述符号在所述共享库中的偏移;根据每一个所述符号所属的共享库的基地址、每一个所述符号在所述共享库中的偏移计算每一个所述符号的地址信息。
5.根据权利要求1~4任一项所述的方法,其特征在于,其中,所述获取可执行程序的第一构建标识包括以下任意一个或一个以上:
当所述可执行程序中存在所述第一构建标识时,从所述可执行程序中获取所述第一构建标识;
当所述可执行程序中不存在所述第一构建标识时,使用以下任意一个作为所述第一构建标识:
所述可执行程序的文件名和所述可执行程序的修改时间;
所述可执行程序的文件名和所述可执行程序的文件大小;
所述可执行程序的文件名、所述可执行程序的修改时间和所述可执行程序的文件大小。
6.根据权利要求1~4任一项所述的方法,其特征在于,其中,所述获取共享库的第二构建标识包括以下任意一个或一个以上:
当所述共享库中存在所述第二构建标识时,从所述共享库中获取所述第二构建标识;
当所述共享库中不存在所述第二构建标识时,使用以下任意一个作为所述第二构建标识:
所述共享库的文件名和所述共享库的修改时间;
所述共享库的文件名和所述共享库的文件大小;
所述共享库的文件名、所述共享库的修改时间和所述共享库的文件大小。
7.一种启动动态链接程序的装置,包括处理器和计算机可读存储介质,所述计算机可读存储介质中存储有指令,其特征在于,当所述指令被所述处理器执行时,实现如权利要求1~6任一项所述的启动动态链接程序的方法。
8.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1~6任一项所述的启动动态链接程序的方法的步骤。
9.一种启动动态链接程序的装置,包括:
第一获取模块,用于获取可执行程序的第一构建标识;
第二获取模块,用于对于所述可执行程序依赖的每一个共享库,在将所述共享库加载到内存中后,将所述共享库的基地址放入缓冲区中,获取所述共享库的第二构建标识;
地址信息获取模块,用于在将所述可执行程序依赖的所有所述共享库加载到内存中后,当缓存的对应关系中的构建标识序列中存在与特定构建标识序列相同的构建标识序列时,从缓存的对应关系中,查找所述特定构建标识序列对应的符号、符号所属的共享库信息和符号在共享库中的偏移;其中,所述对应关系为构建标识序列、符号、符号所属的共享库信息和符号在共享库中的偏移之间的对应关系;所述特定构建标识序列为由获得的第一构建标识和所有共享库的第二构建标识组成;根据所述缓冲区中共享库的基地址、所述符号所属的共享库信息和所述符号在共享库中的偏移计算所述符号的地址信息。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910905160.3A CN112559064A (zh) | 2019-09-24 | 2019-09-24 | 一种启动动态链接程序的方法和装置 |
PCT/CN2020/108673 WO2021057300A1 (zh) | 2019-09-24 | 2020-08-12 | 一种启动动态链接程序的方法、装置及计算机可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910905160.3A CN112559064A (zh) | 2019-09-24 | 2019-09-24 | 一种启动动态链接程序的方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN112559064A true CN112559064A (zh) | 2021-03-26 |
Family
ID=75028985
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910905160.3A Pending CN112559064A (zh) | 2019-09-24 | 2019-09-24 | 一种启动动态链接程序的方法和装置 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN112559064A (zh) |
WO (1) | WO2021057300A1 (zh) |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101470619A (zh) * | 2007-12-29 | 2009-07-01 | 安凯(广州)软件技术有限公司 | 一种基于微核操作系统的应用程序动态加载方法 |
CN107247579B (zh) * | 2016-08-19 | 2020-09-11 | 北京金山安全管理系统技术有限公司 | 一种elf文件映像基地址的计算方法及装置 |
CN106354536A (zh) * | 2016-08-31 | 2017-01-25 | 北京奇虎科技有限公司 | 在Windows系统中加载Linux系统ELF文件的方法及装置 |
CN109814939B (zh) * | 2017-11-20 | 2021-10-15 | 华为技术有限公司 | 一种动态加载方法、目标文件的制作方法及装置 |
-
2019
- 2019-09-24 CN CN201910905160.3A patent/CN112559064A/zh active Pending
-
2020
- 2020-08-12 WO PCT/CN2020/108673 patent/WO2021057300A1/zh active Application Filing
Also Published As
Publication number | Publication date |
---|---|
WO2021057300A1 (zh) | 2021-04-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP3786603B2 (ja) | 変換した命令を実行しつつコンテキストを維持する方法および装置 | |
US8843944B2 (en) | Accelerated class check | |
US8281291B2 (en) | System and method for embedded java memory footprint performance improvement | |
CN108229148B (zh) | 一种基于Android虚拟机的沙箱脱壳方法及系统 | |
CN109189496B (zh) | 应用程序的动态库信息获取方法及装置 | |
US9063805B2 (en) | Method and system for enabling access to functionality provided by resources outside of an operating system environment | |
US11416614B2 (en) | Statistical detection of firmware-level compromises | |
CN104685443A (zh) | 锁定引导数据用以更快引导 | |
CN117311817B (zh) | 一种协处理器控制方法、装置、设备及存储介质 | |
US9842018B2 (en) | Method of verifying integrity of program using hash | |
CN107797843B (zh) | 一种容器功能增强的方法和装置 | |
CN112559064A (zh) | 一种启动动态链接程序的方法和装置 | |
CN114610516B (zh) | 应用程序的修复方法、装置、计算机设备以及存储介质 | |
CN115481397A (zh) | 基于内存结构逆向分析的代码注入攻击取证检测方法与系统 | |
CN114625646A (zh) | 一种检测系统内存越界的方法和装置 | |
US10152255B2 (en) | Accelerated loading of guest virtual machine from live snapshot | |
CN114327508A (zh) | 一种软件加载方法及相关装置 | |
US9342319B1 (en) | Accelerated class check | |
CN113590404A (zh) | 模拟器的检测方法、装置、设备以及计算机存储介质 | |
CN108255417B (zh) | 数据访问方法、电子装置及可读存储介质 | |
CN112182516A (zh) | 基于relro安全保护的检测方法、终端及存储介质 | |
KR20100100488A (ko) | 메모리 조작유무를 감지하는 방법 및 이를 이용한 장치 | |
US20090319991A1 (en) | Managed code type equivalence | |
CN114281248B (zh) | 一种提升ram读写性能的方法、电子设备及介质 | |
CN113220334B (zh) | 程序故障定位方法、终端设备及计算机可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |