首页> 中国专利> 通过不可见接口实现不符合ABI特征的方法和系统

通过不可见接口实现不符合ABI特征的方法和系统

摘要

公开了多种通过不可见接口实现不符合ABI特征的方法和系统,用于编译一代码模块以允许调用例程将参数传递到单独编译的代码模块的被调用例程,并且允许被调用例程通过多个接口从单独编译的代码模块的调用例程接收参数。接口可以包括规范接口和备选接口。调用例程可以被配置为通过备选接口传递参数,并且调用被调用例程的备选入口点。相关联的存根例程可以被配置为通过规范接口传递参数并调用被调用例程的规范入口点。如果被调用例程包括相对应的备选入口点,则调用例程可以被链接到备选入口点。否则,被调用例程可以通过存根例程被链接到被调用例程。

著录项

  • 公开/公告号CN102222017A

    专利类型发明专利

  • 公开/公告日2011-10-19

    原文格式PDF

  • 申请/专利权人 英特尔公司;

    申请/专利号CN201110126383.3

  • 发明设计人 Z·安萨里;

    申请日2011-04-13

  • 分类号G06F9/46(20060101);G06F9/45(20060101);

  • 代理机构72002 永新专利商标代理有限公司;

  • 代理人刘瑜;王英

  • 地址 美国加利福尼亚

  • 入库时间 2023-12-18 03:34:35

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2022-04-08

    未缴年费专利权终止 IPC(主分类):G06F 9/46 专利号:ZL2011101263833 申请日:20110413 授权公告日:20140319

    专利权的终止

  • 2014-03-19

    授权

    授权

  • 2011-11-30

    实质审查的生效 IPC(主分类):G06F9/46 申请日:20110413

    实质审查的生效

  • 2011-10-19

    公开

    公开

说明书

背景技术

在计算机程序中,第一编译模块的调用例程可以通过接口向单独编译的第二编译模块的被调用例程传递一个或更多个参数的组,并且编译模块可以随后被链接以在计算机系统中执行。

接口可以符合公认规范或标准,诸如应用程序二进制接口(ABI)。ABI可以描述计算机程序之间的底层接口,并且可以处理调用规范细节,例如数据类型、大小、对齐,以控制函数变量或者参数的传递与返回。在WindowsIA-32和Linux调用规范下,例如,函数参数在调用堆栈上被传递。

底层软件编写者或编译器可以构建不遵循规范的接口,或修改现有接口以使得接口不再遵循规范。在32位Windows或Linux环境中,例如,接口可以被修改为通过寄存器传递参数以避免与调用堆栈相关联的存储器加载/存储操作。

传统上,当修改器(编程器或编译器)能够访问被调用例程和被调用例程的所有调用例程时,接口可以被构造或修改为与规范相反。在不是所有的调用例程都可用时,可用的调用例程的接口可以被修改,假设被调用例程被配置为适应所修改的接口和规范接口二者,其可以由其他调用例程使用。换句话说,被调用例程和至少一个调用例程被修改。

附图说明

图1是包括第一和第二代码模块和相对应的第一和第二编译模块的计算环境的图形描述。

图2是包括调用例程和存根例程的编译模块的图形描述。

图3是包括被调用例程的编译模块的图形描述。

图4是编译一代码模块的方法的流程图,该代码模块可以包括调用例程和/或被调用例程。

图5是编译一代码模块以通过多个接口中的一个接口从调用例程向另一个编译模块的被调用例程传递参数组的方法流程图。

图6是编译一代码模块以向被调用例程提供多个入口点以通过多个相对应的接口中的一个接口接收参数组的方法的流程图。

图7是将第一编译模块的调用例程链接到第二编译模块的被调用例程的方法的流程图。

图8是包括图2和图3中的编译模块的计算机系统的图形描述,其中调用例程的调用被链接到被调用例程的备选入口点。

图9是包括图2的编译模块和图1的编译模块的另一个计算机程序的图形描述,其中调用例程的调用被链接到存根例程,并且存根例程的调用被链接到被调用例程的入口点。

图10是包括调用例程用以通过单个接口传递来自多个相对应的位置的多个参数的编译模块的图形描述。

图11是包括调用例程用以通过多个接口中的一个接口来选择性传递参数组的另一个编译模块的图形描述。

图12是被配置为编译一代码模块并链接一编译模块的计算机系统的框图。

附图中,最左边附图标记标识了其中第一次出现该附图标记的图。

具体实施方式

本文公开了方法和系统,其配置具有多个接口的调用例程以将参数组传递到单独编译的被调用例程,并且基于被调用例程的配置通过多个接口中的一个或更多个接口而链接一编译调用例程和一编译被调用例程。多个接口可以包括规范接口(interface by convention)和备选接口(alternate interface)。本文还公开了方法和系统,其配置具有多个入口点的被调用例程以通过多个对应接口中的一个接口从另一个编译模块接收参数组。

图1是分别包括第一和第二代码模块102和104的计算环境100的图形描述。代码模块102和104可以包括源级代码和/或中间级代码。

代码模块102包括调用例程106,该调用例程106具有对代码模块104的被调用例程110的调用108。

调用108可以包括名字112以及在运行时要被传递给被调用例程110的一个或更多个参数(例如,PARM1和PARM2)的组114的指示或标识。

被调用例程110可以包括函数代码111,用以执行与参数组相关的一个或更多个函数。

环境100可以包括编译器116,用以将一代码模块102和104编译为相对应的第一和第二编译模块118和120。可替代地,代码模块102和104之一可以由另一个编译器编译。编译模块118和120可以包括机器可读代码。

编译模块118包括与调用例程106相对应的调用例程122。调用例程122包括与调用例程106的调用108相对应的调用126。

编译模块120包括与被调用例程110相对应的被调用例程124,该被调用例程124具有用名字112标识的入口点125。被调用例程124还包括与函数代码111相对应的函数代码128。

当代码模块102和104被彼此单独编译时,调用例程122和被调用例程124可以被配置为根据规范和/或标准而传递参数组114,这可以包括但不限于在调用堆栈上传递参数。

在图1的例子中,调用例程122包括接口代码130,用以通过调用堆栈传递参数组114,并且被调用例程124包括接口代码132,用以在进入一入口点125后通过调用堆栈接收参数组114。调用堆栈和任何格式化要求可以被称为接口。

编译器116包括规范接口构造器142,用以根据规范构造接口代码130,以及规范入口点构造器144,用以根据规范构造入口点125和相对应的接口代码132。

可替代地,当编译模块118或者编译模块120由另一个编译器生成,相对应的接口代码可以由其他的编译器生成。

环境100可以包括链接系统136,用以链接编译模块118和120,以允许计算机系统将编译模块118和120作为集成计算机程序137来执行。图1包括从调用126到被调用例程124的入口点125的链接138。

在一些情况下,可以希望通过不符合规范的备选接口传递参数。例如,在图1中,被调用例程124的接口代码132被配置为将参数组114从调用堆栈分别加载到寄存器R1和R2。函数代码128可以被配置为访问寄存器R1和R2中的参数。在这种情况下,可以希望配置调用例程122和被调用例程124以通过寄存器R1和R2传递参数组114。

编译器116可以包括备选入口点构造器145,用以构造被调用例程中的备选入口点,例如下文参照图3所描述的。

编译器116还可以包括备选接口构造器146,用以构造被调用例程中的备选接口和相对应的对备选入口点的备选调用,例如下文参照图2所描述的。

编译器116可以被配置为针对调用例程构造一规范接口和一备选接口,其可以允许调用例程调用一适当修改的被调用例程或者一无修改的被调用例程。

类似的,编译器116可以被配置为针对被调用例程构造规范入口点、相对应的规范接口和备选入口点,其可以允许由适当修改的调用例程和无修改的调用例程来调用一被调用例程。

链接系统136可以被配置为,例如下文参照图8所描述的,当调用例程和被调用例程都被适当配置时,通过备选接口将调用例程选择性链接到被调用例程,否则例如下文参照图9所描述的,通过规范接口将调用例程选择性链接到被调用例程。

在上面例子中,备选接口、备选调用和备选入口点都被描述为由编译器116构造。可替代地,备选接口和相对应的备选调用、或者备选入口点可以在编译后被构造,例如响应于用户输入用机器代码编辑器进行。

图2是包括调用例程202和存根例程(stub routine)204的编译模块200的图形描述。

编译模块200可以通过编译器116从图1中的代码模块102生成。可替代地,在图1中的编译模块118由另一个编译器生成的情况下,图2中的编译模块200可以从编译模块118构造或者修改,例如响应于用户输入由机器代码编辑器进行。

调用例程202包括对名字208的调用206,在这里被说明为Bar_bair_2。调用例程202还包括相对应的接口代码210,用以通过第一接口传递参数组114(例如PARM1和PARM2),所述第一接口在这里被说明为寄存器R1和R2。第一接口可以对应于备选接口,而调用206可以被称为备选调用。

名字208可以根据图1中的调用例程106的名字112来生成。名字208还可以根据第一接口的名字和参数组114中参数的数目来生成。例如,“bair”可以表示“寄存器中的盲变量(blind arguments in registers)”,“2”可以表示参数组114中的参数的数目。名字208可以被称为备选名字。

存根例程204包括对名字112的调用126,以及相对应的接口代码218,用以通过第二接口(例如调用堆栈)传递来自第一接口(例如R1和R2)的参数组114。接口代码218可以对应于规范接口。

存根例程204可以与调用例程202相关联以允许链接系统136来将调用例程202链接到存根例程204。例如,存根例程204的入口点212可以被命名为备选名字208的“弱”版本,在这里说明为weak.Bar_bair_2。

图3是包括被调用例程302的编译模块300的图形描述。

编译模块300可以由编译器116从图1的代码模块104生成。可替代地,在图1中的编译模块120由另一编译器生成的情况下,编译模块300可以从编译模块120构造或者修改,例如响应于用户输入由机器代码编辑器进行。

被调用例程302包括入口点125,并且相对应的接口代码132通过调用堆栈接收参数组114,例如上文参照图1中的被调用例程124所描述的。入口点125可以对应于规范入口点,并且接口代码132可以对应于规范接口。

被调用例程302可以包括备选入口点304,这里说明为在接口代码132和函数代码128之间。

接口代码132可以被配置为将参数组114从调用堆栈移动到寄存器R1和R2,以及函数代码126可以被配置为访问在寄存器R1和R2处的参数组114,例如上文参照图1中的被调用例程124所描述的。

在这种情况下,备选入口点304不需要对应的接口代码。在其他情况下,入口点304可以包括接口代码,用以重定位和/或格式化参数组114。

下面将参照图4-7以及参照本文一个或更多个其它例子而公开示例方法。然而,图4-7的例子并不限于这些其他例子。

图4是编译一代码模块的方法400的流程图,该代码模块可以包括调用例程和/或被调用例程。

在402,接收代码模块。在图1中,编译器116可以接收代码模块102和/或代码模块104。

在404,评估代码模块中的调用例程,例如图1中的调用例程106。在调用例程调用未出现在代码模块中的名字的情况下,处理进行到406,在406根据下文描述的图5来编译调用例程。可以针对一个或更多个另外的调用例程而重复在404的评估和在406的编译。

在408,评估代码模块中的被调用例程。在可以从代码模块外部调用该被调用例程的情况下,处理进行到410,在410根据下文描述的图6来编译被调用例程。可以针对一个或更多个另外的被调用例程而重复在408的评估和在410的编译。

在412,代码模块的其他代码例如可以根据传统编译技术被编译。

上面参照图4公开的特征和/或其部分可以用彼此相对的各种序列中的一种或更多种序列来执行,彼此并行地执行,和/或以综合方式来执行。

图5是编译一代码模块以通过多个接口中的一个接口从调用例程向另一编译模块的被调用例程传递参数组的方法500的流程图。

在502,调用例程在代码模块中被识别为具有对未在代码模块中出现的名字的调用。

在504,生成备选点名字。备选点名字可以根据调用名字、第一接口的指示、和通过第一接口传递的参数的数目来生成。

在506,生成备选名字的弱版本,例如上文参照图2中的入口点212所描述的。

在508,调用例程被编译以调用备选名字并且通过第一接口传递参数组,例如上文参照图2中的调用例程202所描述的。

在510,第一代码模块被编译以包括存根例程,用以调用所述名字并且通过第二接口传递来自第一接口的参数组。存根例程或者存根例程的入口点用备选名字的弱版本被标识,例如上文参照图2中的存根例程204所描述的。

图6是编译一代码模块以向被调用例程提供多个入口点以通过多个对应接口中的一个接口接收参数组的方法600的流程图。

在602,被调用例程在代码模块中被标识为可从代码模块外部被调用。

在604,生成备选入口点名字。备选入口点名字可以根据被调用例程的名字、备选接口的指示和通过备选接口传递的参数的数目来生成。

在606,被调用例程被编译为包括第一入口点,用于通过规范接口接收参数组,和备选入口点,用于通过备选接口接收参数组。可以用被调用例程的名字标识第一入口点,并且可以用备选入口点名字标识备选入口点,例如上文参照图3中的被调用例程302所描述的。

图7是将第一编译模块的调用例程链接到第二编译模块的被调用例程的方法700的流程图。

在702,例如在图1的链接系统136处,接收第一和第二编译模块。第一编译模块可以对应于图2中的编译模块200。第二编译模块可以对应于图1的编译模块120或者图3的编译模块300。

在704,识别根据方法600配置的第一编译模块的调用例程和相关联的存根例程。调用例程和相关联的存根例程可以对应于图2中的调用例程202和存根例程200。

在706,识别第二编译模块的被调用例程,该被调用例程具有与存根例程的调用相对应的第一入口点。被调用例程可以对应于图1中的被调用例程124或者图3中的被调用例程302。

在708,评估被调用例程。在被调用例程包括如上面参照图6中的606所描述的备选入口点的情况下,处理进行到710。在被调用例程不包括这种备选入口点的情况下,处理进行到712。

在710,调用例程链接到被调用例程的备选入口点。图8是计算机程序800的图形描述,计算机程序800包括图2的编译模块200和图3的编译模块300,其中调用206用链接802被链接到被调用例程302的备选入口点304。

在712,调用例程被链接到存根例程,且存根例程被链接到被调用例程的第一入口点。图9是计算机程序900的图形描述,包括图2的编译模块200和图1的编译模块120,其中调用206用链接902被链接到存根例程204,并且存根例程204的调用126用链接904被链接到被调用例程124的入口点125。

在上面的例子中,两个参数(PARM1和PARM2)通过寄存器R1和R2或者通过调用堆栈来传递。然而,此处公开的方法和系统并不局限于寄存器或者调用堆栈。

备选接口可以被配置为执行任务和/或逻辑操作。下面公开了示例任务和逻辑操作。然而,备选接口并不局限于下述例子。

备选接口可以被构造为组合来自多个位置的多个参数,并且通过单个位置传递组合参数,例如如下面参照图10所描述的。

备选接口可以被构造为通过多个可选择的接口中的一个接口传递参数组,例如如下面参照图11所描述的。

备选接口可以被构造为通过第一接口传递第一参数组以及通过第二接口传递第二参数组。

图10是编译模块1000的图形描述,包括调用例程1002和存根例程1004。调用例程1002可以包括备选调用1006和相对应的备选接口代码1008,用以通过单个备选接口(这里被说明为寄存器R1)传递来自多个位置的多个参数。备选接口代码1006可以被配置为在加载到寄存器之前组合或者操纵参数。存根例程1004可以配置为按规范传递多个参数,例如上面一个或更多个例子所描述的。

图11是编译模块1100的图形描述,包括调用例程1102和存根例程1104。调用例程1102包括多个备选调用1106和1108,被指向被调用例程的相应多个备选入口点。备选调用1106包括备选接口代码1110,用以通过第一备选接口(此处说明为寄存器R1和R2)传递参数组。备选调用1108包括备选接口代码1112,用以组合参数组并且通过第二备选接口(此处被说明为寄存器R1)传递组合参数组。

调用例程1102还包括状态确定逻辑(contingency logic)1114和1116,用以基于状态(contingency)“A”来选择性调用备选调用1106或者备选调用1108。状态可以涉及一个或更多个参数的值和/或一个或更多个条件。

存根例程1104可以配置为当被调用例程不包括备选入口点时根据规范传递参数组。

本文公开的一个或更多个特征可以用硬件、软件、固件以及其结合实现,包括分立或者集成电路逻辑、专用集成电路(ASIC)逻辑和微控制器,并且可以被实现为特定领域集成电路封装的部分、或者集成电路封装的结合。如本文所使用的术语软件、代码和指令是指计算机程序产品,其包括其中存储有计算机程序逻辑的计算机可读介质,以使得计算机系统执行本文公开的一个或更多个特征和/或特征的结合。

图12是示例性计算机系统1200的框图,包括一个或更多个计算机指令处理单元(如这里所说明的处理器1202)以执行计算机程序产品逻辑。

计算机系统1200包括一个或更多个存储器、高速缓存、寄存器和存储设备(下文称为“存储器”)1204。

存储器1204包括计算机可读介质,其上存储有计算机程序产品逻辑1206以使得处理器1202响应于其而执行一个或更多个功能。

存储器1204还包括由处理器1202在执行逻辑1206中使用的数据1208、和/或由处理器1202响应于对逻辑1206的执行而生成的数据1208。

数据1208可以包括图1中的代码模块102和/或代码模块104。

逻辑1206包括编译器逻辑1210,用以使得处理器1202编译一代码模块102和/或一代码模块104以生成相对应的编译模块200和300,例如上文一个或更多个例子中所描述的。可替代地,代码模块102或代码模块104可以被另一个编译器编译以分别生成编译模块118或者编译模块120。

编译器逻辑1210可以包括规范接口逻辑1212以使得处理器1202生成接口代码以允许调用例程按照规范传递参数组,例如上文一个或更多个例子中所描述的。

编译器逻辑1210可以包括备选接口逻辑1214以使得处理器1202生成备选接口代码以允许调用例程通过备选接口传递参数组,例如上文一个或更多个例子中所描述的。

编译器逻辑1210可以包括规范入口点逻辑1216以使得处理器1202构造入口点和相对应的接口代码来允许被调用例程按规范接收参数组,例如上文一个或更多个例子中所描述的。

编译逻辑1210可以包括备选入口点逻辑1218以使得处理器1202构造备选入口以允许被调用例程通过备选接口接收参数组,例如上文一个或更多个例子中所描述的。

逻辑1206可以包括链接逻辑1220以使得处理器1202链接多个编译模块,这包括选择性链接调用例程到被调用例程的备选入口点,或者通过存根例程链接调用例程到被调用例程,例如上文一个或更多个例子中所描述的。

计算机系统1200可以包括通信基础设施1240,用以在计算机系统1200内进行通信,以及输入/输出控制器1242,用以通过诸如因特网的网络通信系统连接一个或更多个其他计算机系统。

本文借助于功能构建块来公开方法和系统,以说明其功能、特征以及关系。为了描述的方便,一个或更多这种划分可以在本文被任意定义。可替代的划分可以被定义。

虽然本文公开了各种实施例,但是应该理解作为示例而非限制呈现了这些实施例。在不脱离本文所公开的系统和方法的精神和范围的情况下,可以在其中进行形式和细节上的各种改变,这对相关领域技术人员将是显而易见的。所以,权利要求的宽度和范围并不被本文公开的任何例子所限制。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号