共享库处理方法、装置、电子设备及存储介质与流程

文档序号:27327449发布日期:2021-11-10 01:24阅读:75来源:国知局
1.本公开涉及数据处理领域,尤其涉及一种共享库处理方法、装置、电子设备及存储介质。
背景技术
::2.计算机程序是在操作系统之上运行的二进制文件。对于一个简单的计算机程序来说,只需要一个带有入口函数的二进制文件。计算机程序运行时,由操作系统加载二进制文件并调用该二进制文件的入口函数。随着计算机程序的复杂度增加,如果还采用单文件的二进制文件,会导致任何细微的修改,都需要重新构建整个二进制文件,并且也无法被别的计算机程序共享(即一个计算机程序调用另一个计算机程序的函数)。为此,相关技术中的一个计算机程序,通常由一个带有入口函数的二进制文件,和多个共享库组成。当修改计算机程序的某个功能时,只需要重新构建所属的共享库,而不需要重新构造该计算机程序对应的所有的二进制文件。其中,共享库也是一种二进制文件,也称共享库文件,在计算机程序运行时,动态加载到内存中并运行。3.计算机程序(可以是带有入口函数的二进制文件,也可以是共享库文件)通过符号获取共享库中的方法或者全局变量的地址,进而进行调用,因为该符号与共享库中的方法或者全局变量的地址信息建立有映射关系。由于共享库中存在多个函数或者全局变量,但并不是都需要被外部的计算机程序用到,并且符号越多,导致共享库的文件越大,所以在构建共享库时,需要指定哪些符号可以被外部的计算机程序使用,这个行为被称为符号导出,指定的可导出的符号,则可以被外部的计算机程序使用。4.在构建共享库的过程中,需要将剥离出来的公共代码中的相关符号导出,以便其它共享库调用。相关技术中,通过共享库的构建工具,有多种方式可以导出符号:5.方式一、程序源文件(简称源文件)中导出。源文件中定义的方法或者全局变量默认是导出,也可以通过相关的宏指令指定一个符号是否可导出。指定为可导出的符号,在后续的编译和链接时期,仍然可以更改为不可导出,但是已经指定为不可导出的符号,在后续的编译和链接时期,无法将其改为可以导出。6.方式二、编译期导出。编译期可以将源文件进行编译,生成目标文件。在编译过程中,通过编译选项,指定一个源文件中的可导出的符号是否导出,这个是文件级别的导出,对源文件内部所有可导出的符号都生效。如果源文件中指明某些符号可导出,通过编译选项可以将这些符号全部更改为不可导出。但是,如果源文件中指明某些符号不可导出,那么无法将其更改为可导出。7.方式三、链接期导出。链接期是将多个目标文件进行链接,生成共享库文件。在链接过程中,通过链接选项,指定可导出的符号最终是否可以导出。如果编译期生成的目标文件的某个符号可导出,那么可以链接选项将其更改为不可导出。但是,如果目标文件中的某个符号已经是不可导出,那么也无法将其更改为可导出。8.从以上可以看出,通过共享库的构建工具,进行符号导出时,需要大量的人工操作,极易引入错误,维护性差,并且,该共享库的构建工具限制源文件、编译期、链接期指定为不可导出的符号不能被导出,可导致部分必需的符号不能被导出,同时,这也会导致共享库中出现更多的冗余导出的符号,增大共享库的体积。技术实现要素:9.本公开提供一种共享库处理方法、装置、电子设备及存储介质,以至少解决相关技术中必需符号不能被导出以及共享库导出符号冗余的问题。本公开的技术方案如下:10.根据本公开实施例的第一方面,提供一种共享库处理方法,包括:11.确定第一目标文件集合,所述第一目标文件集合是多个第一共享库文件共同包含的目标文件的集合,所述第一共享库文件中包含多个目标文件,所述目标文件是对源文件进行编译得到的,所述目标文件中包含所使用的符号以及所述符号的导出标识,所述导出标识用于标识所述符号是否可导出;12.确定每个所述第一共享文件库对应的第二目标文件集合,所述第二目标文件集合是所述第一共享库文件去除所述共同包含的目标文件得到的;13.基于各所述第二目标文件集合,进行符号分析,以得到目标符号集合,其中,所述目标符号集合中包含未被所述第二目标文件集合中所包含的任一所述目标文件定义的符号;14.当所述第一目标文件集合所包含的所述目标文件所使用且定义的符号存在于所述目标符号集合中时,确定该符号的导出标识为可导出。15.在一种可能的实施方式中,所述基于各所述第二目标文件集合,进行符号分析,以得到目标符号集合步骤包括:16.对所述第二目标文件集合进行符号分析,以得到所述第二目标文件集合对应的第一候选符号集合,所述第一候选符号集合中包含未被所述第二目标文件集合中所包含的任一所述目标文件定义的符号;17.对各所述第二目标文件集合对应的所述第一候选符号集合取并集,以得到所述目标符号集合。18.在一种可能的实施方式中,所述对所述第二目标文件集合进行符号分析,以得到所述第二目标文件集合对应的第一候选符号集合步骤包括:19.对所述第二目标文件集合中所包含的各所述目标文件,获取各所述目标文件中所包含的所述目标文件定义的符号,以得到第二候选符号集合,以及获取各所述目标文件中所包含的所述目标文件未定义的符号,以得到第三候选符号集合;20.对所述第三候选符号集合与所述第二候选符号集合取差集,以得到所述第一候选符号集合。21.在一种可能的实施方式中,所述确定第一目标文件集合步骤包括:22.从所述第一共享库文件中解析出所述第一共享库文件中所包含的各所述目标文件,以得到所述第一共享库文件对应的第三目标文件集合;23.对所有的所述第三目标文件集合取交集,以得到所述第一目标文件集合。24.在一种可能的实施方式中,所述第一共享库文件是基于多个输入文件链接生成的,所述多个输入文件包括所述目标文件和/或静态库文件,所述静态库文件中包含多个所述目标文件,所述从所述第一共享库文件中解析出所述第一共享库文件中所包含的各所述目标文件,以得到所述第一共享库文件对应的第三目标文件集合步骤包括:25.遍历所述多个输入文件中的每个所述输入文件,当所述输入文件为所述目标文件时,将所述输入文件添加至所述第三目标文件集合,当所述输入文件为所述静态库文件时,将所述静态库文件中所包含的所述目标文件解析出来,并添加至所述第三目标文件集合。26.在一种可能的实施方式中,所述方法还包括:27.基于导出结果,将所述第一目标文件集合中所包含的各所述目标文件链接生成第二共享库文件,以及将所述第二目标文件集合中所包含的各所述目标文件链接生成第三共享库文件,其中,所述第三共享库文件依赖于所述第二共享库文件。28.根据本公开实施例的第二方面,提供一种共享库处理装置,包括:29.第一确定单元,被配置为执行确定第一目标文件集合,所述第一目标文件集合是多个第一共享库文件共同包含的目标文件的集合,所述第一共享库文件中包含多个目标文件,所述目标文件是对源文件进行编译得到的,所述目标文件中包含所使用的符号以及所述符号的导出标识,所述导出标识用于标识所述符号是否可导出;30.第二确定单元,被配置为执行确定每个所述第一共享文件库对应的第二目标文件集合,所述第二目标文件集合是所述第一共享库文件去除所述共同包含的目标文件得到的;31.符号分析单元,被配置为执行基于各所述第二目标文件集合,进行符号分析,以得到目标符号集合,其中,所述目标符号集合中包含未被所述第二目标文件集合中所包含的任一所述目标文件定义的符号;32.第三确定单元,被配置为执行当所述第一目标文件集合所包含的所述目标文件所使用且定义的符号存在于所述目标符号集合中时,确定该符号的导出标识为可导出。33.在一种可能的实施方式中,所述符号分析单元,具体被配置为执行:34.对所述第二目标文件集合进行符号分析,以得到所述第二目标文件集合对应的第一候选符号集合,所述第一候选符号集合中包含未被所述第二目标文件集合中所包含的任一所述目标文件定义的符号;35.对各所述第二目标文件集合对应的所述第一候选符号集合取并集,以得到所述目标符号集合。36.在一种可能的实施方式中,所述符号分析单元,具体被配置为执行:37.对所述第二目标文件集合中所包含的各所述目标文件,获取各所述目标文件中所包含的所述目标文件定义的符号,以得到第二候选符号集合,以及获取各所述目标文件中所包含的所述目标文件未定义的符号,以得到第三候选符号集合;38.对所述第三候选符号集合与所述第二候选符号集合取差集,以得到所述第一候选符号集合。39.在一种可能的实施方式中,所述第一确定单元,具体被配置为执行:40.从所述第一共享库文件中解析出所述第一共享库文件中所包含的各所述目标文件,以得到所述第一共享库文件对应的第三目标文件集合;41.对所有的所述第三目标文件集合取交集,以得到所述第一目标文件集合。42.在一种可能的实施方式中,所述第一共享库文件是基于多个输入文件链接生成的,所述多个输入文件包括所述目标文件和/或静态库文件,所述静态库文件中包含多个所述目标文件,所述第一确定单元,具体被配置为执行:43.遍历所述多个输入文件中的每个所述输入文件,当所述输入文件为所述目标文件时,将所述输入文件添加至所述第三目标文件集合,当所述输入文件为所述静态库文件时,将所述静态库文件中所包含的所述目标文件解析出来,并添加至所述第三目标文件集合。44.在一种可能的实施方式中,所述装置还包括:45.链接生成单元,被配置为执行基于导出结果,将所述第一目标文件集合中所包含的各所述目标文件链接生成第二共享库文件,以及将所述第二目标文件集合中所包含的各所述目标文件链接生成第三共享库文件,其中,所述第三共享库文件依赖于所述第二共享库文件。46.根据本公开实施例的第三方面,提供一种电子设备,包括:47.处理器;48.用于存储处理器可执行指令的存储器;49.其中,处理器被配置为执行指令,以实现如第一方面任一的共享库处理方法。50.根据本公开实施例的第四方面,提供一种存储介质,当所述存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行如第一方面中任一的共享库处理方法。51.根据本公开实施例的第五方面,提供一种计算机程序产品,包括计算机指令,当计算机指令被电子设备执行时,实现如第一方面中任一的共享库处理方法。52.本公开的实施例提供的技术方案至少带来以下有益效果:首先,确定出第一目标文件集合,该第一目标文件集合是多个第一共享库文件共同包含的目标文件的集合,这些可以作为公共代码,从而实现了公共代码的自动提取,其次,确定出每个共享库文件对应的第二目标文件集合,该第二目标文件集合是去除了上述共同包含的目标文件得到的,也就是说,第二目标文件集合是去除冗余后的目标文件集合,从而实现了公共代码的自动剥离,再次,基于各第二目标文件集合,进行符号分析,以得到目标符号集合,该目标符号集合包含的是未被第二目标文件集合中所包含的任一目标文件定义的符号,对第二目标文件集合来说,都是外部符号,可能来自剥离出的公共代码,即第一目标文件集合,对于第一目标文件集合中的目标文件来说,如果该目标文件中使用且定义的符号存在于目标符号集合中,说明该第一符号可能是第二目标文件集合用到的外部符号,所以需要导出,如此,得到了公共代码需要导出的符号,实现了公共代码的符号的自动导出。如此,本方案实现了对多个共享库文件的进一步自动拆分,避免了共享库的冗余,提高了处理效率、准确性和维护性,并且在拆分过程中自动进行符号的导出。与相关技术中的方案相比,本方案提供了自动导出需要导出的符号的逻辑,避免了相关技术中共享库的构建工具该共享库的构建工具限制源文件、编译期、链接期指定为不可导出的符号不能被导出,导致部分可需的符号不能被导出的问题。另外,本方案中的自动导出符号的方式,能够更加准确地进行必需的符号的导出,避免符号导出过多造成冗余,便于后续建立链接库依赖的正确和完整性,保证共享库运行。53.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。附图说明54.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理,并不构成对本公开的不当限定。55.图1是根据一示例性实施例示出的一种共享库处理方法的流程图。56.图2是根据一示例性实施例示出的一种共享库的结构图。57.图3是根据一示例性实施例示出的一种符号分析的示意图。58.图4是根据一示例性实施例示出的一种共享库处理装置的框图。59.图5是根据一示例性实施例示出的一种装置的框图。具体实施方式60.为了使本领域普通人员更好地理解本公开的技术方案,下面将结合附图,对本公开实施例中的技术方案进行清楚、完整地描述。61.需要说明的是,本公开的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本公开的实施例能够以除了在这里图示或描述的那些以外的顺序实施。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。62.图1是根据一示例性实施例示出的一种共享库处理方法的流程图,如图1所示,该共享库处理方法用于计算机等电子设备中,包括以下步骤。63.在步骤s11中,确定第一目标文件集合,第一目标文件集合是多个第一共享库文件共同包含的目标文件的集合,第一共享库文件中包含多个目标文件,目标文件是对源文件进行编译得到的,目标文件中包含所使用的符号以及符号的导出标识,导出标识用于标识符号是否可导出。64.实际应用中,多个第一共享库文件是待拆分处理的存在冗余的现象的共享库文件。每个第一共享库文件中包含多个对源文件进行编译得到的目标文件。举例来说,第一共享库文件f1中包括目标文件f1和目标文件f2,第一共享库文件f2中包括目标文件f1和目标文件f3,第一共享库文件f1和第一共享库文件f2中均包含目标文件f1,此时,存在冗余的现象,需要进行拆分处理。通过本步骤,确定所有的带来冗余的现象的目标文件,即确定第一目标文件集合,这些可以作为公共代码,从而实现了公共代码的提取。仍以第一共享库文件f1和第一共享库文件f2举例,第一共享库文件f1和第一共享库文件f2中均包含目标文件f1,那么,目标文件f1即由以上两个第一共享库文件共同包含的目标文件,可以作为第一目标文件集合的一个元素。65.在步骤s12中,确定每个第一共享文件库对应的第二目标文件集合,第二目标文件集合是第一共享库文件去除共同包含的目标文件得到的。66.本步骤中的第二目标文件集合是第一共享库文件去除上述共同包含的目标文件得到的,也即不包含带来冗余的现象的目标文件,从而实现了对第一共享库文件的公共代码的剥离。仍以第一共享库文件f1和第一共享库文件f2举例,第一共享库文件f1和第一共享库文件f2中的目标文件f1存在于第一目标文件集合中,那么,经去除后,第一共享库文件f1对应的第二目标文件集合和第一共享库文件f2对应的第二目标文件集合中,都不再包含目标文件f1。67.在步骤s13中,基于各第二目标文件集合,进行符号分析,以得到目标符号集合,其中,目标符号集合中包含未被第二目标文件集合中所包含的任一目标文件定义的符号。68.实际应用中,拆分共享库时,需要将剥离出来的公共代码中的相关符号导出,以便其它共享库调用,因此,需要分析出这些符号。对于第二目标文件集合来说,第二目标文件集合中使用的且被第二目标文件集合中所包含的某个目标文件定义的符号,可以称为第二目标文件集合的内部符号,第二目标文件集合中使用的但是未被第二目标文件集合所包含的任一目标文件定义的符号,是来自第二目标文件集合的外部的符号,也称第二目标文件集合的外部符号,对这些第二目标文件集合来说,这些外部符号,可能来自剥离出的公共代码,即第一目标文件集合。69.在步骤s14中,当第一目标文件集合所包含的目标文件所使用且定义的符号存在于目标符号集合中时,确定该符号的导出标识为可导出。70.对于第一目标文件集合中的目标文件来说,如果该目标文件中所使用且定义的第一符号存在于目标符号集合中,说明该第一符号可能是第二目标文件集合用到的外部符号,所以需要导出,如此,得到了公共代码需要导出的符号。71.本实施例中,首先,确定出第一目标文件集合,该第一目标文件集合是多个第一共享库文件共同包含的目标文件的集合,这些可以作为公共代码,从而实现了公共代码的自动提取,其次,确定出每个共享库文件对应的第二目标文件集合,该第二目标文件集合是去除了上述共同包含的目标文件得到的,也就是说,第二目标文件集合是去除冗余后的目标文件集合,从而实现了公共代码的自动剥离,再次,基于各第二目标文件集合,进行符号分析,以得到目标符号集合,该目标符号集合包含的是未被第二目标文件集合中所包含的任一目标文件定义的符号,对第二目标文件集合来说,都是外部符号,可能来自剥离出的公共代码,即第一目标文件集合,对于第一目标文件集合中的目标文件来说,如果该目标文件中使用且定义的符号存在于目标符号集合中,说明该第一符号可能是第二目标文件集合用到的外部符号,所以需要导出,如此,得到了公共代码需要导出的符号,实现了公共代码的符号的自动导出。如此,本方案实现了对多个共享库文件的进一步自动拆分,避免了共享库的冗余,提高了处理效率、准确性和维护性,并且在拆分过程中自动进行符号的导出。与相关技术中的方案相比,本方案提供了自动导出需要导出的符号的逻辑,避免了相关技术中共享库的构建工具该共享库的构建工具限制源文件、编译期、链接期指定为不可导出的符号不能被导出,导致部分可需的符号不能被导出的问题。另外,本方案中的自动导出符号的方式,能够更加准确地进行必需的符号的导出,避免符号导出过多造成冗余,便于后续建立链接库依赖的正确和完整性,保证共享库运行。72.在示例性实施例中,上述共享库处理方法还可以包括:基于导出结果,将第一目标文件集合中所包含的各目标文件链接生成第二共享库文件,以及将第二目标文件集合中所包含的各目标文件链接生成第三共享库文件,其中,第三共享库文件依赖于第二共享库文件。73.其中,得到的第三共享库文件即去除冗余后的新的共享库文件,第二共享库文件即各第三共享库文件对应的外部的公共共享库文件,各第二共享库文件可以调用该公共共享库文件中的目标文件。74.本实施例中,基于导出结果,将第一目标文件集合中所包含的各目标文件链接生成作为公共共享库文件的第二共享库文件,以及将第二目标文件集合中所包含的各目标文件链接生成去除冗余后的第三共享库文件,形成了体积更小的共享库文件,减少了冗余,减小了计算机程序运行时所消耗的内存。75.实际应用中,可以通过链接器进行链接,链接时,可以指定第三共享库文件依赖第二共享库文件,链接器对目标文件集合的目标文件中用到的符号进行分析,如果用到的符号在目标文件集合的所有目标文件中都找不到,那么会到链接时指定的外部共享库文件中查找,如果外部的共享库文件中也找不到,那么链接会失败。76.在示例性实施例中,上述确定第一目标文件集合步骤具体实现方式可以包括:从第一共享库文件中解析出第一共享库文件中所包含的各目标文件,以得到第一共享库文件对应的第三目标文件集合;对所有的第三目标文件集合取交集,以得到第一目标文件集合。77.实际应用中,面对多个第一共享库文件,可以单独得到每个第一共享库文件对应的第三目标文件集合,然后取交集,交集的部分是这些第一共享库文件所共有的,如果交集不为空,说明这些共享库文件之间有冗余的目标文件,如此,可以将所有的冗余的目标文件快速分析出来,得到多个第一共享库文件的公共代码。78.当然,也可以通过其它方式得到第一目标文件集合,例如可以针对每个第一共享文件库进行如下处理:对第一共享文件库中的每个目标文件,判断该目标文件是否存在于其它各第一共享库文件中,如果存在,将该目标文件添加至第一目标文件集合。79.在示例性实施例中,第一共享库文件是基于多个输入文件链接生成的。多个输入文件可以包括目标文件和/或静态库文件。该静态库文件中可以包含多个目标文件。80.实际应用中,在构建共享库时,还会出现另外一种中间产物:静态库,后缀名可以为“.a”。静态库只是一个容器,简单的把多个目标文件打包到一个文件中,也称静态库文件,在链接过程中,可以和目标文件一起链接生成最终的共享库文件,链接更加方便。因此,在生成共享库的输入文件可以是目标文件,也可以是静态库文件。81.举例来说,如图2所示,生成共享库文件liba.so的输入文件,不仅包括目标文件a.o和目标文件b.o,还包括静态库文件c.a和静态库文件d.a,其中,静态库文件c.a是由目标文件c1.o和目标文件c2.o打包得到的,静态库文件d.a是由目标文件d1.o和目标文件d2.o打包得到的。82.相应的,从第一共享库文件中解析出第一共享库文件中所包含的各目标文件,以得到第一共享库文件对应的第三目标文件集合步骤具体可以包括:遍历多个输入文件中的每个输入文件,当输入文件为目标文件时,将输入文件添加至第三目标文件集合,当输入文件为静态库文件时,将静态库文件中所包含的目标文件解析出来,并添加至第三目标文件集合。83.在示例性实施例中,基于各第二目标文件集合,进行符号分析,以得到目标符号集合步骤具体可以包括:对第二目标文件集合进行符号分析,以得到第二目标文件集合对应的第一候选符号集合,第一候选符号集合中包含未被第二目标文件集合中所包含的任一目标文件定义的符号;对各第二目标文件集合对应的第一候选符号集合取并集,以得到目标符号集合。实际应用中,可以针对每个第二目标文件集合单独进行分析,得到各自的外部符号,将这些符号合并,即快速得到所有可能来自公共代码的外部符号,即目标符号集合。84.在示例性实施例中,对第二目标文件集合进行符号分析,以得到第二目标文件集合对应的第一候选符号集合步骤具体可以包括:对第二目标文件集合中所包含的各目标文件,获取各目标文件中所包含的目标文件定义的符号,以得到第二候选符号集合,以及获取各目标文件中所包含的目标文件未定义的符号,以得到第三候选符号集合;对第三候选符号集合与第二候选符号集合取差集,以得到第一候选符号集合。85.其中,对第三候选符号集合与第二候选符号集合取差集是指第三候选符号集合减去第二候选符号集合得到的差集。86.实际应用中,对于第二目标文件集合来说,如果一个目标文件定义的符号,是本集合中另外一个目标文件使用但未定义的符号,那么这个符号对于本集合整体来说仍然是内部符号,如果一个目标文件使用但未定义的符号,在本集合找不到,也即整个集合都未定义,那么,这个符号对于本集合整体来说是外部符号,即对第三候选符号集合和第二候选符号集合取差集得到的第一候选符号集合,均为整个集合的外部符号。如此,可以快速准确地分析出第一候选符号集合。87.当然,也可以通过其它方式得到上述第一候选符号集合,例如,对第二目标文件集合中所包含的各目标文件,获取各目标文件的符号,以得到第四候选符号集合,以及获取各目标文件中所包含的各定义的符号,以得到第五候选符号集合,对第四候选符号集合与第五候选符号集合取差集(即第四候选符号集合减去第五候选符号集合得到的差集),以得到第一候选符号集合。如此,将第四候选符号集合中所有的符号中定义的符号减去,剩余的都是未定义的符号,即外部符号。88.在示例性实施例中,基于各第二目标文件集合,进行符号分析,以得到目标符号集合步骤具体可以包括:对所有第二目标文件集合中所包含的各目标文件,获取各目标文件的符号,以得到第六候选符号集合,以及获取各目标文件中所包含的各定义的符号,以得到第七候选符号集合,对第六候选符号集合与第七候选符号集合取差集(即第六候选符号集合减去第七候选符号集合得到的差集),以得到目标符号集合。如此,将所有第二目标文件集合中所有的符号中定义的符号减去,剩余的都是未定义的符号,即外部符号。89.下面以两个第一共享库文件的拆分场景为例,对本公开实施例提供的一种共享库处理方法进行更加详细地说明。90.本实施例的技术方案由两部分组成:公共代码查找和公共代码的符号导出。91.第一部分、公共代码查找。92.实际应用中,采用的共享库文件的基本构建流程如下:93.首先,将源文件(例如c或者c++源文件)进行编译,生成目标文件,后缀名为“.o”。目标文件是一种可执行可链接(elf,executableandlinkingformat)格式的文件,在可移植操作系统接口(posix,portableoperatingsysteminterface)中广泛使用,除目标文件外,可执行的二进制文件、共享库文件都可以是这种文件格式。94.然后,将多个目标文件进行链接,生成共享库文件,后缀名为“.so”。在链接过程中,链接器对目标文件中使用到的符号进行分析,如果用到的符号在所有目标文件中都找不到,那么会到链接时指定的外部共享库中查找,如果外部的共享库中也找不到,那么链接会失败。95.本实施例中,通过以上共享库文件的基本构建流程,得到了两个第一共享库文件:libx.so和liby.so,如果两个第一共享库文件存在冗余的现象,可以对两个第一共享库文件libx.so和liby.so进行拆分,查找公共代码的流程如下:96.第一步、遍历第一共享库文件libx.so的输入文件集合(即上述多个输入文件),如果输入文件是目标文件,直接归入(即添加)目标文件集合a(即上述第三目标文件集合),如果输入文件是静态库文件,那么解析静态库文件得到目标文件集合,即静态库文件所包含的多个目标文件,并归入目标文件集合a。97.第二步、遍历第一共享库文件liby.so的输入文件集合,如果输入文件是目标文件,直接归入目标文件集合b(即上述第三目标文件集合),如果是静态库文件,那么解析静态库文件得到目标文件集合,并归入目标文件集合b。98.第三步、对目标文件集合a和目标文件集合b的取交集,得到目标文件集合c(即上述第一目标文件集合),该目标文件集合c用来链接生成公共共享库libz.so(即上述第二共享库文件)。99.第四步、对目标文件集合a与目标文件集合c取差集,形成新的目标文件集合a’(即上述第二目标文件集合),目标文件集合a’中的目标文件用来链接生成剥离公共代码之后的新的共享库libx.so(即上述第三共享库文件),并且新的libx.so依赖libz.so。100.第五步、对目标文件集合b和目标文件集合c取差集,形成新的目标文件集合b’(即上述第二目标文件集合),目标文件集合b’中的目标文件用来链接生成剥离公共代码之后的新的共享库liby.so(即上述第三共享库文件),并且新的liby.so依赖libz.so。101.第二部分、公共代码的符号导出。102.目标文件中存储了内部定义的符号信息,和未定义但是使用的外部符号信息。此外,目标文件中还存储了符号是否可导出的标识,即导出标识。还是以上面的两个第一共享库文件libx.so和liby.so为例,公共代码的符号导出流程如下:103.第一步、提取目标文件集合a’中的外部符号。遍历目标文件集合a’中的每一个目标文件,如图3所示,提取目标文件定义的符号,放入符号集合a1(即上述第二候选符号集合),其中s1,s2,s3,s4是符号集合a1中的元素,提取目标文件使用但未定义的符号,放入符号集合a2(即上述第三候选符号集合),s3,s4,s5,s6是符号集合a2中的元素。如果一个目标文件使用但未定义的符号,是目标文件集合a’中另外一个目标文件定义的符号,那么这个符号对于目标文件集合a’整体来说仍然是内部符号(即这个符号同时存在于符号集合a1和a2中);如果一个目标文件使用但未定义的符号,在目标文件集合a2中找不到,那么这个符号对于目标文件集合a’整体来说是外部符号。取符号集合a2和符号集合a1的差集a3,为目标文件集合a’的外部符号集合(即上述第一候选符号集合),s5,s6是符号集合a3中的元素。104.第二步、提取目标文件集合b’中的外部符号。遍历目标文件集合b’中的每一个目标文件,提取目标文件定义的符号,放入符号集合b1(即上述第二候选符号集合),提取目标文件使用但未定义的符号,放入符号集合b2(即上述第三候选符号集合)。如果一个目标文件使用但未定义的符号,是目标文件集合b’中另外一个目标文件定义的符号,那么这个符号对于符号集合b’整体来说仍然是内部符号(即这个符号同时存在于符号集合b1和b2中);如果一个目标文件使用但未定义的符号,在符号集合b2中找不到,那么这个符号对于目标文件集合b’整体来说是外部符号。取符号集合b3和符号集合b1的差集b3,为目标文件集合b’的外部符号集合(即上述第一候选符号集合)。符号集合b3生成的过程可以参见上面a3生成的流程图。105.第三步、取符号集合a3和符号集合b3的并集,得到符号集合c3(即上述目标符号集合)。公共共享库对外导出的符号集合是符号集合c3的子集,因为符号集合c3中的一些符号是由操作系统提供的,公共代码中没有这些符号。106.第四步、遍历目标文件集合c中的每一个目标文件,提取目标文件定义的符号,如果该符号在符号集合c3中,那么确定该符号的导出标识为可导出,此时,可以修改该符号的导出标识为可导出,如果该符号不在符号集合c3中,可以不做修改。107.第五步、将目标文件集合c中的目标文件链接生成公共共享库libz.so(即上述第二共享库文件)。108.第六步、将目标文件集合a’中的文件链接生成libx.so(即上述第三共享库文件),并通过链接选项指定libx.so依赖libz.so。109.第七步、将目标文件集合b’中的文件链接生成liby.so(即上述第三共享库文件),并通过链接选项指定liby.so依赖libz.so。110.本公开实施例提供的技术方案,可以提取多个共享库的公共代码,形成公共共享库,减少了每个共享库的大小,同时还会减少运行时的内存消耗。对采用公开的方案得到的共享库的应用程序安装包来说,减小了程序安装包的大小,提高用户在下载程序安装包过程中的成功率。111.图4是根据一示例性实施例示出的一种共享库处理装置框图。参照图4,该装置400包括第一确定单元401,第二确定单元402,符号分析单元403和第三确定单元404。112.第一确定单元401,被配置为执行确定第一目标文件集合,第一目标文件集合是多个第一共享库文件共同包含的目标文件的集合,第一共享库文件中包含多个目标文件,目标文件是对源文件进行编译得到的,目标文件中包含所使用的符号以及符号的导出标识,导出标识用于标识符号是否可导出;113.第二确定单元402,被配置为执行确定每个第一共享文件库对应的第二目标文件集合,第二目标文件集合是第一共享库文件去除共同包含的目标文件得到的;114.符号分析单元403,被配置为执行基于各第二目标文件集合,进行符号分析,以得到目标符号集合,其中,目标符号集合中包含未被第二目标文件集合中所包含的任一目标文件定义的符号;115.第三确定单元404,被配置为执行当第一目标文件集合所包含的目标文件所使用且定义的符号存在于目标符号集合中时,确定该符号的导出标识为可导出。116.在一种可能的实施方式中,符号分析单元,具体被配置为执行:117.对第二目标文件集合进行符号分析,以得到第二目标文件集合对应的第一候选符号集合,第一候选符号集合中包含未被第二目标文件集合中所包含的任一目标文件定义的符号;118.对各第二目标文件集合对应的第一候选符号集合取并集,以得到目标符号集合。119.在一种可能的实施方式中,符号分析单元,具体被配置为执行:120.对第二目标文件集合中所包含的各目标文件,获取各目标文件中所包含的目标文件定义的符号,以得到第二候选符号集合,以及获取各目标文件中所包含的目标文件未定义的符号,以得到第三候选符号集合;121.对第三候选符号集合与第二候选符号集合取差集,以得到第一候选符号集合。122.在一种可能的实施方式中,第一确定单元,具体被配置为执行:123.从第一共享库文件中解析出第一共享库文件中所包含的各目标文件,以得到第一共享库文件对应的第三目标文件集合;124.对所有的第三目标文件集合取交集,以得到第一目标文件集合。125.在一种可能的实施方式中,第一共享库文件是基于多个输入文件链接生成的,多个输入文件包括目标文件和/或静态库文件,静态库文件中包含多个目标文件,第一确定单元,具体被配置为执行:126.遍历多个输入文件中的每个输入文件,当输入文件为目标文件时,将输入文件添加至第三目标文件集合,当输入文件为静态库文件时,将静态库文件中所包含的目标文件解析出来,并添加至第三目标文件集合。127.在一种可能的实施方式中,上述装置还可以包括:128.链接生成单元,被配置为执行基于导出结果,将第一目标文件集合中所包含的各目标文件链接生成第二共享库文件,以及将第二目标文件集合中所包含的各目标文件链接生成第三共享库文件,其中,第三共享库文件依赖于第二共享库文件。129.关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。130.图5是根据一示例性实施例示出的一种用于共享库处理的装置500的框图。例如,装置500可以被提供为一电子设备。参照图5,装置500包括处理组件522,其进一步包括一个或多个处理器,以及由存储器532所代表的存储器资源,用于存储可由处理组件522的执行的指令,例如应用程序。存储器532中存储的应用程序可以包括一个或一个以上的每一个对应于一组指令的模块。此外,处理组件522被配置为执行指令,以执行上述共享库处理方法。131.装置500还可以包括一个电源组件526被配置为执行装置500的电源管理,一个有线或无线网络接口550被配置为将装置500连接到网络,和一个输入输出(i/o)接口558。装置500可以操作基于存储在存储器532的操作系统,例如windowsservertm,macosxtm,unixtm,linuxtm,freebsdtm或类似。132.在示例性实施例中,还提供了一种包括指令的存储介质,例如包括指令的存储器532,上述指令可由装置500的处理器执行以完成上述共享库处理方法。可选地,存储介质可以是非临时性计算机可读存储介质,例如,所述非临时性计算机可读存储介质可以是rom、随机存取存储器(ram)、cd‑rom、磁带、软盘和光数据存储设备等。133.在示例性实施例中,还提供了一种计算机程序产品,该计算机程序产品包括计算机指令,该计算机指令可由装置500的处理器执行以完成上述共享库处理方法。可选地,该计算机指令可以存储在装置500的存储介质中,该存储介质可以是非临时性计算机可读存储介质,例如,所述非临时性计算机可读存储介质可以是rom、随机存取存储器(ram)、cd‑rom、磁带、软盘和光数据存储设备等。134.本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本技术旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本
技术领域
:中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。135.应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1