静态TLS的访问方法、装置、电子设备及存储介质制造方法及图纸

技术编号:36366442 阅读:11 留言:0更新日期:2023-01-18 09:23
本发明专利技术实施例提供了一种静态TLS的访问方法、装置、电子设备及存储介质。其中,静态TLS的访问方法,包括:可执行文件启动后静态加载预先创建的库文件,其中,库文件与可执行文件预先链接,库文件包括TLS数据块;可执行文件运行过程动态加载目标动态链接库或创建线程后,基于TLS数据块为目标动态链接库或线程分配访问的静态TLS。本发明专利技术的实施例,可以以较小的代价解决一些不支持动态加载的动态链接库使用静态TLS变量的问题,相比于现有技术中需要修改大量代码的方式解决一些不支持动态加载的动态链接库使用静态TLS变量的问题,具有风险小、人力成本低、简单易行的优点,还可以减少冲突,提升程序运行的稳定性。提升程序运行的稳定性。提升程序运行的稳定性。

【技术实现步骤摘要】
静态TLS的访问方法、装置、电子设备及存储介质


[0001]本专利技术涉及互联网
,尤其涉及一种静态TLS的访问方法、装置、电子设备及存储介质。

技术介绍

[0002]Windows XP系统对静态TLS(Thread Local Storage,线程局部存储)的支持存在如下问题,即:仅支持程序启动时静态依赖的模块使用静态TLS。对动态加载的动态链接库Dll只能使用TLS API(Application Programming Interface,应用程序接口)函数这种显式调用方式。但是例如Chromium浏览器的主逻辑模块chrome.dll是动态加载的。Chromium自M49之后不再支持Windows XP系统,同时大量使用了C++11标准引入的局部静态变量线程安全初始化特性,而这个特性利用了静态TLS来实现。因此,基于Chromium项目的浏览器要兼容Windows XP系统,需要解决动态加载下使用静态TLS的问题,否则在Windows XP下将无法加载运行。为了使其支持Windows XP系统,常见的作法是通过编译开关(/Zc:threadSafeInit

)关闭局部静态变量线程安全初始化特性,这样就规避了使用它带来的静态TLS。但是这样做可能导致局部静态变量初始化出现竞争,从而需要在更新内核下修改大量的业务代码来解决竞争问题,给内核升级带来挑战并且人工成本高,并有可能对涉及的业务代码修改不彻底导致如崩溃等潜在的问题,运行的可靠性较差。

技术实现思路

[0003]针对现有技术中的问题,本专利技术实施例提供一种静态TLS的访问方法、装置、电子设备及存储介质。
[0004]具体地,本专利技术实施例提供了以下技术方案:
[0005]第一方面,本专利技术实施例提供了一种静态TLS的访问方法,包括:
[0006]可执行文件启动后静态加载预先创建的库文件,其中,所述库文件与所述可执行文件预先链接,所述库文件包括TLS数据块;
[0007]所述可执行文件运行过程动态加载目标动态链接库或创建线程后,基于所述TLS数据块为所述目标动态链接库或所述线程分配访问的静态TLS。
[0008]在一些示例中,在所述可执行文件启动后静态加载预先创建的库文件之前,还包括:
[0009]创建所述库文件,并安装所述库文件以通过所述库文件导出的lib文件实现所述库文件与所述可执行文件的链接。
[0010]在一些示例中,所述可执行文件启动后静态加载预先创建的库文件,包括:
[0011]所述可执行文件启动后,静态加载所述库文件,并基于所述库文件的TLS数据块为所述库文件分配TLS索引和各线程对应的TLS数据空间。
[0012]在一些示例中,所述可执行文件运行过程动态加载目标动态链接库或创建线程后,基于所述TLS数据块为所述目标动态链接库或所述线程分配访问的静态TLS,包括:
[0013]在所述可执行文件运行过程动态加载所述目标动态链接库或创建所述线程后,通过DllMain入口函数,为所述目标动态链接库或所述线程分配所述TLS索引和对应的TLS数据空间。
[0014]在一些示例中,在为所述目标动态链接库或所述线程分配所述TLS索引和对应的TLS数据空间之后,还包括:
[0015]调用TLS全局变量的初始化函数对TLS变量进行初始化。
[0016]在一些示例中,还包括:
[0017]检测系统版本;
[0018]如果所述系统版本高于预设版本,则卸载所述库文件。
[0019]第二方面,本专利技术实施例还提供了一种静态TLS的访问装置,包括:
[0020]库文件加载模块,用于在可执行文件启动后静态加载预先创建的库文件,其中,所述库文件与所述可执行文件预先链接,所述库文件包括TLS数据块;
[0021]静态TLS访问模块,用于在所述可执行文件运行过程动态加载目标动态链接库或创建线程后,基于所述TLS数据块为所述目标动态链接库或所述线程分配访问的静态TLS。
[0022]第三方面,本专利技术实施例还提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如第一方面所述的静态TLS的访问方法的步骤。
[0023]第四方面,本专利技术实施例还提供了一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如第一方面所述的静态TLS的访问方法的步骤。
[0024]第五方面,本专利技术实施例还提供了一种计算机程序产品,所计算机程序产品包括有计算机程序,该计算机程序被处理器执行时实现如第一方面所述的静态TLS的访问方法的步骤。
[0025]由上面技术方案可知,本专利技术实施例提供的静态TLS的访问方法、装置、电子设备及存储介质,可执行文件启动后静态加载预先创建好的并且与可执行文件预先链接的库文件,当可执行文件运行过程中动态加载目标动态链接库或创建线程后,便可以根据库文件中分配的TLS数据块为目标动态链接库或线程分配访问的静态TLS。这样,可以以较小的代价解决一些不支持动态加载的动态链接库使用静态TLS变量的问题,相比于现有技术中需要修改大量代码的方式解决一些不支持动态加载的动态链接库使用静态TLS变量的问题,具有风险小、人力成本低、简单易行的优点,还可以减少冲突,提升程序运行的稳定性。
附图说明
[0026]为了更清楚地说明本专利技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本专利技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0027]图1为本专利技术一实施例提供的静态TLS的访问方法的流程图;
[0028]图2为本专利技术一实施例提供的静态TLS的访问装置的结构框图;
[0029]图3为本专利技术一实施例提供的电子设备的结构示意图。
具体实施方式
[0030]为使本专利技术实施例的目的、技术方案和优点更加清楚,下面将结合本专利技术实施例中的附图,对本专利技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本专利技术一部分实施例,而不是全部的实施例。基于本专利技术中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本专利技术保护的范围。
[0031]图1示出了本专利技术实施例提供的静态TLS的访问方法的流程图。如图1所示,本专利技术实施例提供的静态TLS的访问方法,包括如下步骤:
[0032]步骤101:可执行文件启动后静态加载预先创建的库文件,其中,库文件与可执行文件预先链接,库文件包括TLS数据块。
[0033]其中,TLS(Thread Local Storage)指线程局部存储,静态TLS是使用微软VC扩展__declspec(thread)或者关键字thread_local(C++11)声明的变量,由编译器和系统加载本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种静态TLS的访问方法,其特征在于,包括:可执行文件启动后静态加载预先创建的库文件,其中,所述库文件与所述可执行文件预先链接,所述库文件包括TLS数据块;所述可执行文件运行过程动态加载目标动态链接库或创建线程后,基于所述TLS数据块为所述目标动态链接库或所述线程分配访问的静态TLS。2.根据权利要求1所述的静态TLS的访问方法,其特征在于,在所述可执行文件启动后静态加载预先创建的库文件之前,还包括:创建所述库文件,并安装所述库文件以通过所述库文件导出的lib文件实现所述库文件与所述可执行文件的链接。3.根据权利要求1或2所述的静态TLS的访问方法,其特征在于,所述可执行文件启动后静态加载预先创建的库文件,包括:所述可执行文件启动后,静态加载所述库文件,并基于所述库文件的TLS数据块为所述库文件分配TLS索引和各线程对应的TLS数据空间。4.根据权利要求3所述的静态TLS的访问方法,其特征在于,所述可执行文件运行过程动态加载目标动态链接库或创建线程后,基于所述TLS数据块为所述目标动态链接库或所述线程分配访问的静态TLS,包括:在所述可执行文件运行过程动态加载所述目标动态链接库或创建所述线程后,通过DllMain入口函数,为所述目标动态链接库或所述线程分配所述TLS索引和对应的TLS数据空间。5.根据权利要求4所述的静态T...

【专利技术属性】
技术研发人员:杨晓兵管重田亮杨东
申请(专利权)人:网神信息技术北京股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1