《一种用于处理应用程序的内容表访问溢出的方法和系统.pdf》由会员分享,可在线阅读,更多相关《一种用于处理应用程序的内容表访问溢出的方法和系统.pdf(17页完整版)》请在专利查询网上搜索。
1、(10)申请公布号 CN 102902568 A (43)申请公布日 2013.01.30 C N 1 0 2 9 0 2 5 6 8 A *CN102902568A* (21)申请号 201110219146.1 (22)申请日 2011.07.27 G06F 9/45(2006.01) G06F 11/07(2006.01) (71)申请人国际商业机器公司 地址美国纽约阿芒克 (72)发明人蒋健 张嗣元 纪金松 (74)专利代理机构北京市金杜律师事务所 11256 代理人酆迅 李峥宇 (54) 发明名称 一种用于处理应用程序的内容表访问溢出的 方法和系统 (57) 摘要 本发明提供了一种用。
2、于处理应用程序中的内 容表(TOC)访问溢出的方法和系统。其中,该方法 在对编译产生的目标文件进行链接时,确定该目 标文件中的TOC访问是否存在溢出。如果在目标 文件中的TOC访问存在溢出,则对该目标文件所 对应的源文件进行再次编译,以产生没有TOC溢 出的目标文件,并对目标文件进行再次链接,从而 产生应用程序的可执行文件。本发明通过采用两 轮编译,仅对确实存在TOC溢出的TOC表项才产生 两条指令形式的双指令TOC访问。因此,该方案具 有很好的易用性,并且降低了性能损失。 (51)Int.Cl. 权利要求书2页 说明书8页 附图6页 (19)中华人民共和国国家知识产权局 (12)发明专利申请。
3、 权利要求书 2 页 说明书 8 页 附图 6 页 1/2页 2 1.一种用于处理应用程序的方法,包括: 对应用程序的源文件进行编译,以产生与源文件对应的目标文件; 对编译产生的目标文件进行链接,以确定目标文件中的TOC访问是否存在溢出; 响应于目标文件中的TOC访问存在溢出,对所述TOC访问存在溢出的目标文件所对应 的源文件进行再次编译,以产生没有TOC溢出的目标文件;以及 用再次编译产生的没有TOC溢出的目标文件替换所述TOC访问存在溢出的目标文件, 并对目标文件进行再次链接。 2.如权利要求1所述的方法,其中,对应用程序的源文件进行编译,以产生与源文件对 应的目标文件进一步包括,对源文件。
4、产生单指令TOC访问,以及, 响应于目标文件中的TOC访问存在溢出,对所述TOC访问存在溢出的目标文件所对应 的源文件进行再次编译,以产生没有TOC溢出的目标文件进一步包括,对于TOC访问存在溢 出的目标文件所对应的源文件,产生多指令TOC访问。 3.如权利要求2所述的方法,其中,所述多指令TOC访问是采用二条指令形式的双指令 TOC访问。 4.如权利要求1所述的方法,其中,对应用程序的源文件进行编译,以产生与源文件对 应的目标文件进一步包括,记录所述编译的编译命令。 5.如权利要求1所述的方法,其中,对编译产生的目标文件进行链接,以确定目标文件 中的TOC访问是否存在溢出进一步包括,将所述溢。
5、出的溢出信息记录在溢出符号列表中, 以及, 响应于所述目标文件中的TOC访问存在溢出,对所述TOC访问存在溢出的目标文件所 对应的源文件进行再次编译,以产生没有TOC溢出的目标文件进一步包括,根据所述溢出 符号列表,确定TOC访问存在溢出的目标文件。 6.如权利要求5所述的方法,其中,所述溢出信息包括TOC访问溢出的溢出符号以及包 含所述溢出符号的目标文件的目标文件名。 7.如权利要求1所述的方法,其中,对应用程序的源文件进行编译,以产生与源文件对 应的目标文件进一步包括,获得TOC符号的频率信息, 对编译产生的目标文件进行链接,以确定目标文件中的TOC访问是否存在溢出进一步 包括,响应于确定。
6、目标文件中的TOC访问存在溢出,按照TOC符号的频率信息对TOC表项重 新排序。 8.如权利要求7所述的方法,其中,所述频率信息是通过累积每次访问的频率、从静态 /动态概要分析获得的。 9.一种用于处理应用程序的系统,包括: 编译器,被配置为对应用程序的源文件进行编译,以产生与源文件对应的目标文件; 链接器,被配置为对编译产生的目标文件进行链接, 其中,所述链接器进一步被配置为确定所述目标文件中的TOC访问是否存在溢出; 所述编译器进一步被配置为响应于目标文件中的TOC访问存在溢出,对TOC访问存在 溢出的目标文件所对应的源文件进行再次编译,以产生没有TOC溢出的目标文件;以及 所述链接器进一。
7、步被配置为用再次编译产生的没有TOC溢出的目标文件替换TOC访问 存在溢出的目标文件,并对目标文件进行再次链接。 权 利 要 求 书CN 102902568 A 2/2页 3 10.如权利要求9所述的系统,其中,所述编译器进一步被配置为,对于TOC访问存在溢 出的目标文件所对应的源文件,产生多指令TOC访问。 11.如权利要求10所述的系统,其中,所述多指令TOC访问是采用二条指令形式的双指 令TOC访问。 12.如权利要求9所述的系统,其中,所述编译器进一步被配置为,记录所述编译的编 译命令。 13.如权利要求9所述的系统,其中,所述链接器进一步被配置为,将所述溢出的溢出 信息记录在溢出符号。
8、列表中,以及, 所述编译器进一步被配置为,根据所述溢出符号列表,确定TOC访问存在溢出的目标 文件。 14.如权利要求13所述的系统,其中,所述溢出信息包括TOC访问溢出的溢出符号以及 包含所述溢出符号的目标文件的目标文件名。 15.如权利要求9所述的系统,其中,所述编译器进一步被配置为,获得TOC符号的频率 信息, 所述链接器进一步被配置为,响应于确定目标文件中的TOC访问存在溢出,按照TOC符 号的频率信息对TOC表项重新排序。 16.如权利要求15所述的系统,其中,所述频率信息是通过累积每次访问的频率、从静 态/动态概要分析获得的。 权 利 要 求 书CN 102902568 A 1/8。
9、页 4 一种用于处理应用程序的内容表访问溢出的方法和系统 技术领域 0001 本发明涉及应用程序的处理,尤其涉及一种用于处理应用程序中的内容表(TOC) 访问溢出的方法和系统。 背景技术 0002 用于AIX和Linux的POWER系统是IBM服务器系列的主要产品,其中,工具链的易 用性(tools chain usability)和性能是在POWER系统上进行开发的一个很重要的基础。 0003 对于POWER系统来说,在对应用程序进行构建的过程中,存在一个被称为“TOC溢 出(overflow)”的问题,该TOC溢出会限制全局数据/代码的使用,常常为POWER系统开发 人员带来很大的不便。 。
10、发明内容 0004 本发明希望提供一种新的方案来处理应用程序构建中出现的TOC溢出问题。 0005 依据本发明的一个实施例,提供了一种用于处理应用程序的方法,包括:对应用程 序的源文件进行编译,以产生与源文件对应的目标文件;对编译产生的目标文件进行链接, 以确定目标文件中的TOC访问是否存在溢出;响应于目标文件中的TOC访问存在溢出,对所 述TOC访问存在溢出的目标文件所对应的源文件进行再次编译,以产生没有TOC溢出的目 标文件;以及,用再次编译产生的没有TOC溢出的目标文件替换所述TOC访问存在溢出的目 标文件,并对目标文件进行再次链接。 0006 依据本发明的另一个实施例,提供了一种用于处。
11、理应用程序的系统,包括:编译 器,被配置为对应用程序的源文件进行编译,以产生与源文件对应的目标文件;链接器,被 配置为对编译产生的目标文件进行链接,其中,所述链接器进一步被配置为确定所述目标 文件中的TOC访问是否存在溢出;所述编译器进一步被配置为响应于目标文件中的TOC访 问存在溢出,对TOC访问存在溢出的目标文件所对应的源文件进行再次编译,以产生没有 TOC溢出的目标文件;以及,所述链接器进一步被配置为用再次编译产生的没有TOC溢出的 目标文件替换TOC访问存在溢出的目标文件,并对目标文件进行再次链接。 0007 本发明通过采用两轮编译,仅对确实存在TOC溢出的TOC表项才产生两条指令形 。
12、式的双指令TOC访问。因此,该方案具有很好的易用性,并且降低了性能损失。 附图说明 0008 通过对附图中本发明示例实施例方式的更详细描述,本发明的上述、以及其它目 的、特征和优势将变得更加明显。 0009 图1示出了适于用来实现本发明实施方式的示例性计算系统100的框图。 0010 图2示出了一个TOC访问的示意图。 0011 图3示出了一个TOC溢出的示意图。 0012 图4示出了依据本发明的一个实施例的用于处理TOC溢出的方法的流程图。 说 明 书CN 102902568 A 2/8页 5 0013 图5示出了依据本发明的另一个实施例的用于处理TOC溢出的过程的示意图。 0014 图6示。
13、出了一个溢出符号列表的示意图。 0015 图7示出了依据本发明的一个实施例的用于处理TOC溢出的系统700的方框图。 具体实施方式 0016 以下参照按照本发明实施例的方法、系统描述本发明。其中,流程图和/或框图的 每个方框以及流程图和/或框图中各方框的组合,都可以由计算机程序指令实现。这些计 算机程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理器, 从而生产出一种机器,使得通过计算机或其它可编程数据处理装置执行的这些指令,产生 实现流程图和/或框图中的方框中规定的功能/操作的装置(means)。 0017 也可以把这些计算机程序指令存储在能指令计算机或其它可编程数据处理。
14、装置 以特定方式工作的计算机可读介质中,这样,存储在计算机可读介质中的指令产生一个包 括实现流程图和/或框图中的方框中规定的功能/操作的指令装置(instruction means) 的制造品。 0018 还可以把计算机程序指令加载到计算机或其它可编程数据处理装置上,使得在计 算机或其它可编程数据处理装置上执行一系列操作步骤,以产生计算机实现的过程,从而 在计算机或其它可编程装置上执行的指令就提供实现流程图和/或框图中的方框中规定 的功能/操作的过程。 0019 图1示出了适于用来实现本发明实施方式的示例性计算系统100的框图。如所示, 计算机系统100可以包括:CPU(中央处理单元)101、。
15、RAM(随机存取存储器)102、ROM(只读 存储器)103、系统总线104、硬盘控制器105、键盘控制器106、串行接口控制器107、并行接 口控制器108、显示控制器109、硬盘110、键盘111、串行外部设备112、并行外部设备113和 显示器114。在这些设备中,与系统总线104耦合的有CPU101、RAM 102、ROM 103、硬盘控制 器105、键盘控制器106、串行控制器107、并行控制器108和显示控制器109。硬盘110与 硬盘控制器105耦合,键盘111与键盘控制器106耦合,串行外部设备112与串行接口控制 器107耦合,并行外部设备113与并行接口控制器108耦合,以。
16、及显示器114与显示控制器 109耦合。应当理解,图1所述的结构框图仅仅为了示例的目的而示出的,而不是对本发明 范围的限制。在某些情况下,可以根据具体情况而增加或者减少某些设备。 0020 在参考附图具体描述依据本发明的实施例之前,下面先对本发明所涉及的一些术 语进行如下介绍。 0021 IBM POWER的硬件指令 0022 IBM POWER硬件支持用偏移指令加载/存储。例如,“L RT,offet(RA)”表示从地 址“offset+RA”加载到寄存器RT。“offset”是介于-215和215之间的一个立即数。 0023 TOC(内容表) 0024 AIX的ABI(Applicatio。
17、n Binary Interface应用程序二进制接口)和64位的 Linux限定了TOC,该内容表实际上是存储器中分配的一个部分。所有的全局变量和函数指 针的地址被放入该TOC中,必须通过地址来访问。 0025 TOC访问 0026 通常,使用一条加载指令来进行TOC地址访问。TOC表存有数据和函数的地址,图 说 明 书CN 102902568 A 3/8页 6 2示出了一个TOC访问的示意图,其中,基址寄存器R2指向TOC表的中心位置。对数据的访 问必须通过TOC表得到数据地址,然后根据地址完成数据访问。例如,当使用全局变量A2 时,编译器必须首先通过访问TOC:“L R3,offset_。
18、of_A2(R2)”来加载A的地址。R2是TOC 的基地址,offset_of_A2(R2)是TOC中的TOC表项A2的偏移。这里需要注意的是,TOC表 项存储的是A2的地址,而不是A2的值。 0027 然后,编译器使用另一条加载指令来获得值A2:“L R4,R3”。需要注意的是,寄存 器R3仅在最近一次TOC访问时获得A2的地址。 0028 以图2所示的TOC表为例,如果要访问数据A2,首先通过符号A2在TOC 表中的偏移位置(+800)和基址寄存器R2(TOC表基地址),计算出A2在TOC表中的位 置,并读取A2的地址,可以通过指令LOADR3,800(R2)完成这步操作。运行该指令 后在。
19、寄存器R3存放A2的地址。之后,使用该地址再次访问存储器中的数据空间,得到 所需要的数据。 0029 如图2所示,TOC表除了可以用于A1,A2等数据之外,也可以存放foo1,foo2等函 数的地址。并且,同样,如果要调用函数foo1,则需要通过foo1在TOC表中的偏移位置和基 址寄存器R2,计算出foo1在TOC表中的位置,并读取foo1的地址,之后,使用该地址访问存 储器中的代码空间,从而调用该函数。 0030 链接器的重定位(Linker Relocation) 0031 在编译时,并不创建TOC,编译器并不知晓TOC表项的偏移。例如,在上面的例子 中,“offset_of_A”是未知。
20、的,编译器必须在指令中产生一个特别的标签。在链接时,链接器 收集TOC的所有信息,此时偏移是可以计算出来的。在上面的例子中,计算出“offset_of_ A”,将其值(例如10000)填充到指令中。这个过程被称为链接器的再定位。 0032 TOC溢出 0033 TOC溢出发生在试图以很大的偏移访问TOC表项时,此时由于偏移很大,无法将 偏移在一单个指令中以一个立即数的方式编码。对于64位的系统来说,地址是8字节的, 意味着一个TOC表项(全局数据地址)要占用8个字节。如果TOC包含大于8192个表项 (216/88192),则无法使用象“L R3,offset_of_A(R2)”这样的一个单个。
21、的合法指令来 加载所有TOC表项,因此有些表项的offset_of_A可能会大于+215(或小于-215)。 0034 需要注意的是,编译器在编译时并不知道TOC的大小,因此如果编译器总是产生 一个类似于“L R3,offset_of_A(R2)”的单个指令来访问TOC,则会导致链接器对于某些指 令无法完成再定位,这种现象被称为TOC溢出。 0035 图3示出了一个TOC溢出的示意图。其中,数据A1001的地址存于偏移为 +215+1的TOC项,它的地址不能用一条LOAD指令取得,所以处于TOC溢出区域。 0036 已经存在着一些用来解决TOC溢出的已知方案。例如,一种可能的方案是,编译器 总。
22、使用双指令TOC访问(two instruction TOC access)。 0037 在这种情况下,编译器产生一个用来访问大的TOC的双指令TOC访问,而不是仅使 用一次指令加载来访问TOC。其可以使用如下所示的两条指令形式: 0038 (1)CAU r3,r2,offset_up 0039 (2)L r3,offset_lo(r3) 0040 这是为32位偏移设计的。第一个指令加上高16位的偏移,第二个指令加上低16 说 明 书CN 102902568 A 4/8页 7 位的偏移,并加载。通过采用这种方式,可以确保不会发生TOC溢出。 0041 这种方式的缺陷是,由于编译器无法计算TOC。
23、表项的偏移,因此在这种解决方 案中,编译器必须对于每一次TOC访问都产生双指令TOC访问。因此在没有溢出(偏移 215)的情况下,对于这些TOC的访问不够高效。 0042 另一种可能的方案是,编译器产生一条加载指令TOC访问,即单指令TOC访问。在 存在溢出的情况下,链接器对这些溢出进行修补(patch)。具体地,当链接器计算出TOC表 项偏移,并发现存在TOC溢出时,链接器对代码进行如下修改: 0043 0044 在这个解决方案中链接器无法用双指令TOC访问形式来替换一次加载TOC访问的 原因是,在链接器中修改代码大小是非常困难的。链接器必须使用一条指令(B tx) 替换最初的单指令TOC访。
24、问(one load TOC ac-cess),来保证代码大小不变。然后,在代码 尾部附加一段代码(分支目标)。这种方案的缺点是,这种修补需要额外的两个跳转(B tx和Breturnx),而这种跳转会极大地损害运行时的性能。 0045 还有一种可能的方案是,如果TOC大小太大,IPA(Inter Procedure Analysis进 程间分析)可以聚合(coalesce)TOC表项。IPA是链接时一个非常繁重的优化。IPA具有 整个程序的所有信息,包括TOC信息。其会将TOC表项接合起来,避免溢出。 0046 这种方案的缺陷是,IPA非常耗时,其应用在很多种情况下都收到限制,特别是应 用程序。
25、非常大的情况下。而这恰恰是TOC溢出容易发生的情况。其结果是,大多数商业客 户不愿仅仅为了解决TOC溢出问题对大应用程序使用IPA。 0047 下面将参考图4描述依据本发明的一个实施例的用于处理TOC溢出的方法的流程 图。 0048 在步骤S410,编译器接收应用程序的源文件,对该源文件进行编译,从而产生与源 文件相对应的目标文件。这个编译的过程可以采用在该领域通用的编译方式。 0049 在步骤S420,链接器接收从编译器产生的目标文件,对该目标文件进行链接,并在 链接过程中确定该目标文件中的TOC访问是否存在溢出。 0050 在步骤S430,如果确定目标文件中的TOC访问存在溢出,则编译器对。
26、存在TOC溢出 的目标文件所对应的源文件进行再次编译。例如,在这个再次编译的过程中,由于已经知道 了存在TOC溢出的目标文件,从而可以针对这些目标文件所对应的源文件,在编译的过程 说 明 书CN 102902568 A 5/8页 8 中来产生没有TOC溢出的TOC访问。由于这个再次编译的过程仅对TOC访问存在溢出的目 标文件所对应的源文件进行,从而可以在确保在不发生TOC溢出的情况下,不会对性能造 成不必要的影响。 0051 在步骤S440,用再次编译产生的没有TOC溢出的目标文件替换TOC访问存在溢出 的目标文件,并对所述目标文件进行再次链接,从而产生该应用程序的可执行文件。 0052 图5。
27、示出了依据本发明的一个实施例的用于处理TOC溢出的过程的示意图。首 先,编译器接收应用程序的源文件,对该源文件进行编译,从而产生与源文件相对应的目标 文件。其中,这个编译过程采用通常的编译方法,产生使用一条加载指令的TOC地址访问。 例如,在AIX和Linux环境下,可以通过采用特定的选项、例如“-qpicsmart”来调用编 译器,从而产生通常的TOC访问(一次加载形式)。并且,可以在目标文件“.comment”部分 记录编译命令和编译环境,这与使用选项-qsaveopt类似。该信息可以用于在需要时调 用第二轮编译。 0053 然后,链接器按照通常的程序检测目标程序中是否有符号(symbol。
28、)存在TOC溢 出。如果没有TOC溢出,则整个构建过程结束,链接器输出应用程序的一个可执行文件。如 果出现存在TOC溢出的符号,链接器则在一个溢出符号列表、例如/tmp/foo中记录溢 出信息,该溢出信息可以是溢出符号/目标文件名,即TOC访问溢出的溢出符号以及包含所 述溢出符号的目标文件的目标文件名。该溢出符号列表将用来为之后的第二轮编译提供输 入。 0054 对于具有溢出符号的每个目标文件,链接器从目标文件“.comment”部分取出编译 命令字符串,该编译命令是以字符串的形式保存在目标文件“.comment”部分中的。 0055 对于每一个溢出目标文件,使用从目标文件读出的编译命令,并加。
29、上指定溢出符 号列表文件的命令,构成最终调用编译器进行第二轮编译的命令。 0056 当设置了特定选项-qtocsymf(该命令用于指定溢出符号列表文件)时,编译器进 行第二轮编译步骤。其中,编译器读取输入的TOC溢出符号列表文件,对应用程序的源文件 进行编译。其中,对于不在溢出符号列表中的符号,采用通常的TOC访问(一次加载形式), 对于在溢出符号列表中的符号,进行双指令TOC访问(二次指令形式)。 0057 需要指出的是,这里虽然以双指令TOC访问为例对本发明的实施例进行了描述, 但本领域技术人员可以理解的是,本发明并不限于二条指令的双指令形式,其也可以是多 于两条指令的多指令形式,只要能够。
30、消除TOC溢出,即落入本发明的保护范围。 0058 图6给出了一个溢出符号列表的例子,其中,为了避免符号重复出现在不同目标 文件名下造成的列表文件空间浪费,文件格式上可以采用如图6所示的使用字符串表二级 存储的方法。 0059 然后,如图5所示,进行第二轮链接。在第二轮编译时,第一轮编译产生的TOC访 问存在溢出的目标文件由第二轮编译产生的修改后的目标文件替换,而所有非溢出的目标 文件都来自第一轮编译。链接器对全部目标文件进行链接,从而产生该应用程序的可执行 文件。在这个阶段,则不会出现TOC溢出。 0060 对于通用大小的应用程序,仅仅很小数目的TOC符号会发生TOC溢出,甚至从不发 生。因。
31、此,对于大多数目标文件来说,无需进行第二轮编译/链接。 0061 与通常的构建过程相比,如果需要的话(当在第一轮链接时发生TOC溢出时),会 说 明 书CN 102902568 A 6/8页 9 自动调用第二轮编译/链接,并且仅对带有TOC溢出的文件进行第二轮编译。 0062 本发明通过采用两轮编译,仅对确实存在TOC溢出的TOC表项才产生两条指令形 式的双指令TOC访问。因此,可以智能地产生快速TOC访问,并避免性能上的损失。与已知 的解决方案相比,当TOC溢出不会发生时,可以产生一条加载指令形式的快速TOC访问,从 而避免每次都产生双指令的TOC访问所导致的性能损失,另外,由于在出现TOC。
32、溢出时会产 生两条指令形式的双指令TOC访问,也可以避免采用链接器修补所导致的大的性能损失。 0063 对于从源文件到可执行文件的整个构建过程来说,本发明所增加的构建时间是非 常少的。对于通常大小的应用程序,TOC溢出仅对小数目的TOC符号才会出现,甚至不会出 现。这意味着对于大多数目标文件来说,不需要第二轮编译。 0064 通过采用本发明,用户可以在增加最少构建时间的情况下获得最优性能。并且,用 户在不知道TOC/应用程序大小的情况下,也无需手动测试TOC溢出并重建。 0065 依据本发明的另一个实施例,还提供了一种通过在第一轮链接中选择/识别TOC 溢出符号来进一步改进性能的方法。其中,如。
33、果由链接器检测到TOC溢出,将执行一个对 TOC表项重新排序的方法。 0066 编译器通过累积每次访问的频率,提供每一个TOC符号的频率信息。该信息可以 从静态/动态概要分析获得。这个信息被存储在目标文件的.comment部分。 0067 当链接器检测到TOC太大、会导致溢出时,其会按照编译器提供的频率信息对TOC 表项重新排序,从而确保冷门、即低出现频率的符号远离热门的符号。这个优化尽可能地确 保热门的TOC符号不会溢出,并使得溢出的全部损失最小化。 0068 例如,在一个循环中,A1访问在循环之外,但A2访问在循环之内 0069 A1. 0070 Loop 0071 A2. 0072 编译。
34、器通过静态概要分析产生信息: 0073 A1:10 0074 A2:100 0075 链接器会对A1,A2重新排序,确保在TOC中A2比A1更近,A2的访问不太可能溢 出。当然,在更热门的符号占据了整个TOC的情况下仍有可能溢出,但这种情况极少出现。 0076 通过本发明的上述实施例,可以进一步地减少TOC溢出的发生。本领域技术人员 可以理解的是,上述方案可以单独实现来减少TOC溢出的发生,也可以与图4或图5所示的 本发明的一个实施例的方案共同使用来降低TOC溢出对于性能的影响。 0077 图7示出了依据本发明的一个实施例的用于处理TOC溢出的系统框图。该系统700 包括编译器710和链接器7。
35、20。其中,编译器710被配置为对应用程序的源文件进行编译, 以产生与源文件对应的目标文件。这可以采用通常的编译过程来实现,产生通常的单指令 TOC访问。链接器720被配置为对编译产生的目标文件进行链接,以确定目标文件中的TOC 访问是否存在溢出。编译器710进一步被配置为,响应于所述目标文件中的TOC访问存在 溢出,对存在TOC溢出的目标文件所对应的源文件进行再次编译,从而产生没有TOC溢出的 目标文件。链接器720用再次编译产生的没有TOC溢出的目标文件替换TOC访问存在溢出 的目标文件,并对所述目标文件进行再次链接。 说 明 书CN 102902568 A 7/8页 10 0078 依据。
36、本发明的一个实施例,编译器710进一步被配置为对于TOC访问存在溢出的 目标文件所对应的源文件,产生多指令TOC访问。其中该多指令TOC访问可以是双指令TOC 访问。 0079 依据本发明的一个实施例,编译器710进一步被配置为在编译时记录所述编译的 编译命令。 0080 依据本发明的一个实施例,链接器720进一步被配置为将所述溢出的溢出信息记 录在溢出符号列表中,以及,编译器710进一步被配置为根据所述溢出符号列表,确定TOC 访问存在溢出的目标文件。 0081 依据本发明的一个实施例,其中所述溢出信息包括TOC访问溢出的溢出符号以及 包含所述溢出符号的目标文件的目标文件名。 0082 依据。
37、本发明的一个实施例,编译器710进一步被配置为,在编译时获得TOC符号的 频率信息,并且,链接器720进一步被配置为,响应于确定所述目标文件中的TOC访问存在 溢出,按照TOC符号的频率信息对TOC表项重新排序。其中,所述频率信息是通过累积每次 访问的频率、从静态/动态概要分析获得的。当链接器检测到TOC太大、会导致溢出时,按 照编译器提供的频率信息对TOC表项重新排序,从而确保冷门、即低出现频率的符号远离 热门的符号。这个优化尽可能地确保热门的TOC符号不会溢出,并使得溢出的全部损失最 小化。 0083 需要指出的是,虽然这里以POWER系统为例描述了本发明,本领域普通技术人员 可以了解的是。
38、,本发明并不限于POWER系统,任何对应用程序进行编译和链接的过程都可 以通过利用本发明来降低TOC溢出所带来的性能上的影响。 0084 本发明还提供了一种存储介质或信号载体,其中包括用于执行根据本发明的方法 的指令。 0085 附图中的流程图和框图,图示了按照本发明实施例的系统、方法和计算机程序产 品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一 个模块、程序段、或代码的一部分,所述模块、程序段、或代码的一部分包含一个或多个用于 实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注 的功能也可以以不同于附图中所标注的顺序发生。例如,。
39、两个接连地表示的方框实际上可 以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意 的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执 行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令 的组合来实现。 0086 所属技术领域的技术人员知道,本发明可以体现为系统、方法或计算机程序产品。 因此,本发明可以具体实现为以下形式,即,可以是完全的硬件、完全的软件(包括固件、驻 留软件、微代码等)、或者本文一般称为“电路”、“模块”或“系统”的软件部分与硬件部分的 组合。此外,本发明还可以采取体现在任何有形的表达介质(。
40、medium of expression)中的 计算机程序产品的形式,该介质中包含计算机可用的程序码。 0087 可以使用一个或多个计算机可用的或计算机可读的介质的任何组合。计算机可 用的或计算机可读的介质例如可以是但不限于电的、磁的、光的、电磁的、红外线 的、或半导体的系统、装置、器件或传播介质。计算机可读介质的更具体的例子(非穷举的 说 明 书CN 102902568 A 10 8/8页 11 列表)包括以下:有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器 (RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁 盘只读存储器(CD。
41、-ROM)、光存储器件、诸如支持因特网或内部网的传输介质、或者磁存储器 件。注意计算机可用的或计算机可读的介质甚至可以是上面印有程序的纸张或者其它合适 的介质,这是因为,例如可以通过电扫描这种纸张或其它介质,以电子方式获得程序,然后 以适当的方式加以编译、解释或处理,并且必要的话在计算机存储器中存储。在本文件的语 境中,计算机可用的或计算机可读的介质可以是任何含有、存储、传达、传播、或传输供指令 执行系统、装置或器件使用的或与指令执行系统、装置或器件相联系的程序的介质。计算机 可用的介质可包括在基带中或者作为载波一部分传播的、由其体现计算机可用的程序码的 数据信号。计算机可用的程序码可以用任何。
42、适当的介质传输,包括但不限于无线、 电线、光缆、RF等等。 0088 用于执行本发明的操作的计算机程序码,可以以一种或多种程序设计语言的任何 组合来编写,所述程序设计语言包括面向对象的程序设计语言诸如Java、Smalltalk、 C+之类,还包括常规的过程式程序设计语言诸如”C”程序设计语言或类似的程序设计 语言。程序码可以完全地在用户的计算上执行、部分地在用户的计算机上执行、作为一个独 立的软件包执行、部分在用户的计算机上部分在远程计算机上执行、或者完全在远程计算 机或服务器上执行。在后一种情形中,远程计算机可以通过任何种类的网络包括局域 网(LAN)或广域网(WAN)连接到用户的计算机,。
43、或者,可以(例如利用因特网服务提供 商来通过因特网)连接到外部计算机。 0089 以上结合优选法方案对本发明进行了详细的描述,但是可以理解,以上实施例仅 用于说明而非限定本发明。本领域的技术人员可以对本发明的所示方案进行修改而不脱离 本发明的范围和精神。 说 明 书CN 102902568 A 11 1/6页 12 图1 图2 说 明 书 附 图CN 102902568 A 12 2/6页 13 图3 说 明 书 附 图CN 102902568 A 13 3/6页 14 图4 说 明 书 附 图CN 102902568 A 14 4/6页 15 图5 说 明 书 附 图CN 102902568 A 15 5/6页 16 图6 说 明 书 附 图CN 102902568 A 16 6/6页 17 图7 说 明 书 附 图CN 102902568 A 17 。