针对程序代码转换处理动态链接的函数调用的方法和设备.pdf

上传人:1****2 文档编号:972372 上传时间:2018-03-22 格式:PDF 页数:24 大小:1.39MB
返回 下载 相关 举报
摘要
申请专利号:

CN200780036797.9

申请日:

2007.10.01

公开号:

CN101523348A

公开日:

2009.09.02

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效|||专利申请权、专利权的转移(专利申请权的转移)变更项目:申请人变更前权利人:申请人:IBM英国有限公司 地址:英国汉普郡变更后权利人:申请人:国际商业机器公司 地址:美国纽约登记生效日:2009.8.7|||公开

IPC分类号:

G06F9/45; G06F9/455; G06F9/445

主分类号:

G06F9/45

申请人:

特兰斯蒂有限公司

发明人:

亚历山大·巴拉克劳·布朗

地址:

英国伦敦

优先权:

2006.10.2 GB 0619389.0; 2006.10.24 US 60/854,054

专利代理机构:

北京铭硕知识产权代理有限公司

代理人:

韩明星;张 军

PDF下载: PDF下载
内容摘要

提供一种在动态二进制翻译器中将对象代码翻译为目标代码期间处理动态链接的对象函数调用的方法,所述动态链接的对象函数调用被设置为将对象控制流传递给诸如过程链接表的中间控制结构,然后将对象控制流传递给用于修改与对象函数调用相关联的链接信息的对象链接器代码。在对象处理器上执行的对象代码被翻译器接收,并且在目标处理器上执行的对应目标代码被产生。翻译器被设置为建立包含入口的函数链接表,所述入口给出对象代码所调用的每个函数的位置,从而翻译器可产生代码,其中,对象函数调用与用于执行所述函数的代码相关联,而不产生与中间控制结构对应的目标代码。

权利要求书

1、  一种计算机设备,包括:
目标处理器;以及
翻译器,被设置为接收在对象处理器上执行的对象代码,并产生在目标处理器上执行的目标代码,
其中,翻译器被设置为:
(a)接收包括一个或多个动态链接的对象函数调用的对象代码,所述动态链接的对象函数调用被设置为通过对象代码中的中间控制结构将对象控制流传递给对象链接器代码,由此将所述动态链接的对象函数调用与用于执行所述函数的对象代码相关联;以及
(b)在接收的对象代码中识别所述动态链接的函数调用,并且将所述动态链接的函数调用与用于执行对应函数的代码相关联,而不产生与中间控制结构对应的目标代码。

2、
  根据权利要求1所述的计算机设备,其中,翻译器设备被设置为:在接收的对象代码中识别所述动态链接的函数调用;在接收的对象代码的首次翻译中收集关于动态链接的函数调用的链接信息,并在接收的对象代码的随后翻译中使用收集的信息。

3、
  根据权利要求2所述的计算机设备,其中,翻译器设备被设置为:在随后翻译中使用收集的信息,以将控制流从识别的函数调用传递给用于执行对应函数的代码。

4、
  根据权利要求1所述的计算机设备,其中,翻译器被设置为:将关于识别的函数调用的信息按照识别的函数调用的标识符和用于执行识别的函数的代码的位置的形式存储在翻译器可访问的函数链接表中。

5、
  根据权利要求4所述的计算机设备,其中,翻译器被设置为:在所述函数链接表中检查与每个识别的函数对应的入口;如果所述函数链接表包括与识别的函数对应的入口,则使用存储在所述函数链接表中的信息将函数调用与用于执行对应函数的代码相关联。

6、
  根据权利要求2所述的计算机设备,其中,翻译器被设置为:通过监控对象链接器活动,或者通过检测按照对象指令高速缓冲存储器清空事件序列的形式的特征对象代码指令序列,来收集关于函数调用的信息。

7、
  根据权利要求1所述的计算机设备,其中,翻译器建立动态链接的函数调用与用于执行所述函数的代码之间的直接链接。

8、
  根据权利要求4所述的计算机设备,其中,翻译器被设置为在函数链接表中存储下列各项中的一个或多个:用于执行识别的函数的本地代码的位置;用于执行识别的函数的先前翻译的目标代码的位置;以及翻译器已知的优化的中间表示的部分的位置,其中,能够从所述优化的中间表示的部分产生目标代码以执行识别的函数。

9、
  根据权利要求1所述的计算机设备,其中,翻译器被设置为:识别与严格定义的函数相关的动态链接的函数调用,并且使用用于执行调用的函数的代码替换所述动态链接的函数调用。

10、
  根据权利要求4所述的计算机设备,其中,翻译器被设置为在函数链接表中存储解引用的变量,所述解引用的变量与下列各项中的一个的位置相关:用于执行识别的函数的对象代码;用于执行识别的函数的本地代码;用于执行识别的函数的先前翻译的目标代码;以及翻译器已知的优化的中间表示的部分,其中,能够从所述优化的中间表示的部分产生目标代码以执行识别的函数。

11、
  根据权利要求1所述的计算机设备,其中,翻译器被设置为:接收包括一个或多个动态链接的对象函数调用的对象代码,所述动态链接的对象函数调用被设置为通过对象代码的过程链接表将对象控制流传递给对象链接器代码;在接收的对象代码中识别所述动态链接的对象函数调用,并且将所述动态链接的对象函数调用与用于执行对应函数的代码相关联,而不产生与过程链接表对应的目标代码。

12、
  根据权利要求1所述的计算机设备,其中,翻译器被设置为:接收包括一个或多个动态链接的对象函数调用的对象代码,所述动态链接的对象函数调用被设置为通过自身修改对象代码的区域将对象控制流传递给对象链接器代码;在接收的对象代码中识别所述动态链接的对象函数调用,并且将所述动态链接的对象函数调用与用于执行对应函数的代码相关联,而不产生与所述自身修改对象代码的区域对应的目标代码。

13、
  一种在目标处理器上执行的程序代码转换的方法,包括以下步骤:
接收在对象处理器上执行的对象代码,其中,接收的对象代码包括一个或多个动态链接的对象函数调用,所述动态链接的对象函数调用被设置为通过对象代码中的中间控制结构将对象控制流传递给对象链接器代码,由此将所述动态链接的对象函数调用与用于执行所述函数的对象代码相关联;
在接收的对象代码中识别所述动态链接的函数调用;以及
产生在目标处理器上执行的目标代码,其中,所述动态链接的函数调用与用于执行对应函数的代码相关联,而不产生与中间控制结构对应的目标代码。

14、
  根据权利要求13所述的方法,其中,在接收的对象代码的首次翻译中收集关于识别的动态链接的函数调用的链接信息,以在接收的对象代码的随后翻译中使用收集的所述信息。

15、
  根据权利要求14所述的方法,其中,在随后翻译中,在首次翻译中收集的所述信息用于将控制流从识别的函数调用传递给用于执行对应函数的代码。

16、
  根据权利要求13所述的方法,包括:将关于识别的函数调用的信息存储在函数链接表中,并在所述函数链接表中检查与每个识别的函数对应的入口;如果所述函数链接表包括与识别的函数对应的入口,则使用存储在所述函数链接表中的信息将函数调用与用于执行对应函数的代码相关联。

17、
  根据权利要求14所述的方法,其中,收集关于识别的函数调用的所述信息的步骤包括:监控对象链接器活动。

18、
  根据权利要求14所述的方法,其中,收集关于识别的函数调用的所述信息的步骤包括:检测按照对象指令高速缓冲存储器清空事件的特征序列的形式的特征对象代码指令序列。

19、
  根据权利要求13所述的方法,其中,产生目标代码的步骤包括:在目标代码中建立动态链接的函数调用与用于执行所述函数的代码之间的直接链接。

20、
  根据权利要求16所述的方法,包括:在函数链接表中存储从下列一组中选择的一个或多个,
所述一组包括:用于执行识别的函数的本地代码的位置;用于执行识别的函数的先前翻译的目标代码的位置;优化的中间表示的部分的位置,其中,能够从所述优化的中间表示的部分产生目标代码以执行识别的函数;以及解引用的变量,
所述解引用的变量与下列各项中的一个的位置相关:用于执行识别的函数的对象代码;用于执行识别的函数的本地代码;用于执行识别的函数的先前翻译的目标代码;以及翻译器已知的优化的中间表示的部分,其中,能够从所述优化的中间表示的部分产生目标代码以执行识别的函数。

21、
  根据权利要求14所述的方法,包括:识别与严格定义的函数相关的动态链接的函数调用,并且使用用于执行调用的函数的代码替换所述动态链接的函数调用。

22、
  根据权利要求14所述的方法,包括:接收一个或多个动态链接的对象函数调用,所述动态链接的对象函数调用被设置为通过对象代码的过程链接表将对象控制流传递给对象链接器代码;在接收的对象代码中识别所述动态链接的对象函数调用;并且将所述动态链接的函数调用与用于执行对应函数的代码相关联,而不产生与过程链接表对应的目标代码。

23、
  根据权利要求14所述的方法,包括:接收一个或多个动态链接的对象函数调用,所述动态链接的对象函数调用被设置为通过自身修改对象代码的区域将对象控制流传递给对象链接器代码;在接收的对象代码中识别所述动态链接的函数调用;并且将所述动态链接的函数调用与用于执行对应函数的代码相关联,而不产生与所述自身修改对象代码的区域对应的目标代码。

24、
  一种记录有计算机可执行的指令的计算机可读介质,所述指令用于执行权利要求13所述的方法。

25、
  一种翻译器设备,被设置为接收在对象处理器上执行的对象代码并产生在目标处理器上执行的目标代码,
其中,所述翻译器被设置为:
接收在对象处理器上执行的对象代码,其中,接收的对象代码包括一个或多个动态链接的对象函数调用,所述动态链接的对象函数调用被设置为通过对象代码中的中间控制结构将对象控制流传递给对象链接器代码,由此将所述动态链接的对象函数调用与用于执行所述函数的对象代码相关联;
在接收的对象代码中识别所述动态链接的函数调用;以及
产生在目标处理器上执行的目标代码,其中,所述动态链接的函数调用与用于执行对应函数的代码相关联,而不产生与中间控制结构对应的目标代码。

说明书

针对程序代码转换处理动态链接的函数调用的方法和设备
技术领域
本发明总体上涉及计算机和计算机软件领域,更详细地讲,涉及例如在转换包括动态链接的函数调用的程序代码的代码翻译器、仿真器和加速器中有用的程序代码转换方法和设备。
背景技术
在嵌入式和非嵌入式CPU市场中,可找到占主导地位的指令集架构(ISA),对于这些ISA存在大量软件,这些软件为了性能可被“加速”,或者可被“翻译”给大量有能力的能够表现出更好的成本/性能优点的处理器,只要这些处理器能够透明地访问相关软件。还可找到占优势的CPU架构,所述CPU架构最终被锁定到它们的ISA,不能在性能或市场占有方面得到发展,并且可从“合成CPU”协同架构受益。
经常期望在第二类型的处理器(“目标”处理器)上运行为第一类型的处理器(“对象”处理器)编写的程序代码。这里,仿真器或翻译器用于执行程序代码转换,从而对象程序能够在目标处理器上运行。PCT申请WO00/22521公开了程序代码转换方法和设备,所述程序代码转换方法和设备促进了这样的加速、翻译和协同架构能力,可在本发明的实施例中采用所述程序代码转换方法和设备。
将被翻译的对象程序通常由多个对象代码单元组成,对象代码单元包括对象应用和多个对象库,一些对象库可以是专有的,一些对象库被提供作为对象OS的一部分(“系统库”)。当对象程序运行时,随着对库进行函数调用,控制流在这些不同的对象代码单元之间传递。
在特定的操作系统(例如来自Sun微系统公司的Solaris)中,将函数调用链接到实现该函数的库代码的处理可在运行时被执行,并且该过程被称为动态链接。动态链接由动态链接器代码执行,并且包括中间控制结构的使用,中间控制结构被称为过程链接表(PLT)。
PLT是编译的程序的一部分,并且包含入口,入口包括程序所需要的每个库函数的链接信息。当在程序的一般运行中遇到对库函数的首次调用时,控制流跳转到与该函数相关联的PLT入口。该函数的PLT入口通过调用动态链接器代码来控制该阶段的链接处理。动态链接器代码使得所涉及的函数的链接信息被更新。通过更新链接信息,动态链接器代码生成从该函数的PLT入口到实现该函数的库代码的链接。通过这种方式建立的链接通常持续程序的剩余运行那么长时间。
然后,动态链接器代码将控制流传递给库中的代码,从而函数被执行。
程序对该函数的随后调用如先前那样将控制流传递给PLT入口。由于已经使用对实现该函数的库代码的链接更新了PLT入口,所以现在PLT在这些随后调用中使得控制流从PLT直接传递给库。这些随后调用既不需要另外更新PLT入口,也不需要另外调用动态链接器。
在特定的操作系统中,创建函数的PLT入口与包含执行该函数的代码的库之间的链接的动作具有修改与PLT相关联的数据(诸如全局偏移表)的效果。然后,修改的全局偏移表可通过PLT入口中的代码在运行时被读取,使得能够形成链接。在特定的其它操作系统(例如Solaris)中,创建特定函数的PLT入口与包括该函数的库之间的链接的动作具有修改形成PLT入口本身的可执行代码的替换效果。
如上所述作为中间控制结构的PLT的使用,具体地讲,在函数被首次调用时,通过修改包括PLT的代码来进行PLT中的链接信息的修改,使得对于采用PLT作为动态链接机制的一部分的对象代码的程序代码转换变得复杂。
由于被修改的对象代码可对应于已经被翻译的目标代码,所以运行时的代码修改给动态翻译器带来问题。当发生了对象代码的这种修改时,修改的对象代码的所有目标代码翻译必须被识别,并且作为陈旧物被丢弃。因此,翻译器应该能够识别与正被修改的特定对象代码地址对应的所有目标代码序列(即,翻译)。
在动态翻译器中,发现并删除与给定的对象地址对应的目标代码是困难的,有时甚至是不可能的。在一些情况下,在翻译期间应用了优化,所述优化产生与翻译所表示的对象地址的范围不再正确相关的翻译。在这些情况下,如果对象程序修改了特定对象地址处的自己的代码,则翻译器无法识别哪个翻译的目标代码将被无效。另外,在多线程环境中安全删除翻译的目标代码可能导致另外的问题。
已经在PCT申请WO05/008487中描述了处理代码修改的技术。尽管这些技术是有用的,但是现在发明人已经认识到,运行时在PLT中发生的高度集中的代码修改可使得如在PCT WO05/008487中描述的技术成为处理PLT更新的效率低下的方式。这样的技术可确保没有无效的翻译的目标代码被执行,但是,发现当使用这些技术处理PLT更新时的控制流管理在处理器和存储器资源方面是昂贵的。
此外,现在发明人已经认识到,与一些其它操作系统中的动态链接器相比,由Solaris操作系统中的动态链接器ld.so使用的PLT更新方法显著增加了执行一般动态链接的程序所需的分区的数量。
针对对象程序代码的翻译而处理动态链接的函数调用的方法和利用该处理方法的计算机设备一起被提供。优选实施例能够使用函数链接表来建立从对象代码中的函数调用到与对象代码函数对应的代码的链接,而不用产生与中间控制结构对应的目标代码。包括用于将对象代码转换为目标代码的翻译器的计算机设备可被设置,从而对象程序中的动态链接的函数调用被识别,并且目标代码被产生,目标代码与用于执行该函数的代码直接相关联,该关联基于由翻译器收集的成为函数链接表的信息。
用于处理动态链接的函数调用的技术的优选实施例使得对象代码中的动态链接的函数调用能够方便地与用于执行该函数的代码相关联。优选实施例可降低与诸如从PCT WO05/008487得知的用于处理代码修改的技术相关联的处理和存储器开销。
本发明由此可在例如承担程序代码转换的同时提高计算机系统的性能。
发明内容
根据本发明,提供一种权利要求中所描述的设备和方法。本发明的优选特点在权利要求和说明书中是清楚的。
在一方面,提供一种计算机设备,所述计算机设备包括:目标处理器;以及翻译器,被设置为接收在对象处理器上执行的对象代码,并产生在目标处理器上执行的目标代码,其中,翻译器被设置为:(a)接收包括一个或多个动态链接的对象函数调用的对象代码,所述动态链接的对象函数调用被设置为通过对象代码中的中间控制结构将对象控制流传递给对象链接器代码,由此将所述动态链接的对象函数调用与用于执行所述函数的对象代码相关联;以及(b)在接收的对象代码中识别所述动态链接的函数调用,并且将所述动态链接的对象函数调用与用于执行对应函数的代码相关联,而不产生与中间控制结构对应的目标代码。
翻译器设备可被设置为:在接收的对象代码中识别所述动态链接的对象函数调用,并在接收的对象代码的首次翻译中收集关于动态链接的函数调用的链接信息;在接收的对象代码的随后翻译中使用收集的信息。计算机设备可被设置为:使得翻译器设备在随后翻译中使用收集的信息,以将控制流从识别的函数调用传递给用于执行对应函数的代码。
计算机设备可被设置为:当翻译器接收包括一个或多个动态链接的对象函数调用的对象代码时(所述动态链接的对象函数调用被设置为通过对象代码的过程链接表(PLT)将对象控制流传递给对象链接器代码),翻译器在接收的对象代码中识别所述动态链接的对象函数调用,并且所述动态链接的对象函数调用与用于执行对应函数的代码相关联,而不产生与PLT对应的目标代码。
在另一方面,提供一种在目标处理器上执行的程序代码转换的方法,所述方法包括以下步骤:接收在对象处理器上执行的对象代码,其中,接收的对象代码包括一个或多个动态链接的对象函数调用,所述动态链接的对象函数调用被设置为通过对象代码中的中间控制结构将对象控制流传递给对象链接器代码,由此将所述动态链接的对象函数调用与用于执行所述函数的对象代码相关联;在接收的对象代码中识别所述动态链接的函数调用;以及产生在目标处理器上执行的目标代码,其中,所述动态链接的函数调用与用于执行对应函数的代码相关联,而不产生与中间控制结构对应的目标代码。
在另一方面,提供一种计算机可读介质,在所述介质上记录有计算机可执行的指令,所述指令用于执行在目标处理器上执行的程序代码转换的方法,所述方法包括以下步骤:接收在对象处理器上执行的对象代码,其中,接收的对象代码包括一个或多个动态链接的对象函数调用,所述动态链接的对象函数调用被设置为通过对象代码中的中间控制结构将对象控制流传递给对象链接器代码,由此将所述动态链接的对象函数调用与用于执行所述函数的对象代码相关联;在接收的对象代码中识别所述动态链接的函数调用;以及产生在目标处理器上执行的目标代码,其中,所述动态链接的函数调用与用于执行对应函数的代码相关联,而不产生与中间控制结构对应的目标代码。
在另一方面,提供一种翻译器设备,所述翻译器设备被设置为接收在对象处理器上执行的对象代码并产生在目标处理器上执行的目标代码,其中,所述翻译器设备被设置为:接收在对象处理器上执行的对象代码,其中,接收的对象代码包括一个或多个动态链接的对象函数调用,所述动态链接的对象函数调用被设置为通过对象代码中的中间控制结构将对象控制流传递给对象链接器代码,由此将所述动态链接的对象函数调用与用于执行所述函数的对象代码相关联;在接收的对象代码中识别所述动态链接的函数调用;以及产生在目标处理器上执行的目标代码,其中,所述动态链接的函数调用与用于执行对应函数的代码相关联,而不产生与中间控制结构对应的目标代码。
上面是本发明实施例的各个方面的概括。提供该概括以帮助本领域技术人员更快速地理解本发明的详细讨论,本发明的详细讨论寻求权利要求的范围,但是没有而且意图不是以任何方式限制权利要求的范围。
附图说明
合并且组成说明书一部分的附图示出了当前优选实施方式,其描述如下:
图1是示出应用了本发明实施例的设备的框图;
图2是本发明实施例所采用的翻译器单元的示意图;
图3是示出本发明实施例所采用的设备的框图;以及
图4是示出示例性的函数调用处理方法的示意性流程图。
具体实施方式
提供下面的描述以使本领域的技术人员能够实现并使用本发明,下面的描述阐述发明人预期的执行其发明的最佳方式。然而,各种修改对于本领域技术人员仍然是明显的,因为这里已经具体定义了本发明的一般原理以提供改进的程序代码转换方法和设备。
参照图1,对象程序17将在具有对象处理器3的对象计算平台1上执行。然而,目标计算平台10用于通过翻译器单元19来执行对象程序17,翻译器单元19执行程序代码转换。翻译器单元19执行从对象代码17到目标代码21的代码转换,以使得目标代码21在目标计算平台10上可运行。
如本领域技术人员所熟悉的,对象处理器3具有一组对象寄存器5。除了其它内容,对象存储器8还保存对象代码17和对象操作系统2。类似地,图1中的示例性的目标计算平台10包括具有多个目标寄存器15的目标处理器13以及存储器18,存储器18存储包括目标操作系统20、对象代码17、翻译器代码19和翻译的目标代码21的多个操作组件。目标计算平台10通常是基于微处理器的计算机或其它适合的计算机。
在一个实施例中,翻译器代码19是这样一种仿真器,该仿真器在优化或没有优化的情况下,将对象指令集架构(ISA)的对象代码翻译成另一ISA的翻译的目标代码。在另一实施例中,翻译器19起到通过执行程序代码优化来将对象代码翻译为目标代码(对象代码和目标代码均具有相同的ISA)的功能。
适宜地,翻译器代码19是用于实现翻译器的源代码的编译版本,并与操作系统20相结合在目标处理器13上运行。应该理解的是,图1示出的结构仅是示例性的,例如根据本发明实施例的软件、方法和处理可以在驻留于操作系统20之内或之下的代码中实现。存储器18的对象代码17、翻译器代码19、操作系统20和存储机制可以是本领域技术人员所知的各种类型中的任何一种。
在根据图1的设备中,在运行时,程序代码转换被动态地执行,从而在目标代码21运行的同时在目标架构10上执行。也就是说,翻译器19与翻译的目标代码21内联地运行。通过翻译器19运行对象程序17包括以交织方式执行的两种不同类型的代码:翻译器代码19;和目标代码21。因此,在整个运行时,始终基于正被翻译的程序的存储的对象代码17,通过翻译器代码19来产生目标代码21。
在一个实施例中,翻译器单元19对对象架构1的相关部分,如对象处理器3,特别是对象寄存器5进行仿真,同时将对象程序17作为目标代码21在目标处理器13上实际执行。在优选实施例中,提供至少一个全局寄存器存储器27(也被称为对象寄存器组27或抽象寄存器组27)。在多处理器环境下,可选地,根据对象处理器的架构提供一个以上的抽象寄存器组27。通过翻译器19和目标代码21的组件来提供对象状态的表示。即,翻译器19在多个明确的程序语言器件(如变量和/或对象)中存储对象状态。相比之下,翻译的目标代码21在由目标代码21的目标指令所操作的目标寄存器15和存储器位置18中隐含地提供对象处理器状态。例如,全局寄存器存储器27的低级别表示仅是分配的存储器的区域。然而,在翻译器19的源代码中,全局寄存器存储器27是能够在更高级别下被访问和操作的数据阵列或对象。
术语“基本块”是本领域技术人员所熟悉的。基本块是具有将块代码限于单个控制路径的确切的一个入口点和确切的一个出口点的代码段。因此,基本块是控制流的有用的基本单元。适宜地,翻译器19将对象代码17划分为多个基本块,其中每个基本块是单个入口点处的第一指令和单个出口点(如跳转、调用或分支指令)处的最后指令之间的连续指令集。翻译器19可以仅选择这些基本块中的一个(块模式),或者可以选择一组基本块(组块模式)。适宜地,组块包括将作为一个单元对待的两个或更多基本块。另外,翻译器可形成相同块(iso-block),该相同块表示不同入口条件下的对象代码的相同基本块。
在优选实施例中,作为从原始对象程序17产生目标代码21的处理的一部分,基于对象指令序列产生中间表示(IR)树。IR树是由对象程序计算的表达式以及由对象程序执行的操作的抽象表示。随后,基于IR树产生目标代码21。实际上,IR节点的集合是有向无环图(DAG),但是通俗地称为“树”。
本领域技术人员应该理解,在一个实施例中,利用面向对象的编程语言(如C++)来实现翻译器19。例如,IR节点被实现为C++对象,对其它节点的引用被实现为对与这些其它节点对应的C++对象的C++引用。因此,IR树被实现为包含彼此间的各种引用的IR节点对象的集合。
此外,在所讨论的实施例中,IR的产生使用与对象架构的特定特征对应的抽象寄存器定义集,其中,对象程序17将在该对象架构上运行。例如,存在用于对象架构上的每个物理寄存器(即,图1的对象寄存器5)的独有寄存器定义。这样,翻译器中的抽象寄存器定义可以被实现为包含对IR节点对象(即,IR树)的引用的C++对象。被所述抽象寄存器定义集引用的所有IR树的总和被称为工作IR森林(“森林”缘自其包含多个抽象寄存器根,每个抽象寄存器根引用IR树)。适宜地,这些IR树和其它处理形成翻译器19的一部分。
图2更详细地示出在目标计算平台10上运行时的翻译器19。如上所述,翻译器19的前端包括解码器单元191,该解码器单元191将对象程序17的当前所需的部分解码以提供多个对象代码块171a、171b、171c(通常均包含对象代码的一个基本块),并且还可提供关于每个对象块以及其中包含的对象指令的解码器信息172,该信息将帮助翻译器19随后的操作。在一些实施例中,翻译器19的内核中的IR单元192从解码的对象指令生成中间表示(IR),关于中间表示适宜地执行优化。作为翻译器19的后端部分的编码器193产生(培育)可由目标处理器13执行的目标代码21。在该简化示例中,产生三个目标代码块211a-211c,以便与在对象平台1上执行对象代码块171a-171c等效地在目标平台10上执行工作。此外,适当的是,编码器193可以为目标代码块211a-211c中的一些或所有目标代码块211a-211c产生头部代码和/或页脚代码212,所述代码212执行诸如设置目标块将操作的环境以及适当时将控制传递回翻译器19的功能。
图3是示出本发明实施例所采用的设备的更详细的示意图。在图3的示意性示例中,翻译器19被设置为执行SPARC到x86的翻译。
对象代码17包括对象可执行文件17a,对象可执行文件17a将被翻译为目标代码21a。对象可执行文件17a可依次引用和利用来自多个对象库的函数,所述多个对象库包括专有库和/或系统库。示出了两个示例性的库17b、17c。
对象可执行文件17a根据与对象处理器的操作系统兼容的可执行文件格式被构建。通常,对象可执行文件17a包括代码主体17a_1和头部17a_2。头部17a_2提供关于代码主体17a_1的信息,例如,用于解析对象可执行文件的信息以及当对象可执行文件17a运行时用于执行动态链接的信息。尽管被称为“头部”,但是头部17a_2可整体或部分地驻留在远离对象可执行文件17a的开始的位置。
在图3的示意性的示例中,对象可执行文件17a根据可执行链接格式(ELF)被构建。ELF标准被广泛使用,这种结构的文件的头部17a_2包含关于与对象可执行文件17a相关联的过程链接表(PLT)17d的信息。
当对象代码17在对象处理器3上本地运行时,通过PLT 17d(PLT)的使用以及对象链接器代码17e来管理对象可执行文件17a中的对函数库17b、17c的调用。在这种意义下,对象链接器代码17e使用PLT 17d作为中间控制结构,来处理对象可执行文件17a中的动态链接的函数。
对象函数调用被设置为将控制流传递给对象链接器代码17e,对象链接器代码17e被设置为修改PLT 17d中的与对象函数调用相关联的链接信息,由此将对象函数调用链接到用于执行该函数的对象代码。
在本文的介绍部分描述了这样的过程,通过该过程,当对象代码在对象处理器上本地运行时,使用PLT 17d来将对象可执行文件17a中的函数调用链接到对象库17b中的函数,并且该过程对本领域技术人员是已知的。可在http://docs.sun.com/app/docs/doc/817-1984/6mhm7pllb获得关于Solaris中的运行时链接和PLT的使用的更多信息。
图3中还示出了用于执行链接监察功能的对象代码,在下文中被称为链接监察器17f。在Solaris操作系统中,链接监察器17f可通过使用与由该操作系统提供的链接监察接口相兼容的代码来监控链接器活动。Solaris链接监察接口被称为rtld监察(rtld-audit)。可以在http://docs.sun.com/app/docs/doc/817-1984/6mhm7p124获得关于rtld监察的更多信息。
如果符合rtld监察接口的链接监察器被加载作为可执行文件的一部分,则包含在其中的监察例程在链接器执行的各个阶段被对象链接器代码17e自动调用。rtld监察接口的使用使得链接监察器能访问关于加载的对象(诸如对象代码可执行文件17a以及对象库17b和17c)的信息。此外,链接监察器可访问关于在加载的对象之间生成的关联的信息以及与应用和库之间的信息传递相关的信息。可在http://docs.sun.com/app/docs/doc/806-0641/6j9vuqujm获得更多信息。
在由链接器执行的PLT更新期间,链接监察器还可监控函数调用的各个调用以及函数调用的返回值。
如果正在对象处理器3上被本地执行,则对对象库17b中的函数的调用会将对象控制流传递给PLT 17d,然后将对象控制流传递给对象链接器代码17e。对象链接器代码17e将修改驻留在PLT 17d中的与对象函数调用相关联的链接信息,由此将对对象函数的PLT入口的随后调用链接到用于执行驻留在对象库函数17b中的函数的相关对象代码。
函数链接表产生-使用链接监察器监控链接器活动
在产生与对象可执行文件17a对应的目标代码21之前,翻译器19通过参照对象可执行文件17a的头部17a_1和/或通过执行对象可执行文件17a的一个或多个扫描,来收集关于对象可执行文件17a的信息。翻译器19使用收集的信息,以识别与对象可执行文件17a相关联的PLT 17d。
在翻译器19已经收集了关于对象可执行文件17a的信息之后,翻译器19首次处理完对象可执行文件17a,这样做建立了对象可执行文件17a中的动态链接的函数调用和用于执行对应函数的代码之间的链接。
当翻译器19处理完对象可执行文件17a时,针对翻译器19中保存的函数链接表(FLT)19a检查在对象代码17中遇到的每个动态链接的函数调用。正如对对象代码17的首次翻译所期望的那样,如果遇到了这样的函数调用,即,在FLT 19a中不存在对于该函数调用的入口,则通过PLT 17d使对象代码17的控制流跟随链接器代码17e。然后,翻译器19可继续处理用于执行该函数的代码。
链接器17e将链接信息传递给链接监察器17f,翻译器19使用该信息以将入口添加给FLT 19a。具体地讲,翻译器19接收并存储对象可执行文件17a调用的每个函数的标识符以及该函数的位置。FLT 19a中的每个入口包括函数标识符以及对应函数的位置。但是,翻译器19不产生这样的目标代码,所述目标代码包括对通过链接器代码17e更新的PLT区域17d的翻译。
在上面描述的示例性实施例中,在构建FLT 19a的过程中,翻译器19使用与rtld监察接口相兼容的链接监察器17f。但是,其它示例性实施例可采用不同的技术来识别链接器活动,由此对FLT 19a进行添加并维持FLT 19a。
函数链接表产生-链接器活动的直接监控
在另外的示例性实施例中,可使用可选的机制,以检测对PLT 17d的修改,并确定代码的位置,其中,所述代码用于执行由对象可执行文件17a调用的动态链接的对象函数。在这样的实施例中,翻译器19可从可执行文件的文件格式的知识中识别PLT。当链接器通过检测对象代码指令的特征序列来修改PLT时,翻译器通过使用关于PLT区域的位置的信息可识别链接器的操作。在从SPARC进行翻译的示例中,对象指令高速缓冲存储器清空指令的特征序列可被检测,所述清空指令影响识别的PLT区域。
当对象代码中的控制流从PLT传递到链接器中时,并且当链接器进行响应而修改PLT入口时,对象代码指令高速缓冲存储器清空指令被执行。一旦已经发生了适当顺序的清空时,翻译器可读取修改的PLT区域,以确定用于执行由对象可执行文件调用的函数的代码的地址。该地址可用于创建对象可执行文件中的动态链接的函数调用与用于执行该函数的代码之间的关联。但是,翻译器不产生与PLT区域提供的中间控制结构的修改对应的目标代码。如前所述,翻译器可在FLT中存储函数身份以及用于执行该函数的代码的地址。
使用函数链接表中的信息
在典型的应用中,翻译器19很有可能将遇到包含一个或多个动态链接的函数调用的对象代码17,其中,已经为所述动态链接的函数调用产生了FLT入口。例如,可能需要翻译器再次翻译对象代码的先前翻译过的部分。在这些情况下,遇到了这样的函数调用,在FLT 19a中存在针对所述函数调用的相应入口。然后,翻译器19可使用先前记录在FLT 19a中的信息,以建立对象代码中的函数调用与用于执行该函数的对应代码之间的关联。所述关联可方便地是直接链接的形式。
特定函数调用的再次翻译绕过PLT 17d和链接器代码17e,并且使得翻译器19能够有效地将动态链接的函数调用与用于执行该函数的相关代码相关联。即,使用FLT将对象代码中的函数调用与用于执行该函数的对应代码相关联不包括产生与对象代码中的中间控制结构对应的目标代码。用于修改驻留在PLT 17d中的与所涉及的函数调用相关的链接信息的对象链接器代码17e也不被翻译。在再次翻译期间,对象链接器代码17e在对象代码中被绕过,并且因此不被翻译器19访问。
如上所述,当翻译器19首次处理完对象代码的一部分时,翻译器19对FLT 19a进行添加。由于翻译器19避开了链接器代码17e并使用FLT 19a中的信息,所以随后的再次翻译将比首次翻译更有效率。再次翻译不需要翻译器19对FLT 19a进行添加。
间接函数调用
翻译器遇到的一些动态链接的函数调用将会是间接函数调用。间接函数调用是取决于变量的值的调用。变量的值确定调用的位置,并且变量的值可以改变。因此,翻译器只有在该翻译器执行与间接函数调用对应的目标代码的时候才能确定用于执行所需的函数的代码的位置。
如上面参照图1所述,当翻译器遇到函数调用时,翻译器建立新的基本块。翻译器可针对存储在FLT中的信息检查间接函数调用所引用的对象地址。如果在FLT中已经存在所述地址,则翻译器必然先前遇到过对该函数的调用,其中,间接函数调用当前正在引用所述函数。然后,翻译器可将先前建立的与该函数调用相关的基本块看作与新建立的基本块执行相同的功能。通过使翻译器能够使用先前建立的基本块代替新建立的基本块,这还可减少需要翻译器执行的工作量。
将对象代码中的动态链接的函数调用与除对象代码外的代码相关联
在上述实施例中,在FLT中保持的位置方便地是用于执行对应函数的对象代码指令的地址。但是,在本发明的其它实施例中,FLT入口可被翻译器19选择,从而FLT中的地址指向用于执行对应函数的其它代码。通过按照这种方式使用FLT,翻译器可减少它的工作负荷。FLT入口可被翻译器选择以指向下列中各项的任何一个:
先前翻译的目标代码;
目标操作系统20的本地库28中的函数;
翻译器已知的优化的IR的部分,其中,从该优化的IR的部分可方便地产生目标代码;或者
解引用的(de-referenced)变量,该解引用的变量表示或可用于产生对象代码(或上述各项之一)的位置。
如上所述的解引用的变量的使用允许翻译器对函数调用与用于执行对应函数的代码之间的关联行使更大的控制。这在用于执行特定函数的代码的位置在对象函数的当前调用期间没有被固定的情况下是所期望的。
在示意性的示例中,翻译器19被设置为执行SPARC到x86的翻译。SPARC目标系统库可包含用于执行一个或多个函数的例程,对于所述例程严格定义了执行关于特定自变量的函数的结果。这样严格定义的函数被称为ABI“点”(dot)函数,并且包括例如一些范围内的数学函数,诸如.umul、.smul等。在http://www.sparc.com/standards/psABI3rd.pdf提供了这些ABI点函数的文件。
由于ABI点函数的运算被严格定义,所以翻译器可将被识别为对ABI点函数的调用的函数调用看作与ABI点函数具有相同效果的简单指令。这使得翻译器能够通过例如建立FLT入口并将函数调用与用于执行相应函数的非对象代码的一部分直接相关联,来完全绕过PLT。通过这种方式绕过PLT减少了翻译器的工作负荷。此外,在该示例中,翻译器可通过添加具有相关的ABI点函数的效果的代码替换函数调用本身,来完全避免与处理函数调用相关联的工作。
翻译器19可识别对这样对象函数的调用,所述对象函数具有与本地函数库的已知对应关系,使用与本地函数库的已知对应关系来减少翻译器的工作负荷。例如,对对象库17c中的memcpy的调用可在FLT 19a中与本地库28中的本地x86等效物的位置相关联。这消除了翻译memcpy函数的对象(SPARC)版本的成本。另外,memcpy函数的本地(x86)版本适合于本地硬件的复杂环境,并且可按照对于该硬件最有效的方式来实现函数的期望效果。
图4是示出处理动态链接的函数调用的方法的示例性实施例的示意性流程图。对象代码被接收,并且被扫描以识别PLT区域(步骤101)。动态链接的函数调用在对象代码中被识别(步骤102),该动态链接的函数调用被设置为将对象控制流传递给对象链接器代码(对象链接器代码用于修改PLT中的与对象函数调用相关联的链接信息),由此将对象函数调用链接到用于执行该函数的对象代码。针对与识别的函数调用对应的入口检查FLT(步骤103),并且如果FLT包含相关的入口,则该方法进行到步骤107,在步骤107产生目标代码,在该目标代码中,函数调用与用于执行该函数的代码相关联。在步骤107建立的关联基于存储在FLT中的函数标识符和位置。产生的目标代码不包括与由PLT提供的中间控制结构对应的目标代码。
如果在步骤103确定FLT不包含识别的函数调用的相关入口,则链接监察器可进行操作以获得函数标识符和位置(步骤104),和/或可通过监控对象代码指令高速缓冲存储器清空来获得函数标识符和位置(步骤105)。在步骤104和/或步骤105获得的信息然后输入到FLT(步骤106)。其后,基于在步骤104和/或步骤105获得的信息,步骤107被执行。
在上面详细描述的示例性实施例中,在翻译器可访问的对象代码的主体中存在对象链接器代码。但是,在其它实施例中,可由翻译器使用为了在目标处理器上执行而专门编写的目标代码(诸如图3中所示的链接器代码19e),来提供用于执行对象代码中的链接的链接器功能。此外,虽然示例性实施例集中于与对象可执行文件相关联的PLT,但是对象库17b、17c也可包括按照它们自己的PLT区域的形式的中间控制结构。这里所描述的方法和设备可同等地应用于这些PLT区域,或者可同等地应用于包括中间控制结构并导致相应问题的其它可识别的代码的部分。
通过使用这里所描述的技术,翻译器19不需要遵循对象代码的控制流来产生与中间控制结构(诸如PLT等)中的间接链接信息的更新对应的翻译,因此翻译器19可避免翻译对象代码的包含在运行时修改的高度集中的代码的那部分的处理和存储器成本。
另外,已经描述了对于翻译器不执行包含间接链接信息的更新的对象代码的情况进行处理的有效机制。
具体地讲,发明人已经开发了在执行程序代码转换的计算机系统中有用的方法和单元。这些方法和单元在与建立有运行时翻译器的计算机系统一起使用时是特别有用的,所述运行时翻译器提供对象程序代码到目标代码的动态二进制翻译。
本发明还扩展到用于执行这里所限定的任何一种方法的翻译器设备。另外,本发明扩展到记录有指令的计算机可读存储介质,所述指令可由计算机执行,以执行这里所限定的任何一种方法。
可以利用专用的硬件单独地构造本发明的至少一些实施例,这里所使用的诸如“模块”或“单元”的术语可包括(但不限于)执行特定任务的硬件装置,如现场可编程门阵列(FPGA)或专用集成电路(ASIC)。可选地,本发明的元件可构造为驻留于可寻址的存储介质上,并被构造为在一个或多个处理器上执行。因此,在一些实施例中,本发明的功能元件可包括例如组件(诸如软件组件、面向对象的软件组件、类组件和任务组件)、进程、函数、属性、过程、子例程、程序代码段、驱动程序、固件、微码、电路、数据、数据库、数据结构、表、数组和变量。此外,尽管已参照这里所讨论的组件、模块和单元描述了优选实施例,但是这些功能元件可被组合为更少的元件或者被分离为另外的元件。
在上面的每个实施例中单独描述了本发明的设备和方法的不同特征。但是,本发明的发明人全部意图在于,这里所描述的每个实施例的各个方面可与这里所描述的其它实施例相结合。
本领域技术人员应该理解,在不脱离本发明的范围和精神的情况下,可对所描述的优选实施例进行各种改变和修改。因此,应该理解,在权利要求的范围内,可不同于这里的详细描述来实施本发明。
尽管已经显示和描述了一些示例实施例,但是本领域技术人员应该理解,在不脱离权利要求中限定的本发明的范围的情况下,可以进行各种改变和修改。
需要注意与本说明书同时提交或者在本说明书之前提交的与本申请相关的对公众对本说明书的检查公开的所有文件和文档,所有这些文件和文档的内容通过引用包含于此。
本说明书(包括权利要求、摘要和附图)中公开的所有特征和/或所公开的任何方法或处理的所有步骤可以按照任何组合方式进行组合,除了其中至少一些这样的特征和/或步骤互相排斥的组合。
本说明书(包括权利要求、摘要和附图)中公开的每一特征可以被起到相同、等同或相似目的的可选特征来替换,除非另外明确地声明。因此,除非另外明确地声明,所公开的每一特征仅是一类等同或相似特征的一个示例。
本发明不限于前述实施例的细节。本发明扩展至本说明书(包括权利要求、摘要和附图)中所公开的特征中的任何新颖的特征或任何新颖的特征组合,或者扩展至所公开的任何方法或处理的步骤中的任何新颖的步骤或任何新颖的步骤组合。

针对程序代码转换处理动态链接的函数调用的方法和设备.pdf_第1页
第1页 / 共24页
针对程序代码转换处理动态链接的函数调用的方法和设备.pdf_第2页
第2页 / 共24页
针对程序代码转换处理动态链接的函数调用的方法和设备.pdf_第3页
第3页 / 共24页
点击查看更多>>
资源描述

《针对程序代码转换处理动态链接的函数调用的方法和设备.pdf》由会员分享,可在线阅读,更多相关《针对程序代码转换处理动态链接的函数调用的方法和设备.pdf(24页珍藏版)》请在专利查询网上搜索。

提供一种在动态二进制翻译器中将对象代码翻译为目标代码期间处理动态链接的对象函数调用的方法,所述动态链接的对象函数调用被设置为将对象控制流传递给诸如过程链接表的中间控制结构,然后将对象控制流传递给用于修改与对象函数调用相关联的链接信息的对象链接器代码。在对象处理器上执行的对象代码被翻译器接收,并且在目标处理器上执行的对应目标代码被产生。翻译器被设置为建立包含入口的函数链接表,所述入口给出对象代码所调。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1