字节序转换工具的制作方法

文档序号:6339316阅读:509来源:国知局
专利名称:字节序转换工具的制作方法
技术领域
本发明涉及字节序转换。
背景技术
字节序是数据存储和检索的属性。大字节序(endian)数据或变量可以以与小字 节序数据或变量相反的字节顺序被存储在存储器中。小字节序数据可以以最低有效字节在 最低的存储器字节地址中的方式被存储,而大字节序数据可以以最高有效字节在最低的存 储器字节地址中的方式被存储。具有相同值的大和小字节序变量在CPU寄存器中可以是相 同的,但是在存储器中可能具有不同顺序。在没有识别一些数据以如何的不同顺序被存储在存储器中的情况下,使用一种字 节序约定编写的源代码不可以在使用另一种字节序约定的平台上被执行。下面的C代码提 供一个例子
{
int i = 0x12345678; char c = *((char*)&i);
}
如果该代码被编译并且在大字节序架构上运行,则“C”将是0x12,但是如果该代码被 编译并且在小字节序架构上运行,则“C”将是0x78。因此,为了在另一种字节序约定的计算 机系统平台上执行以一种字节序约定编写的代码,可能需要字节序转换。当例如源代码包 括union (联合)或者将第一指针(其指向由多个字节构成的数据)转换(cast)为第二指针 (其指向由单个字节构成的数据)时,这会是困难的。指针会产生困难,因为一些双字节序编 译器不追踪通过指针(例如void指针)的字节顺序,并且不产生对通过这样的指针的潜在字 节顺序改变的诊断。因此,指针等会导致无法预料的字节顺序不相容性。

发明内容
根据本发明的第一方面,提供一种方法。所述方法包括接收分别定义全局变量的 第一和第二实例的第一和第二源代码部分,其中每个实例具有第一字节序格式并且这两个 实例在编译时间都不能被完全地初始化;生成对字节交换指令的第一和第二引用,其被配 置成分别将所述第一和第二实例转换成第二字节序格式;使用处理器来生成影子变量,所 述影子变量被配置成在编译时间之后并且基于所述第一实例已经被字节交换来抑制所述 第二实例的字节交换;以及将所述影子变量存储在耦合到所述处理器的存储器中。根据本发明的第二方面,提供一种包括介质的物品。所述介质存储用于使基于处 理器的系统能够执行以下操作的指令接收分别定义全局变量的第一和第二实例的第一和 第二代码部分,其中所述全局变量的每个实例具有第一字节序格式并且这两个实例在编译 时间都不能被正确地初始化;以及生成第一变量,所述第一变量被配置成在编译时间之后 并且基于所述第一实例已经被字节序转换来抑制所述第二实例的字节序转换。
根据本发明的第三方面,提供一种装置。所述装置包括耦合到存储器的处理器, 其执行以下操作(1)使用所述存储器接收分别定义全局变量的第一和第二实例的第一和 第二源代码部分,其中所述全局变量的每个实例具有第一字节序格式并且这两个实例在编 译时间都不能被完全地初始化;以及(2)生成第一变量,所述第一变量被配置成在编译时 间之后并且基于所述第一实例已经被字节交换来抑制所述第二实例的字节交换。


根据所附权利要求、以下对一个或多个示例实施例的详细描述、以及对应的图,本 发明的实施例的特征和优点将变得显而易见,其中
图1是用于本发明实施例中的方法的框图,其包括伪代码; 图2是用于本发明实施例中的方法的框图,其包括伪代码; 图3是本发明实施例中的方法的框图;以及 图4是供本发明实施例使用的系统框图。
具体实施例方式在以下描述中,阐述了许多具体细节。然而,应该理解,可以在没有这些具体细节 的情况下实践本发明实施例。公知的电路、结构和技术没有被详细示出以避免模糊对本描 述的理解。对“一个实施例”、“实施例”、“示例实施例”、“各种实施例”等等的提及表示,如 此描述的(一个或多个)实施例可以包括特定的特征、结构或特性,但不是每个实施例必定 包括所述特定的特征、结构或特性。此外,一些实施例可以具有针对其他实施例所描述的一 些、所有特征,或者不具有针对其他实施例所描述的特征。而且,如在此所用的“第一”、“第 二”、“第三”等等描述了共同的对象,并且表示相同对象的不同实例正在被提及。此类形容 词不打算暗示如此描述的对象必须或者在时间上、在空间上、按照等级或者以任何其他方 式处于给定的序列。而且,为了清楚,在此讨论的许多示例实施例提出编译器(例如C/C++ 编译器)以及其对源代码的应用,但是本发明实施例不必受限于此。例如,尽管实施例包括 解析代码,例如在编译器中所包括的解析工具,但是其他实施例可以包括在其他形式的代 码中所包括的解析代码。在本发明的一个实施例中,代码(例如编译器、工具)可以生成信息,因此包括第一 字节序格式(例如大字节序)的指针值的代码部分能够被适当地初始化并且在具有第二字 节序格式(例如小字节序)的平台上被执行。图1包括源代码110以及可执行代码150的直观表示。代码110可能易受“复制 问题”的影响。具体而言,代码Iio包括代码部分111、112。每个部分包括全局变量“g”的 实例。全程变量“g”可以被常规的编译器初始化两次一次在代码部分111的(int* _ attribute, ((bigendian)) g=&il)中,并且再一次在代码部分 Il2 的(int* _attribute_ ((bigendian)) g=&i2)中。初始化包括例如通过向程序中的变量/数据结构分配初始 值来定义变量的过程。代码部分111、112包括指针((int* ,attribute,((bigendian)) g=&il)和(int*_attribute_((bigendian)) g=&i2)),这两个指针具有大字节序属性但是 分别指向不同的地址。每个地址具有大字节序属性。这些地址涉及两个不同的对象((int _attribute_((bigendian)) il = 1;)禾口(int _attribute_((bigendian)) i2 = 2;))。编译器(例如双字节序编译器)可能尝试将源代码110从大字节序格式或约定转换成适合于具 有小字节序格式的平台的代码(例如可执行代码)。为了这样做,编译器可以对两个部分111 和112中的大字节序全局变量“g”执行例如字节交换操作。这可能导致“复制问题”,因为 “g”在第一字节序转换期间从大字节序被转换到小字节序,然后“g”在第二转换中从小字节 序被转换回到大字节序。因此,由于“g”被转换了两次,所以可能发生复制问题,从而颠倒 了所需的从大字节序到小字节序的转换。关于代码110可能如何导致复制问题的更具体的描述如下。两个源文件111、112 定义了全局大字节序变量“g”。常规的编译器可能基于不同的链接时间常量来初始化全局 大字节序变量“g”,即使直到在链接时间或在链接时间之后(即在编译时间之后)才知道链 接时间常量的地址(例如il或i2)也是如此。编译器可能不知道“g”的哪个特定值被链接 编辑器或系统载入器取得。因此,对于每个部分111、112,编译器生成用于“g”的交换操作, 即使“g”是直到在编译时间之后才能完全地初始化(即正确地初始化)的指针变量也是如 此。稍后,链接编辑器可能仅取“g”的一个实例,从而导致应用于“g”的单个实例的两个交 换操作。本发明的一个实施例如下解决了复制问题
{
If (g_shadow == FALSE)
{
Byteswap(g); g_shadow = TRUE; } else /* g已经被交换了一次,所以什么都不做*/
}
一般而言,以上伪代码说明,本发明实施例可以使用“影子变量”以确保全局变量“g”被 转换(例如被字节交换)一次,并且确保后续对转换“g”的尝试被抑制。在“g”的初始转换 时,变量“g_shadoW”被从“FALSE”改变成“TRUE”。此后,转换函数(例如字节交换函数)被 抑制,因为它以“g_shad0W”被设置为“FALSE”为条件。因此,在本发明的一个实施例中,对于利用非固有的(native)字节顺序的链接时 间常量初始化的每个全局变量,编译器可以在应用程序(application)内生成变量(例如不 可见的“影子变量”)。可以在特殊的影子段(section)内部分配影子变量,因此影子变量不 干扰应用程序变量。例如,对影子变量的引用可以与对原始变量的引用放在一起。一开始, 一些或所有影子变量可以利用“FALSE”值来初始化,这意味着对应的实际应用程序变量尚 未被交换。稍后,在数据初始化过程期间,在第一次字节交换操作被应用于对应的原始变量 时,“TRUE”值可以被放入每个影子变量中。一旦影子变量等于“TRUE”,则用于原始变量的 所有相继交换操作可以被抑制。因此,在本发明的一个实施例中,影子变量产生全局变量状 态的“影子”以指示该全局变量是已经被字节交换还是尚未被字节交换,并且有助于确保全 局变量仅被字节交换一次。 返回到图1,代码150是使用本发明实施例从源代码110产生的经编译代码的直 观表示。对于全局变量“g”,代码(例如编译器)可以在代码部分151和152这二者中生成 影子变量“g_shadoW”,因为这两个部分相关于源代码的包括“g”的部分(即代码部分111、112)。“g_shadoW”变量是从“.initdatajhadow”段分配的。“g_shadoW”变量的初始值是 “FALSE”。使用代码(例如链接器),对“g”的符号引用可以经由示意箭头154、155、157、159 被从“g”的弱实例(参见示意块170)转换(例如重定位)到“g”的强实例(参见示意块160)。 “弱”指定可以允许程序例如在程序执行期间改变变量的位置。相比之下,“强”指定不会允 许程序在程序执行期间改变变量的位置。变量的强定义可以改变由弱变量定义的位置,但 反过来并非如此。出于与以上关于“g”所讨论的相同原因,对“gjhadow”的符号弱引用(块175)还 可以经由示意箭头156、158被重定位到“8_吐3(1(^”的单个强实例(示意块165)。该重定 位可以基于由编译器提供的、与在块150中提供重定位方向的箭头一致的重定位信息。包 括对“g”和“g_shadoW”的重定位引用的代码版本没有在图1中示出,但是将关于图2被提 出。稍后,在后编译数据初始化过程中,第一字节交换操作可以被应用于“g”(其经由与箭 头155 —致的重定位信息被重定位),并且可以将“TRUE”置于“g_Shad0W”处(其经由与箭头 156 一致的重定位信息被重定位)。然后,当该过程遇到对于“g”的第二字节交换操作(其经 由与箭头159 —致的重定位信息被重定位)时,“g_Shad0W”已经具有“TRUE”值(其经由与 箭头158—致的重定位信息被重定位),并且交换操作因而没有被执行。因此,在实施例中, “g”仅被交换一次并且保持正确值。图2包括本发明的实施例。方法200包括源代码部分205,其类似于图1的部分 110。在块210中,应用程序被编译。当双字节序功能被启用时,编译器可以生成初始化数 据。由编译器提供的初始化数据或信息可以包括影子变量、交换g引用、以及与影子变量 和交换g引用相关的重定位信息。编译器可以将该初始化数据放入名为“.initdata”和 “.initdata_shadow"的特殊的可执行与链接格式(ELF)段中,如在块215中所示。块215 类似于图1的部分151。取决于编译器选项,该.initdata段可以被放入可载入段或注释段 中。在块220中,诸如图1的部分152之类的其他目标文件以与块215类似的方式被 处理以生成更多的.initdata段。然后,在块225中,链接器可以以由图1中的箭头所指示 的方式组合.initdata段并重定位g交换和影子变量(基于由编译器提供的重定位信息)。. initdata段可以来自各种目标文件,并且可以以链接的二进制来放置.initdata段。在块230中,使用后链接工具对代码进行后处理,所述后链接工具在本发明的一 个实施例中可以被包括在编译器中。在其他实施例中,所述后链接工具与编译器是分开的。 后链接工具可以读取可执行映像的.initdata段,并且对具有在链接期间未被正确计算的 值的数据执行初始化(例如,诸如“g”变量之类的全局变量地址)。因为可能留下未解析的 引用,所以该工具可以检查位置是否不具有与之相关联的重定位,例如针对图1所讨论的 那些重定位。在那种情况下,在运行时期间仅仅可以检测到正确值,并且这里不可以执行交 换,而是作为代替在块245中(参见下文)执行交换。否则,地址所指向的数据可以基于由编 译器提供的初始化信息而如在块235中所示的那样被字节交换。注意,在块235中,一些字 节交换现在已经发生(例如long swapped (&il)),并且来自块215的一些条目(例如g条 目)已经被去除。由于先前发生的重定位,所以存在单个section」initdata段。 在块240和245中,可以发生动态运行时初始化。如果从块230中的连编(build) 中留下未执行的字节交换(例如这可能对于动态链接的应用程序发生),则它们可以在块245中被执行,在块245中在应用程序进入用户代码之前它们或者通过例如与可执行程序 静态链接的运行时初始化例程(例如由编译器提供)或者通过经修改的操作系统(OS)载入 器进行。在运行时初始化的情况下,可能需要数据被定位到读_写(R/W)段以被OS载入。 由于由编译器提供的初始化信息,所以这些字节交换会是可能的。 在块250中,可以发生验证。例如,当应用程序启动时,可以执行检查以确保没有 剩余的未解析的.initdata记录留下。这样做可以避免由于在经初始化的数据内部丢失字 节序校正而引起的程序故障。编译器可以生成运行时检查,其确保初始化已经被适当地完 成。对于这种运行时检查的例子,编译器可以为每个编译单元创建大字节序“保护”变量。 该“保护变量”可以利用已知的链接时间常量值和例程来初始化,所述例程检查该值是否已 经被交换。如果没有发生这样的交换,则应用程序可以终止于错误状态。否则,该应用程序 可以在块255中继续进行。因此,本发明的各种实施例涉及针对在编译时间不能被完全地解析的数据初始化 的解决方案。例如,一个全局变量(例如来自图1的“g”)可以保持另一全局变量的地址。在 这种情况下,直到链接阶段才可能知道要被分配给该全局变量的确切值。在编译时间不能 被完全地解析的数据初始化的另一例子涉及动态链接的应用程序,其中仅在运行时的动态 链接阶段之后才知道最终值。如果假定实际的初始化值具有反向字节顺序,则它应该在动 态链接之后并且在程序执行之前的某一阶段被交换。在编译时间不能被完全地解析的数据 初始化的又一个例子涉及常用的允许变量的弱定义的应用程序二进制接口(ABI)。这样的 弱定义允许声明变量多于一次并且令链接器或载入器决定对象的哪个实例实际上被取得。本发明的各种实施例是基于工具的,并且可以使用标准ELF文件格式。这可以允 许用户把未经修改的基于ELF的工具(像链接器和操作系统(OS)载入器)用于本发明的实 施例。因此,在本发明的一个实施例中,期望移植(port)大字节序代码以在小字节序平 台上运行(或反之亦然)的程序员不需要重写他或她的完全在固有的单个字节序模式下运 行的应用程序。作为替代,可以以特定的字节序格式来指定源代码的部分,例如需要大字节 序格式以便与网络分组交互的组件。本发明的实施例于是可以提供将允许在稍后的时间对 代码部分进行适当初始化的数据。这些代码部分可以包括第一字节序格式(例如大字节序) 的指针值,所述指针值必须稍后在具有第二字节序格式(例如小字节序)的平台上执行。本 发明的各种实施例提供了对静态初始化对象(包括指针对象)的字节序的自动调整。一些实 施例解决了由多个分配的对象所引起的地址模糊性。而且,一些实施例提供了对在例如应 用程序启动期间丢失字节序校正的运行时检测。一些实施例使用特殊编译器生成信息来描 述非编译时间常数的大字节序指针值。各种实施例使用后处理工具来在链接过程已经完成 之后校正字节序。附加的实施例使用特殊应用程序启动代码,其能够在动态链接的应用程 序的情况下校正字节序。图3是本发明实施例中的方法的框图,该方法可以解决例如由解析代码(例如双 字节序编译器)所引起的困难。一种这样的困难涉及不追踪通过void指针的字节顺序的编 译器。void指针可以包括指向具有未知类型的值的指针。另一困难可以包括以下情形通 过将指针向或从指针进行转换而丢失了字节顺序改变。“转换”可以包括从一种类型到另一 类型的程序员规定的数据转换,例如从整数到浮点的转换。由于这些示例困难,所以一些编译器不能产生诊断(例如诊断报告、提示、消息、信息),所述诊断识别通过void指针而发生的潜在字节顺序改变。这些困难会导致运行时问题。为了解决这些问题,本发明的各种实 施例帮助识别代码的有问题区域,其中例如特定字节顺序通过void指针而被抛弃。更具体 地说,本发明的实施例可以向用户警告通过void指针的潜在有问题的转换,从而有效地将 特定void与字节顺序区域相关联,所以用户可以通过代码修改来解决所述转换。在图3的块305中,程序员可以使用代码(例如工具、编译器)来将代码的区域(例 如数据结构)标记为小或大字节序。如在此所解释的那样,一些区域由于它们与网络分组等 等一起使用而可以被指定为例如大字节序。编译器还可以识别出存在void指针。在块310 中,可以识别字节序格式。在块315中,如果void指针位于已经被标记为大字节序的代码 段中,则编译器可以在内部创建“大字节序void”。在块320中,如果void指针位于指定为 小字节序的代码部分,则编译器可以创建“小字节序void”。尽管标准void类型可以匹配 任何语言类型,但是特定于字节顺序的void (例如“大字节序void”或“小字节序void”) 可能仅匹配例如具有相同字节顺序的数据(例如非聚合数据)和在相同缺省字节顺序的上 下文中声明的(即定义的)数据(例如聚合数据)。因此,在块325中,确定不匹配的存在。在 块330中,如果不存在不匹配,则可以允许匹配。然而,在块335中,当存在不匹配时,编译 器可以发布报告该不匹配的诊断(除非诊断被禁用)。例如,如果标准void指针从大字节序 值指向小字节序值,则通常不会引起问题,这是因为void指针是指向具有未知类型(并且 因此也具有未确定的长度和未确定的解引用特性)的值的指针。然而,与“大字节序void” 的如此尝试的匹配可以在诊断中被记录(块340),并且引起程序员的注意,其中他或她可以 在块345中解决该问题。对void类型名称(例如大字节序void)的使用具有隐式地或显式地(参见块305) 分配给代码区域的缺省字节顺序的字节顺序属性。typedef可以被用来基于相应缺省字节 顺序的typedef来创建大和小字节序void的void名称类型。本发明的一些实施例涉及不同类型的void指针。具体而言,为了支持源转换成为 字节顺序中性的,可以创建void类型的族,对于其而言,数据的大小由附于void名称的数 据的比特大小来捕获,例如“void32”或“void64”。按照类似于关于方法300所解释的方 式,这些类型匹配相同比特大小的类型。源代码可以被修改以使用这些名称,并且然后编译 器将实施大小约束。因此,在本发明的一些实施例中,当编译器执行指针转换时,它可以在出现几种情 形中的任一种时确定并发布诊断。例如,当显式地或隐式地从不同的字节排序类型转换为 void指针(例如经由void指针从大字节序值转换到小字节序值)时,可以产生诊断。“显式”
转换可以发生,其中例如程序员显式地编写转换表达式,例如
{
int beint;
void *p = (void*)&beint; //从大字节序整数指针转换到
void指针
}
“隐式”转换是类似的,但是可能如下不包括转换表达式
{void *p = &beint; Il从大字节序整数指针转换到void指

}对于显式转换,编译器可以产生更少的诊断,因为转换向编译器指示程序员的动作很 可能是有意的。然而,通过void指针转换,字节顺序可能丢失,因此,在本发明的一个实施 例中,可以产生诊断而不管该转换的显式性质。因此可以在几种情形中产生诊断(例如报告)。例如,在以下情形中可以发布报告 当(i)显式地或隐式地从void指针转换到不同的字节排序类型时;当(ii)显式地或隐式 地从不同的字节排序类型转换到void指针时;当(iii)隐式地从void指针转换到具有不 同字节顺序的另一 void指针时;以及当(iv)显式地或隐式地从或向void大小指针进行转 换时,其中基本类型具有不同大小(例如经由void指针从32位值转换到64位值)。实施例可以在许多不同的系统类型中被实施。现在参考图4,示出了根据本发明实 施例的系统的框图。多处理器系统500是点到点互连系统,并且包括经由点到点互连550 而耦合的第一处理器570和第二处理器580。处理器570和580中的每一个可以是多核处 理器,其包括第一和第二处理器核(即处理器核574a和574b以及处理器核584a和584b), 不过在处理器中可能存在更多的核。术语“处理器”可以是指处理来自寄存器和/或存储 器的电子数据以将该电子数据变换成可以存储在寄存器和/或存储器中的其他电子数据 的任何设备或设备的一部分。第一处理器570进一步包括存储控制器集线器(MCH)572和点到点(P_P)接口 576 和578。类似地,第二处理器580包括MCH 582和P-P接口 586和588。MCH 572和582将 处理器耦合到相应的存储器,即存储器532和存储器534,其可以是本地地附于相应处理器 的主存储器(例如动态随机存取存储器(DRAM))的部分。第一处理器570和第二处理器580 可以分别经由P-P互连552和554被耦合到芯片组590。芯片组590包括P-P接口 594和 598。此外,芯片组590包括接口 592以通过P-P互连539将芯片组590与高性能图形 引擎538耦合。继而,芯片组590可以经由接口 596被耦合到第一总线516。各种输入/输 出(1/0)设备514连同总线桥518 —起可以被耦合到第一总线516,所述总线桥518将第一 总线516耦合到第二总线520。各种设备可以被耦合到第二总线520,所述各种设备包括例 如键盘/鼠标522、通信设备526、以及数据存储单元528 (例如盘驱动器或其他大容量存储 设备),在一个实施例中数据存储单元528可以包括代码530。此外,音频1/0 524可以被耦 合到第二总线520。实施例可以以代码来实施并且可以被存储在存储介质上,所述存储介质在其上存 储有指令,所述指令能够被用来对系统进行编程以执行所述指令。所述存储介质可以包 括但不限于任何类型的盘(包括软盘、光盘、固态驱动器(SSD)、光盘只读存储器(⑶-ROM)、 可重写光盘(⑶_RW)、以及磁光盘),半导体器件(例如只读存储器(ROM)),随机存取存储器 (RAM)(例如动态随机存取存储器(DRAM)、静态随机存取存储器(SRAM)、可擦除可编程只读 存储器(EPR0M)、闪速存储器、电可擦除可编程只读存储器(EEPR0M)),磁或光卡,或适合于 存储电子指令的任何其他类型的介质。在此已参考诸如指令、函数、过程、数据结构、应用程序、配置设置、代码等之类的数据描述了本发明的实施例。当数据被机器访问时,该机器可以通过执行任务、定义抽象 数据类型、建立低级硬件上下文、和/或执行其他操作来进行响应,如在此更详细描述的那 样。数据可以被存储在易失性和/或非易失性的数据存储装置中。为了本公开的目的,术 语“代码”或“程序”涵盖了大范围的组件和构造,其包括应用程序、驱动器、过程、例程、方 法、模块、以及子程序。因此,术语“代码”或“程序”可以被用来指代在被处理系统执行时 执行(一个或多个)期望操作的指令的任何集合。另外,可替换的实施例可以包括使用少于 所有所公开操作的过程、使用附加操作的过程、以不同序列使用相同操作的过程、以及其中 在此所公开的各个操作被组合、细分或以其他方式改变的过程。在此常常关于字节交换指 令讨论了字节序转换,但是各种实施例不一定限于采用任何特定类型的指令来执行或促进 字节序转换。

尽管已经相对于有限数目的实施例描述了本发明,但是本领域技术人员将由其认 识到许多修改和变化。所附权利要求打算覆盖落入本发明的真实精神和范围内的所有这样 的修改和变化。
权利要求
1.一种方法,包括接收分别定义全局变量的第一和第二实例的第一和第二源代码部分,其中每个实例具 有第一字节序格式并且这两个实例在编译时间都不能被完全地初始化;生成对字节交换指令的第一和第二引用,其被配置成分别将所述第一和第二实例转换 成第二字节序格式;使用处理器来生成影子变量,所述影子变量被配置成在编译时间之后并且基于所述第 一实例已经被字节交换来抑制所述第二实例的字节交换;以及 将所述影子变量存储在耦合到所述处理器的存储器中。
2.如权利要求1所述的方法,其中,基于所述全局变量是具有所述第一字节序格式的 指针,这两个实例在编译时间都不能被完全地初始化。
3.如权利要求2所述的方法,其中,所述影子变量被配置成指示所述第一实例是否被 字节交换。
4.如权利要求2所述的方法,其中,所述影子变量被配置成基于所述影子变量已经从 弱定义的变量被转换成强定义的变量来抑制所述第二实例的字节交换。
5.如权利要求2所述的方法,包括生成具有第一和第二字节序格式这二者的经编译 代码。
6.如权利要求2所述的方法,包括生成保护变量,所述保护变量被配置成确定,在运 行时和在所述保护变量的初始化之后,所述保护变量已经被字节转换,其中所述保护变量 将利用已知的链接时间常量来被初始化。
7.如权利要求2所述的方法,其中,所述第一和第二实例被配置成在编译时间之后分 别基于每一个都具有所述第一字节序格式的第一和第二链接时间常量来被初始化。
8.如权利要求1所述的方法,包括接收包括void指针的第三源代码部分; 追踪通过所述void指针的字节顺序;以及 确定基于所述void指针所发生的字节顺序不匹配。
9.如权利要求1所述的方法,包括接收包括void指针的第三源代码部分; 追踪通过所述void指针的数据大小;以及 确定基于所述void指针所发生的数据大小不匹配。
10.一种包括介质的物品,存储用于使基于处理器的系统能够执行以下操作的指令 接收分别定义全局变量的第一和第二实例的第一和第二代码部分,其中所述全局变量的每个实例具有第一字节序格式并且这两个实例在编译时间都不能被正确地初始化;以及 生成第一变量,所述第一变量被配置成在编译时间之后并且基于所述第一实例已经被 字节序转换来抑制所述第二实例的字节序转换。
11.如权利要求10所述的物品,其中,所述全局变量是指针。
12.如权利要求11所述的物品,进一步存储用于使所述系统能够基于从编译器生成 的信息来重定位所述第一变量的指令,其中所述第一变量被配置成基于所述重定位来抑制 所述第二实例的字节序转换。
13.如权利要求11所述的物品,其中,所述第一实例基于第二全局变量的地址。
14.如权利要求11所述的物品,其中,所述第一和第二代码部分被配置成被动态地链接。
15.如权利要求10所述的物品,进一步存储用于使所述系统能够执行以下操作的指令接收包括void指针的第三代码部分; 追踪通过所述void指针的字节顺序;以及 确定基于所述void指针所发生的字节顺序不匹配。
16.一种装置,包括耦合到存储器的处理器,其执行以下操作(1)使用所述存储器接收分别定义全局变 量的第一和第二实例的第一和第二源代码部分,其中所述全局变量的每个实例具有第一字 节序格式并且这两个实例在编译时间都不能被完全地初始化;以及(2)生成第一变量,所 述第一变量被配置成在编译时间之后并且基于所述第一实例已经被字节交换来抑制所述 第二实例的字节交换。
17.如权利要求15所述的装置,其中,所述全局变量是指针。
18.如权利要求17所述的装置,其中,所述第一变量被配置成基于所述第一变量已经 从弱定义的变量被转换成强定义的变量来抑制所述第二实例的字节交换。
19.如权利要求17所述的装置,其中,所述第一和第二代码部分被配置成被动态地链接。
20.如权利要求15所述的装置,其中,所述处理器执行以下操作 接收包括void指针的第三源代码部分;追踪通过所述void指针的字节顺序;以及 确定基于所述void指针所发生的字节顺序不匹配。
全文摘要
本发明公开了字节序转换工具。在本发明的一个实施例中,代码(例如编译器、工具)可以生成信息,因此包括第一字节序格式(例如大字节序)的指针值的第一代码部分能够被适当地初始化,并且在具有第二字节序格式(例如小字节序)的平台上被执行。而且,本发明的各种实施例可以识别代码(例如源代码)的有问题区域,其中特定字节顺序通过void指针而被抛弃。
文档编号G06F9/30GK102103481SQ20101059805
公开日2011年6月22日 申请日期2010年12月21日 优先权日2009年12月21日
发明者V. 布雷夫诺夫 E., 威尔金森 H., J. 多梅卡 M., P. 赖斯 M., 拉赫纳 P. 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1