一种用于处理应用程序的内容表访问溢出的方法和系统的制作方法

文档序号:6429879阅读:177来源:国知局
专利名称:一种用于处理应用程序的内容表访问溢出的方法和系统的制作方法
技术领域
本发明涉及应用程序的处理,尤其涉及一种用于处理应用程序中的内容表(TOC)访问溢出的方法和系统。
背景技术
用于AIX和Linux的POWER系统是IBM服务器系列的主要产品,其中,工具链的易用性(tools chain usability)和性能是在POWER系统上进行开发的一个很重要的基础。对于POWER系统来说,在对应用程序进行构建的过程中,存在一个被称为“T0C溢出(overflow) ”的问题,该TOC溢出会限制全局数据/代码的使用,常常为POWER系统开发人员带来很大的不便。

发明内容
本发明希望提供一种新的方案来处理应用程序构建中出现的TOC溢出问题。依据本发明的一个实施例,提供了一种用于处理应用程序的方法,包括对应用程序的源文件进行编译,以产生与源文件对应的目标文件;对编译产生的目标文件进行链接,以确定目标文件中的TOC访问是否存在溢出;响应于目标文件中的TOC访问存在溢出,对所述TOC访问存在溢出的目标文件所对应的源文件进行再次编译,以产生没有TOC溢出的目标文件;以及,用再次编译产生的没有TOC溢出的目标文件替换所述TOC访问存在溢出的目标文件,并对目标文件进行再次链接。依据本发明的另一个实施例,提供了一种用于处理应用程序的系统,包括编译器,被配置为对应用程序的源文件进行编译,以产生与源文件对应的目标文件;链接器,被配置为对编译产生的目标文件进行链接,其中,所述链接器进一步被配置为确定所述目标文件中的TOC访问是否存在溢出;所述编译器进一步被配置为响应于目标文件中的TOC访问存在溢出,对TOC访问存在溢出的目标文件所对应的源文件进行再次编译,以产生没有TOC溢出的目标文件;以及,所述链接器进一步被配置为用再次编译产生的没有TOC溢出的目标文件替换TOC访问存在溢出的目标文件,并对目标文件进行再次链接。本发明通过采用两轮编译,仅对确实存在TOC溢出的TOC表项才产生两条指令形式的双指令TOC访问。因此,该方案具有很好的易用性,并且降低了性能损失。


通过对附图中本发明示例实施例方式的更详细描述,本发明的上述、以及其它目的、特征和优势将变得更加明显。图I示出了适于用来实现本发明实施方式的示例性计算系统100的框图。图2示出了一个TOC访问的示意图。图3示出了一个TOC溢出的示意图。图4示出了依据本发明的一个实施例的用于处理TOC溢出的方法的流程图。
图5示出了依据本发明的另一个实施例的用于处理TOC溢出的过程的示意图。图6不出了一个溢出符号列表的不意图。图7示出了依据本发明的一个实施例的用于处理TOC溢出的系统700的方框图。
具体实施例方式以下参照按照本发明实施例的方法、系统描述本发明。其中,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机程序指令实现。这些计算机程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器,从而生产出一种机器,使得通过计算机或其它可编程数据处理装置执行的这些指令,产生实现流程图和/或框图中的方框中规定的功能/操作的装置(means)。也可以把这些计算机程序指令存储在能指令计算机或其它可编程数据处理装置以特定方式工作的计算机可读介质中,这样,存储在计算机可读介质中的指令产生一个包括实现流程图和/或框图中的方框中规定的功能/操作的指令装置(instruction means) 的制造品。还可以把计算机程序指令加载到计算机或其它可编程数据处理装置上,使得在计算机或其它可编程数据处理装置上执行一系列操作步骤,以产生计算机实现的过程,从而在计算机或其它可编程装置上执行的指令就提供实现流程图和/或框图中的方框中规定的功能/操作的过程。图I示出了适于用来实现本发明实施方式的示例性计算系统100的框图。如所示,计算机系统100可以包括CPU(中央处理单元)101、RAM(随机存取存储器)102、R0M(只读存储器)103、系统总线104、硬盘控制器105、键盘控制器106、串行接口控制器107、并行接口控制器108、显示控制器109、硬盘110、键盘111、串行外部设备112、并行外部设备113和显示器114。在这些设备中,与系统总线104耦合的有CPU10URAM 102,ROM 103、硬盘控制器105、键盘控制器106、串行控制器107、并行控制器108和显示控制器109。硬盘110与硬盘控制器105耦合,键盘111与键盘控制器106耦合,串行外部设备112与串行接口控制器107耦合,并行外部设备113与并行接口控制器108耦合,以及显示器114与显示控制器109耦合。应当理解,图I所述的结构框图仅仅为了示例的目的而示出的,而不是对本发明范围的限制。在某些情况下,可以根据具体情况而增加或者减少某些设备。在参考附图具体描述依据本发明的实施例之前,下面先对本发明所涉及的一些术语进行如下介绍。IBM POWER的硬件指令IBM POWER硬件支持用偏移指令加载/存储。例如,“L RT, offet (RA) ”表示从地址“offset+RA”加载到寄存器RT。“offset”是介于_2~ 15和2~ 15之间的一个立即数。TOC (内容表)AIX 的 ABI (Application Binary Interface 应用程序二进制接口)和 64 位的Linux限定了 T0C,该内容表实际上是存储器中分配的一个部分。所有的全局变量和函数指针的地址被放入该TOC中,必须通过地址来访问。TOC 访问通常,使用一条加载指令来进行TOC地址访问。TOC表存有数据和函数的地址,图2示出了一个TOC访问的示意图,其中,基址寄存器R2指向TOC表的中心位置。对数据的访问必须通过TOC表得到数据地址,然后根据地址完成数据访问。例如,当使用全局变量A2时,编译器必须首先通过访问TOC :“L R3,offset_of_A2 (R2) ”来加载A的地址。R2是TOC的基地址,offset_of_A2 (R2)是TOC中的TOC表项A2的偏移。这里需要注意的是,TOC表项存储的是A2的地址,而不是A2的值。然后,编译器使用另一条加载指令来获得值A2 :“L R4,R3”。需要注意的是,寄存器R3仅在最近一次TOC访问时获得A2的地址。以图2所示的TOC表为例,如果要访问数据"A2",首先通过符号"A2"在TOC表中的偏移位置(+800)和基址寄存器R2 (T0C表基地址),计算出"A2 "在TOC表中的位置,并读取"A2"的地址,可以通过指令"L0ADR3,800(R2)"完成这步操作。运行该指令后在寄存器R3存放"A2"的地址。之后,使用该地址再次访问存储器中的数据空间,得到所需要的数据。
如图2所示,TOC表除了可以用于A1,A2等数据之外,也可以存放f00l,f002等函数的地址。并且,同样,如果要调用函数fool,则需要通过fool在TOC表中的偏移位置和基址寄存器R2,计算出fool在TOC表中的位置,并读取fool的地址,之后,使用该地址访问存储器中的代码空间,从而调用该函数。链接器的重定位(LinkerRelocation)在编译时,并不创建T0C,编译器并不知晓TOC表项的偏移。例如,在上面的例子中,“0ffset_0f_A”是未知的,编译器必须在指令中产生一个特别的标签。在链接时,链接器收集TOC的所有信息,此时偏移是可以计算出来的。在上面的例子中,计算出“0ffSet_0f_A”,将其值(例如10000)填充到指令中。这个过程被称为链接器的再定位。TOC 溢出TOC溢出发生在试图以很大的偏移访问TOC表项时,此时由于偏移很大,无法将偏移在一单个指令中以一个立即数的方式编码。对于64位的系统来说,地址是8字节的,意味着一个TOC表项(全局数据地址)要占用8个字节。如果TOC包含大于8192个表项(2 6/8 = 8192),则无法使用象“L R3,offset_of_A (R2) ”这样的一个单个的合法指令来加载所有TOC表项,因此有些表项的offset_of_A可能会大于+2~15 (或小于_2~15)。需要注意的是,编译器在编译时并不知道TOC的大小,因此如果编译器总是产生一个类似于“L R3,offset_of_A(R2) ”的单个指令来访问T0C,则会导致链接器对于某些指令无法完成再定位,这种现象被称为TOC溢出。图3示出了一个TOC溢出的示意图。其中,数据"A1001"的地址存于偏移为+2 5+1的TOC项,它的地址不能用一条LOAD指令取得,所以处于TOC溢出区域。已经存在着一些用来解决TOC溢出的已知方案。例如,一种可能的方案是,编译器总使用双指令 TOC 访问(two instruction TOC access)。在这种情况下,编译器产生一个用来访问大的TOC的双指令TOC访问,而不是仅使用一次指令加载来访问T0C。其可以使用如下所示的两条指令形式(I) CAU r3, r2, offset_up(2) L r3, offset_lo (r3)这是为32位偏移设计的。第一个指令加上高16位的偏移,第二个指令加上低16位的偏移,并加载。通过采用这种方式,可以确保不会发生TOC溢出。这种方式的缺陷是,由于编译器无法计算TOC表项的偏移,因此在这种解决方案中,编译器必须对于每一次TOC访问都产生双指令TOC访问。因此在没有溢出(偏移< 2~15)的情况下,对于这些TOC的访问不够高效。另一种可能的方案是,编译器产生一条加载指令TOC访问,即单指令TOC访问。在存在溢出的情况下,链接器对这些溢出进行修补(patch)。具体地,当链接器计算出TOC表项偏移,并发现存在TOC溢出时,链接器对代码进行如下修改
Lr3,offset(r2)
==>
B tx//替换 ”Lr3,offset(r2)"
retumx:Il跳转返回的标签
tx:
CAU r3,r2,offset—up//双指令 TOC 访问
L r3,offset_lo(r3)
B retumx在这个解决方案中链接器无法用双指令TOC访问形式来替换一次加载TOC访问的原因是,在链接器中修改代码大小是非常困难的。链接器必须使用一条指令("B tx")替换最初的单指令TOC访问(one load TOC ac_cess),来保证代码大小不变。然后,在代码尾部附加一段代码(分支目标)。这种方案的缺点是,这种修补需要额外的两个跳转("Btx"和"Breturnx"),而这种跳转会极大地损害运行时的性能。还有一种可能的方案是,如果TOC大小太大,IPA(Inter Procedure Analysis进程间分析)可以聚合(coalesce) TOC表项。IPA是链接时一个非常繁重的优化。IPA具有整个程序的所有信息,包括TOC信息。其会将TOC表项接合起来,避免溢出。这种方案的缺陷是,IPA非常耗时,其应用在很多种情况下都收到限制,特别是应用程序非常大的情况下。而这恰恰是TOC溢出容易发生的情况。其结果是,大多数商业客户不愿仅仅为了解决TOC溢出问题对大应用程序使用IPA。下面将参考图4描述依据本发明的一个实施例的用于处理TOC溢出的方法的流程图。在步骤S410,编译器接收应用程序的源文件,对该源文件进行编译,从而产生与源文件相对应的目标文件。这个编译的过程可以采用在该领域通用的编译方式。在步骤S420,链接器接收从编译器产生的目标文件,对该目标文件进行链接,并在链接过程中确定该目标文件中的TOC访问是否存在溢出。在步骤S430,如果确定目标文件中的TOC访问存在溢出,则编译器对存在TOC溢出的目标文件所对应的源文件进行再次编译。例如,在这个再次编译的过程中,由于已经知道了存在TOC溢出的目标文件,从而可以针对这些目标文件所对应的源文件,在编译的过程中来产生没有TOC溢出的TOC访问。由于这个再次编译的过程仅对TOC访问存在溢出的目标文件所对应的源文件进行,从而可以在确保在不发生TOC溢出的情况下,不会对性能造成不必要的影响。在步骤S440,用再次编译产生的没有TOC溢出的目标文件替换TOC访问存在溢出的目标文件,并对所述目标文件进行再次链接,从而产生该应用程序的可执行文件。图5示出了依据本发明的一个实施例的用于处理TOC溢出的过程的示意图。首先,编译器接收应用程序的源文件,对该源文件进行编译,从而产生与源文件相对应的目标文件。其中,这个编译过程采用通常的编译方法,产生使用一条加载指令 的TOC地址访问。例如,在AIX和Linux环境下,可以通过采用特定的选项、例如“-qpic = smart”来调用编译器,从而产生通常的TOC访问(一次加载形式)。并且,可以在目标文件“.comment”部分记录编译命令和编译环境,这与使用选项"-qsaveopt"类似。该信息可以用于在需要时调用第二轮编译。然后,链接器按照通常的程序检测目标程序中是否有符号(symbol)存在TOC溢出。如果没有TOC溢出,则整个构建过程结束,链接器输出应用程序的一个可执行文件。如果出现存在TOC溢出的符号,链接器则在一个溢出符号列表、例如"/tmp/foo"中记录溢出信息,该溢出信息可以是溢出符号/目标文件名,即TOC访问溢出的溢出符号以及包含所述溢出符号的目标文件的目标文件名。该溢出符号列表将用来为之后的第二轮编译提供输入。对于具有溢出符号的每个目标文件,链接器从目标文件“.comment”部分取出编译命令字符串,该编译命令是以字符串的形式保存在目标文件“.comment ”部分中的。对于每一个溢出目标文件,使用从目标文件读出的编译命令,并加上指定溢出符号列表文件的命令,构成最终调用编译器进行第二轮编译的命令。当设置了特定选项-qtocsymf (该命令用于指定溢出符号列表文件)时,编译器进行第二轮编译步骤。其中,编译器读取输入的TOC溢出符号列表文件,对应用程序的源文件进行编译。其中,对于不在溢出符号列表中的符号,采用通常的TOC访问(一次加载形式),对于在溢出符号列表中的符号,进行双指令TOC访问(二次指令形式)。需要指出的是,这里虽然以双指令TOC访问为例对本发明的实施例进行了描述,但本领域技术人员可以理解的是,本发明并不限于二条指令的双指令形式,其也可以是多于两条指令的多指令形式,只要能够消除TOC溢出,即落入本发明的保护范围。图6给出了一个溢出符号列表的例子,其中,为了避免符号重复出现在不同目标文件名下造成的列表文件空间浪费,文件格式上可以采用如图6所示的使用字符串表二级存储的方法。然后,如图5所示,进行第二轮链接。在第二轮编译时,第一轮编译产生的TOC访问存在溢出的目标文件由第二轮编译产生的修改后的目标文件替换,而所有非溢出的目标文件都来自第一轮编译。链接器对全部目标文件进行链接,从而产生该应用程序的可执行文件。在这个阶段,则不会出现TOC溢出。对于通用大小的应用程序,仅仅很小数目的TOC符号会发生TOC溢出,甚至从不发生。因此,对于大多数目标文件来说,无需进行第二轮编译/链接。与通常的构建过程相比,如果需要的话(当在第一轮链接时发生TOC溢出时),会自动调用第二轮编译/链接,并且仅对带有TOC溢出的文件进行第二轮编译。本发明通过采用两轮编译,仅对确实存在TOC溢出的TOC表项才产生两条指令形式的双指令TOC访问。因此,可以智能地产生快速TOC访问,并避免性能上的损失。与已知的解决方案相比,当TOC溢出不会发生时,可以产生一条加载指令形式的快速TOC访问,从而避 免每次都产生双指令的TOC访问所导致的性能损失,另外,由于在出现TOC溢出时会产生两条指令形式的双指令TOC访问,也可以避免采用链接器修补所导致的大的性能损失。对于从源文件到可执行文件的整个构建过程来说,本发明所增加的构建时间是非常少的。对于通常大小的应用程序,TOC溢出仅对小数目的TOC符号才会出现,甚至不会出现。这意味着对于大多数目标文件来说,不需要第二轮编译。通过采用本发明,用户可以在增加最少构建时间的情况下获得最优性能。并且,用户在不知道TOC/应用程序大小的情况下,也无需手动测试TOC溢出并重建。依据本发明的另一个实施例,还提供了一种通过在第一轮链接中选择/识别TOC溢出符号来进一步改进性能的方法。其中,如果由链接器检测到TOC溢出,将执行一个对TOC表项重新排序的方法。编译器通过累积每次访问的频率,提供每一个TOC符号的频率信息。该信息可以从静态/动态概要分析获得。这个信息被存储在目标文件的.comment部分。当链接器检测到TOC太大、会导致溢出时,其会按照编译器提供的频率信息对TOC表项重新排序,从而确保冷门、即低出现频率的符号远离热门的符号。这个优化尽可能地确保热门的TOC符号不会溢出,并使得溢出的全部损失最小化。例如,在一个循环中,Al访问在循环之外,但A2访问在循环之内Al =…LoopA2 =…编译器通过静态概要分析产生信息Al 10A2 100链接器会对Al,A2重新排序,确保在TOC中A2比Al更近,A2的访问不太可能溢出。当然,在更热门的符号占据了整个TOC的情况下仍有可能溢出,但这种情况极少出现。通过本发明的上述实施例,可以进一步地减少TOC溢出的发生。本领域技术人员可以理解的是,上述方案可以单独实现来减少TOC溢出的发生,也可以与图4或图5所示的本发明的一个实施例的方案共同使用来降低TOC溢出对于性能的影响。图7示出了依据本发明的一个实施例的用于处理TOC溢出的系统框图。该系统700包括编译器710和链接器720。其中,编译器710被配置为对应用程序的源文件进行编译,以产生与源文件对应的目标文件。这可以采用通常的编译过程来实现,产生通常的单指令TOC访问。链接器720被配置为对编译产生的目标文件进行链接,以确定目标文件中的TOC访问是否存在溢出。编译器710进一步被配置为,响应于所述目标文件中的TOC访问存在溢出,对存在TOC溢出的目标文件所对应的源文件进行再次编译,从而产生没有TOC溢出的目标文件。链接器720用再次编译产生的没有TOC溢出的目标文件替换TOC访问存在溢出的目标文件,并对所述目标文件进行再次链接。
依据本发明的一个实施例,编译器710进一步被配置为对于TOC访问存在溢出的目标文件所对应的源文件,产生多指令TOC访问。其中该多指令TOC访问可以是双指令TOC访问。依据本发明的一个实施例,编译器710进一步被配置为在编译时记录所述编译的编译命令。依据本发明的一个实施例,链接器720进一步被配置为将所述溢出的溢出信息记录在溢出符号列表中,以及,编译器710进一步被配置为根据所述溢出符号列表,确定TOC访问存在溢出的目标文件。依据本发明的一个实施例,其中所述溢出信息包括TOC访问溢出的溢出符号以及包含所述溢出符号的目标文件的目标文件名。依据本发明的一个实施例,编译器710进一步被配置为,在编译时获得TOC符号的频率信息,并且,链接器720进一步被配置为,响应于确定所述目标文件中的TOC访问存在溢出,按照TOC符号的频率信息对TOC表项重新排序。其中,所述频率信息是通过累积每次·访问的频率、从静态/动态概要分析获得的。当链接器检测到TOC太大、会导致溢出时,按照编译器提供的频率信息对TOC表项重新排序,从而确保冷门、即低出现频率的符号远离热门的符号。这个优化尽可能地确保热门的TOC符号不会溢出,并使得溢出的全部损失最小化。需要指出的是,虽然这里以POWER系统为例描述了本发明,本领域普通技术人员可以了解的是,本发明并不限于POWER系统,任何对应用程序进行编译和链接的过程都可以通过利用本发明来降低TOC溢出所带来的性能上的影响。本发明还提供了一种存储介质或信号载体,其中包括用于执行根据本发明的方法的指令。附图中的流程图和框图,图示了按照本发明实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,所述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。所属技术领域的技术人员知道,本发明可以体现为系统、方法或计算机程序产品。因此,本发明可以具体实现为以下形式,即,可以是完全的硬件、完全的软件(包括固件、驻留软件、微代码等)、或者本文一般称为“电路”、“模块”或“系统”的软件部分与硬件部分的组合。此外,本发明还可以采取体现在任何有形的表达介质(medium of expression)中的计算机程序产品的形式,该介质中包含计算机可用的程序码。可以使用一个或多个计算机可用的或计算机可读的介质的任何组合。计算机可用的或计算机可读的介质例如可以是——但不限于——电的、磁的、光的、电磁的、红外线的、或半导体的系统、装置、器件或传播介质。计算机可读介质的更具体的例子(非穷举的列表)包括以下有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPR0M或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、诸如支持因特网或内部网的传输介质、或者磁存储器件。注意计算机可用的或计算机可读的介质甚至可以是上面印有程序的纸张或者其它合适的介质,这是因为,例如可以通过电扫描这种纸张或其它介质,以电子方式获得程序,然后以适当的方式加以编译、解释或处理,并且必要的话在计算机存储器中存储。在本文件的语境中,计算机可用的或计算机可读的介质可以是任何含有、存储、传达、传播、或传输供指令执行系统、装置或器件使用的或与指令执行系统、装置或器件相联系的程序的介质。计算机可用的介质可包括在基带中或者作为载波一部分传播的、由其体现计算机可用的程序码的数据信号。计算机可用的程序码可以用任何适当的介质传输,包括一但不限于一无线、电线、光缆、RF等等。用于执行本发明的操作的计算机程序码,可以以一种或多种程序设计语言的任何组合来编写,所述程序设计语言包括面向对象的程序设计语言一诸如Java、Smalltalk、 C++之类,还包括常规的过程式程序设计语言——诸如” C”程序设计语言或类似的程序设计语言。程序码可以完全地在用户的计算上执行、部分地在用户的计算机上执行、作为一个独立的软件包执行、部分在用户的计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在后一种情形中,远程计算机可以通过任何种类的网络——包括局域网(LAN)或广域网(WAN)——连接到用户的计算机,或者,可以(例如利用因特网服务提供商来通过因特网)连接到外部计算机。以上结合优选法方案对本发明进行了详细的描述,但是可以理解,以上实施例仅用于说明而非限定本发明。本领域的技术人员可以对本发明的所示方案进行修改而不脱离本发明的范围和精神。
权利要求
1.一种用于处理应用程序的方法,包括 对应用程序的源文件进行编译,以产生与源文件对应的目标文件; 对编译产生的目标文件进行链接,以确定目标文件中的TOC访问是否存在溢出; 响应于目标文件中的TOC访问存在溢出,对所述TOC访问存在溢出的目标文件所对应的源文件进行再次编译,以产生没有TOC溢出的目标文件;以及 用再次编译产生的没有TOC溢出的目标文件替换所述TOC访问存在溢出的目标文件,并对目标文件进行再次链接。
2.如权利要求I所述的方法,其中,对应用程序的源文件进行编译,以产生与源文件对应的目标文件进一步包括,对源文件产生单指令TOC访问,以及, 响应于目标文件中的TOC访问存在溢出,对所述TOC访问存在溢出的目标文件所对应的源文件进行再次编译,以产生没有TOC溢出的目标文件进一步包括,对于TOC访问存在溢出的目标文件所对应的源文件,产生多指令TOC访问。
3.如权利要求2所述的方法,其中,所述多指令TOC访问是采用二条指令形式的双指令TOC访问。
4.如权利要求I所述的方法,其中,对应用程序的源文件进行编译,以产生与源文件对应的目标文件进一步包括,记录所述编译的编译命令。
5.如权利要求I所述的方法,其中,对编译产生的目标文件进行链接,以确定目标文件中的TOC访问是否存在溢出进一步包括,将所述溢出的溢出信息记录在溢出符号列表中,以及, 响应于所述目标文件中的TOC访问存在溢出,对所述TOC访问存在溢出的目标文件所对应的源文件进行再次编译,以产生没有TOC溢出的目标文件进一步包括,根据所述溢出符号列表,确定TOC访问存在溢出的目标文件。
6.如权利要求5所述的方法,其中,所述溢出信息包括TOC访问溢出的溢出符号以及包含所述溢出符号的目标文件的目标文件名。
7.如权利要求I所述的方法,其中,对应用程序的源文件进行编译,以产生与源文件对应的目标文件进一步包括,获得TOC符号的频率信息, 对编译产生的目标文件进行链接,以确定目标文件中的TOC访问是否存在溢出进一步包括,响应于确定目标文件中的TOC访问存在溢出,按照TOC符号的频率信息对TOC表项重新排序。
8.如权利要求7所述的方法,其中,所述频率信息是通过累积每次访问的频率、从静态/动态概要分析获得的。
9.一种用于处理应用程序的系统,包括 编译器,被配置为对应用程序的源文件进行编译,以产生与源文件对应的目标文件; 链接器,被配置为对编译产生的目标文件进行链接, 其中,所述链接器进一步被配置为确定所述目标文件中的TOC访问是否存在溢出; 所述编译器进一步被配置为响应于目标文件中的TOC访问存在溢出,对TOC访问存在溢出的目标文件所对应的源文件进行再次编译,以产生没有TOC溢出的目标文件;以及 所述链接器进一步被配置为用再次编译产生的没有TOC溢出的目标文件替换TOC访问存在溢出的目标文件,并对目标文件进行再次链接。
10.如权利要求9所述的系统,其中,所述编译器进一步被配置为,对于TOC访问存在溢出的目标文件所对应的源文件,产生多指令TOC访问。
11.如权利要求10所述的系统,其中,所述多指令TOC访问是采用二条指令形式的双指令TOC访问。
12.如权利要求9所述的系统,其中,所述编译器进一步被配置为,记录所述编译的编译命令。
13.如权利要求9所述的系统,其中,所述链接器进一步被配置为,将所述溢出的溢出信息记录在溢出符号列表中,以及, 所述编译器进一步被配置为,根据所述溢出符号列表,确定TOC访问存在溢出的目标文件。
14.如权利要求13所述的系统,其中,所述溢出信息包括TOC访问溢出的溢出符号以及包含所述溢出符号的目标文件的目标文件名。
15.如权利要求9所述的系统,其中,所述编译器进一步被配置为,获得TOC符号的频率信息, 所述链接器进一步被配置为,响应于确定目标文件中的TOC访问存在溢出,按照TOC符号的频率信息对TOC表项重新排序。
16.如权利要求15所述的系统,其中,所述频率信息是通过累积每次访问的频率、从静态/动态概要分析获得的。
全文摘要
本发明提供了一种用于处理应用程序中的内容表(TOC)访问溢出的方法和系统。其中,该方法在对编译产生的目标文件进行链接时,确定该目标文件中的TOC访问是否存在溢出。如果在目标文件中的TOC访问存在溢出,则对该目标文件所对应的源文件进行再次编译,以产生没有TOC溢出的目标文件,并对目标文件进行再次链接,从而产生应用程序的可执行文件。本发明通过采用两轮编译,仅对确实存在TOC溢出的TOC表项才产生两条指令形式的双指令TOC访问。因此,该方案具有很好的易用性,并且降低了性能损失。
文档编号G06F11/07GK102902568SQ20111021914
公开日2013年1月30日 申请日期2011年7月27日 优先权日2011年7月27日
发明者蒋健, 张嗣元, 纪金松 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1