CN113760236A - 重定位方法、装置、链接器及编译系统 - Google Patents
重定位方法、装置、链接器及编译系统 Download PDFInfo
- Publication number
- CN113760236A CN113760236A CN202111146471.XA CN202111146471A CN113760236A CN 113760236 A CN113760236 A CN 113760236A CN 202111146471 A CN202111146471 A CN 202111146471A CN 113760236 A CN113760236 A CN 113760236A
- Authority
- CN
- China
- Prior art keywords
- relocation
- stack
- symbol
- information
- operand
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 55
- 230000015654 memory Effects 0.000 claims description 19
- 238000004590 computer program Methods 0.000 claims description 9
- 230000008878 coupling Effects 0.000 abstract description 12
- 238000010168 coupling process Methods 0.000 abstract description 12
- 238000005859 coupling reaction Methods 0.000 abstract description 12
- 230000008569 process Effects 0.000 description 9
- 238000004364 calculation method Methods 0.000 description 8
- 238000010586 diagram Methods 0.000 description 6
- 230000002265 prevention Effects 0.000 description 5
- 230000008901 benefit Effects 0.000 description 4
- 238000001514 detection method Methods 0.000 description 3
- 239000000284 extract Substances 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 230000009471 action Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000006870 function Effects 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/36—Software reuse
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/47—Retargetable compilers
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本申请提供的重定位方法、装置、链接器及编译系统,应用于计算机技术领域,所述方法包括:在加载目标文件时,获取所述目标文件中的重定位表项,所述重定位表项至少包括:符号、重定位类型;基于将所述符号的信息,对栈操作数执行所述重定位类型相对应的栈编辑操作;将编辑后的栈操作数中弹出的信息作为所述符号的重定位地址并添加至执行文件中的指令位域。本方案通过在重定位表项中设置具有栈风格的重定位类型,从而基于重定位类型对应的栈编辑操作对栈操作数进行操作后将栈操作数弹出的信息符号的重定位地址写入指令位域,使得重定位类型基于栈风格相互正交,从而尽可能减少了重定位类型的耦合性和冗余,降低了重定位类型的复杂度。
Description
技术领域
本申请属于计算机技术领域,特别是涉及一种重定位方法、装置、链接器及编译系统。
背景技术
通常程序是通过对程序进行编译、汇编和链接三个阶段的操作来实现程序在在电子设备上的运行,而在链接时需要获取目标文件中的指令所需访问符号的地址,此时由于符号的内存地址在链接后可能发生偏移,并不是原本指定的内存地址,因此就需要对指令所需访问符号的内存地址进行重定位。
现有技术中的重定位方式是将目标文件中指令所需访问符号的内存地址直接写入重定位表,在链接时通过遍历重定位表,将查询每个指令所需访问符号的重定位地址直接写入执行文件中指令位域,从而完成对于指令的重定位操作,也就是说在汇编过程中编写重定位表时已经知晓了指令所需访问符号的重定位地址。
但是这种方式需要针对不同指令的重定位规则设置专门的重定位类型来指定所需访问符号的重定位地址,随着指令集的扩展和演变,如需访问某些新符号,就需要为这些新符号设置新的重定位类型,这些新的重定位类型和原有重定位类型相互组合使用,使得重定位类型之间的组合成倍增加,同一指令可能涉及多个不同的重定位类型或重定位类型组合,直接导致重定位类型的耦合度高和冗余,大大提升了重定位类型的复杂度,不利于程序的后期维护。
发明内容
有鉴于此,本申请实施例提出一种重定位方法、装置、链接器及编译系统,用于尽可能解决现有技术中在程序链接的过程中重定位类由于设置专门的重定位类型指定指令所需访问符号的重定位地址,导致重定位类型的耦合度高和冗余,提升了重定位类型的复杂度的问题。
本申请第一方面提供一种重定位方法,所述方法包括:
在加载目标文件时,获取所述目标文件中的重定位表项,所述重定位表项至少包括:符号、重定位类型;
基于将所述符号的信息,对栈操作数执行所述重定位类型相对应的栈编辑操作;
将编辑后的栈操作数中弹出的信息作为所述符号的重定位地址并添加至执行文件中的指令位域。
可选地,所述将编辑后的栈操作数中弹出的信息作为所述符号的重定位地址并添加至执行文件中的指令位域,包括:
若编辑后的栈操作数的字节位数大于指令位域的字节位数,则对所述编辑后的栈操作数执行防溢出操作,得到目标栈操作数;
将所述目标栈操作数中弹出的信息作为所述符号的重定位地址并添加至指令位域。
可选地,所述对所述编辑后的栈操作数执行防溢出操作,包括:
根据所述编辑后的栈操作数和所述指令位域的字节位数差值,确定移动方向和移动位数;
将所述编辑后的栈操作数中的信息向所述移动方向移动所述移动位数。
可选地,所述重定位类型相对应的栈编辑操作包括:压栈操作、弹栈操作中的至少一种;
所述基于将所述符号的信息,对栈操作数执行所述重定位类型相对应的栈编辑操作,包括:
在所述重定位类型相对应的栈编辑操作是压栈操作时,将所述符号的第一指定信息的压入所述栈操作数的栈顶;
在所述重定位类型相对应的栈编辑操作是弹栈操作时,从所述栈操作数的栈顶弹出所述符号的第二指定信息。
可选地,所述将所述符号的第一指定信息的压入所述栈操作数的栈顶,包括:
对所述符号的信息执行所述重定位类型相对应信息编辑操作;
将编辑后的信息压入所述栈操作数的栈顶。
可选地,所述获取所述目标文件中重定位表项,包括:
在所述目标文件为宏指令时,获取与所述宏指令相对应的至少两个重定位表项。
可选地,所述将编辑后的栈操作数中弹出的信息作为所述符号的重定位地址并添加至执行文件中的指令位域,包括:
将编辑后的栈操作数中弹出的信息转换为指定数据类型,得到所述符合的重定位地址,并将所述重定位地址添加至指令位域。
依据本申请第二方面,提供一种重定位装置,所述装置包括:
获取模块,被配置为在加载目标文件时,获取所述目标文件中的重定位表项,所述重定位表项至少包括:符号、重定位类型;
编辑模块,被配置为基于将所述符号的信息,对栈操作数执行所述重定位类型相对应的栈编辑操作;
链接模块,被配置为将编辑后的栈操作数中弹出的信息作为所述符号的重定位地址并添加至执行文件中的指令位域。
可选地,所述链接模块,还被配置为:
若编辑后的栈操作数的字节位数大于指令位域的字节位数,则对所述编辑后的栈操作数执行防溢出操作,得到目标栈操作数;
将所述目标栈操作数中弹出的信息作为所述符号的重定位地址并添加至指令位域。
可选地,所述链接模块,还被配置为:
根据所述编辑后的栈操作数和所述指令位域的字节位数差值,确定移动方向和移动位数;
将所述编辑后的栈操作数中的信息向所述移动方向移动所述移动位数。
可选地,所述重定位类型相对应的栈编辑操作包括:压栈操作、弹栈操作中的至少一种;
所述编辑模块,还被配置为:
在所述重定位类型相对应的栈编辑操作是压栈操作时,将所述符号的第一指定信息的压入所述栈操作数的栈顶;
在所述重定位类型相对应的栈编辑操作是弹栈操作时,从所述栈操作数的栈顶弹出所述符号的第二指定信息。
可选地,所述编辑模块,还被配置为:
对所述符号的信息执行所述重定位类型相对应信息编辑操作;
将编辑后的信息压入所述栈操作数的栈顶。
可选地,所述获取模块,还被配置为:
在所述目标文件为宏指令时,获取与所述宏指令相对应的至少两个重定位表项。
可选地,所述链接模块,还被配置为:
将编辑后的栈操作数中弹出的信息转换为指定数据类型,得到所述符合的重定位地址,并将所述重定位地址添加至指令位域。
依据本申请第三方面,提供一种链接器,包括上述的重定位装置。
依据本申请第四方面,提供一种编译系统,包括汇编器和上述的链接器,所述链接器接收所述汇编器汇编得到的目标文件。
依据本申请第三方面,提供一种电子设备,包括处理器,存储器及存储在所述存储器上并可在所述处理器上运行的程序或指令,所述程序或指令被所述处理器执行时实现上述第一方面所述重定位方法。
依据本申请第四方面,提供一种计算机可读存储介质,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现上述第一方面所述的重定位方法。
针对现有技术,本申请具备如下优点:
本申请提供的一种重定位方法、装置、链接器及编译系统,本方案通过在重定位表项中设置具有栈风格的重定位类型,从而基于重定位类型对应的栈编辑操作对栈操作数进行操作后将栈操作数弹出的信息符号的重定位地址写入指令位域,使得重定位类型基于栈风格相互正交,从而尽可能减少了重定位类型的耦合性和冗余,降低了重定位类型的复杂度。
上述说明仅是本申请技术方案的概述,为了能够更清楚了解本申请的技术手段,而可依照说明书的内容予以实施,并且为了让本申请的上述和其它目的、特征和优点能够更明显易懂,以下特举本申请的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本申请的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1是本申请实施例提供的一种重定位方法的步骤流程图;
图2是本申请实施例提供的另一种重定位方法的步骤流程图;
图3是本申请实施例提供的一种防溢出方法的步骤流程图;
图4是本申请实施例提供的一种栈压入方法的步骤流程图;
图5是本申请实施例提供的一种重定位装置的结构框图。
具体实施方式
下面将参照附图更详细地描述本申请的示例性实施例。虽然附图中显示了本申请的示例性实施例,然而应当理解,可以以各种形式实现本申请而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本申请,并且能够将本申请的范围完整的传达给本领域的技术人员。
图1是本申请实施例提供一种重定位方法的步骤流程图,所述方法包括:
步骤101,在加载目标文件时,获取所述目标文件中的重定位表项,所述重定位表项至少包括:符号、重定位类型。
在本申请实施例中,目标文件是指需要执行链接操作的汇编源码,通常是先将开发人员编写的编译语言的程序代码转换为文字编码形式的机器语言代码,然后再转换为二进制的汇编源码得到。该目标文件中的汇编源码包含有运行程序所需执行的指令,每个指令指定有所需访问的符号以及该符号的在链接前的原内存地址,该符号是指令需要引用或定义的变量和函数。但是由于指令在实际执行时的实际内存地址并不一定是该原内存地址,因此需要在链接时依赖于重定位表对目标文件执行重定位操作来获取符号的重定位地址。具体的,通常是通过重定位表中的重定位表项来指示各指令所需访问的符号以及重定位类型,而重定位类型是用于表征获取符号的重定位地址的操作方法,继而可以在获取符号的访问时,通过执行重定位类型对应的操作方法计算得到该符号的重定位地址。
在实际应用中,汇编器可以通过语法分析器将编译语言的程序文件中的中缀表达式转换为后缀表达式,将采用中缀表达式编写的具有栈风格的重定位表转换为后缀表达式,从而可以将汇编过程中引入本申请实施例栈风格的重定位类型。之后链接器读取汇编器提供的目标文件,提取目标文件中的重定位表,然后链接器从头到尾编辑该重定位表,查找各指令相对应的重定位表项,从重定位表项中提取指令所需访问的符号以及后续重定位过程所需使用的栈风格的重定位类型。
步骤102,基于将所述符号的信息,对栈操作数执行所述重定位类型相对应的栈编辑操作。
在本申请实施例中,符号的信息可以是与该符号相关的绝对地址、常数等信息。栈操作数是用于执行栈风格的编辑操作的数据结构,栈操作数具有先进后出、后进先出的特点。具体的,可依据重定位类型相对应的栈编辑操作将符号的信息压入栈操作数,或将已压入栈操作数的信息弹出,以对栈操作数执行栈编辑操作。需要说明的是,不同于现有技术中重定位类型直接指定符号的重定位地址的方法,本申请实施例依据栈风格的重定位类型,在重定位过程中基于栈编辑操作计算符号的重定位地址,从而将原重定位地址在汇编重定位表时就已知晓,变更为在链接时通过栈编辑操作才知晓重定位地址,使得同一重定位地址不再直接由重定位类型直接指定,而是通过重定位类型对应的栈编辑操作计算得到,并且由于具有栈风格的的重定位类型之间正交,尽可能避免了重定位类型所指示重定位地址的耦合,降低了重定位类型的复杂度。
在实际应用中,用户若需要对某新符号的信息进行访问,无需再开发专门用于计算该新符号的信息的重定位类型,只要基于本申请实施例提供的具有栈风格的重定位类型对应的栈编辑操作相互组合得到该新符号的重定位类型,只要可以计算得到新符号的信息的重定位地址即可。也就是说本申请实施例提供的具有栈风格的重定位类型对应的是一种对栈进行编辑操作的方式,相对于现有技术中静态的重定位类型直接指定重定位地址的方式,同一栈风格的重定位类型可以重复适用于不同符号的重定位地址的计算过程,可以有效提高重定位类型的复用性和适用性。当然,也可以适应于实际需求所需的新的计算方式开发新的栈风格的重定位类型,从而定义一种新的栈编辑操作,也可以与已有栈风格的重定位类型组合使用。需要说明的是,对于动态类型的重定位类型是设置一表达式,在指令实际执行时根据表达式计算获取重定位地址的方式,也可以通过本方式的栈风格的重定位类型来设置表达式。
步骤103,将编辑后的栈操作数中弹出的信息作为所述符号的重定位地址并添加至执行文件中的指令位域。
在本申请实施例中,重定位地址是在指令实际访问符号时的实际内存地址。指令位域是链接器所生成执行文件中存放指令的位域,该执行文件是用于设备读取和运行的文件。在对栈操作数基于符号的信息完成栈编辑操作后,可指示栈操作数弹出其中的信息,将该信息作为符号的重定位地址,写入至执行文件的指令位域,从而在目标文件的链接过程中实现对于符号的重定位过程。
本申请实施例提供的一种重定位方法,通过在重定位表项中设置具有栈风格的重定位类型,从而基于重定位类型对应的栈编辑操作对栈操作数进行操作后将栈操作数弹出的信息符号的重定位地址写入指令位域,使得重定位类型基于栈风格相互正交,从而尽可能减少了重定位类型的耦合性和冗余,降低了重定位类型的复杂度。
图2是本申请实施例提供的另一种重定位方法的步骤流程图,所述方法包括:
步骤201,在加载目标文件时,获取所述目标文件中的重定位表项,所述重定位表项至少包括:符号、重定位类型。
该步骤可参照步骤101的详细描述,此处不再赘述。
可选地,所述重定位类型相对应的栈编辑操作包括:压栈操作、弹栈操作中的至少一种。
在本申请实施例中,栈编辑操作可以包含压栈操作或弹栈操作中的任一个,也可以同时包含至少一个压栈操作和至少一个弹栈操作,具体可以重定位类型所指示的符号的重定位地址的栈计算方式确定,此处不做限定。
步骤202,在所述重定位类型相对应的栈编辑操作是压栈操作时,将所述符号的第一指定信息的压入所述栈操作数的栈顶。
在本申请实施例中,第一指定信息是符号的信息的指定位的信息,例如符号的信息是32位,可以指定该符号的信息的1~10位或者32位的字符作为第一指定信息。具体的,适应于本申请实施例通的栈风格的重定位类型,重定位类型的栈编辑操作可以是压栈操作,即将第一指定信息从栈操作数的栈顶压入。
步骤203,在所述重定位类型相对应的栈编辑操作是弹栈操作时,从所述栈操作数的栈顶弹出所述符号的第二指定信息。
在本申请实施例中,第二指定信息与第一指定信息类似,区别在于第二指定信息是已经压入栈操作数的符号的信息。具体的,适应于本申请实施例通的栈风格的重定位类型,重定位类型的栈编辑操作还可以是弹栈操作,即将已经压入栈操作数的符号的第二指定信息从操作数栈中弹出。
示例性的,对于指令lu12i.w可设置表1的重定位类型:
表1
对于指令ori可设置表2的重定位类型:
表2
其中,“重定位类型”的表项列的内容是重定位类型的编译文字命名,“符号信息和算子”表项列中的符号信息是重定位类型所对应的操作方法所需用到的符号信息,例如其中“symbol”标识符号的绝对地址,“0xfff”为16位进制的常数,相应的其中算子是操作方法所需用到的计算操作,例如其中“ABS”为求绝对值的计算操作,“动作”表项列中的内容是重定位类型所对应的操作方法的具体计算过程描述。当然上述只是示例性说明,具体重定位类型的设置方式可以根据实际需求设置,此处不做限定。
本申请实施例通过依据基于栈风格的重定位类型对符号的信息进行压栈或弹栈操作,使得重定位类型相互正交,尽可能减少了重定位类型的数据耦合性,降低了重定位类型的复杂度。
步骤204,若编辑后的栈操作数的字节位数大于指令位域的字节位数,则对所述编辑后的栈操作数执行防溢出操作,得到目标栈操作数。
在本申请实施例中,目标栈操作数对编辑后的栈操作数执行防溢出操作后的栈操作数,该目标栈操作数的字节位数小于或等于指令谓语的字节位数。由于通常栈操作数中的元素是64位有符号整数型,而指令位域的元素可能是32位有符号整数型、或者20为无符号整数型等小于栈操作数字节位数的位域,因此直接从栈操作数中取出的信息对于指令位域而言可能是溢出的,因此在将栈操作数中的信息写入指令位域前需要对防溢出检测。具体的,在编辑后的栈操作数的字节位数大于指令位域的字节位数时,确认编辑后的栈操作数存在溢出风险,因此需要对编辑后的栈操作数执行防溢出操作,该防溢出操作可以是对栈操作数中的信息进行部分截取或者类型转换等,只要保证从栈操作数中取出的信息的字节位数小于或等于指令位域的字节位数,保证栈操作数在写入指令位域不会溢出即可,具体可以根据实际需求确定,此处不做限定。
当然,若编辑后的栈操作数的字节位数小于或等于指令位域的字节位数,则可以直接将编辑后的栈操作数中的信息作为符号的重定位地址写入指令位域。
步骤205,将所述目标栈操作数中弹出的信息作为所述符号的重定位地址并添加至指令位域。
本申请实施例通过依据栈操作数和指令位域的字节位数对编辑后的栈操作数进行溢出检测,从而避免了栈操作数在写入指令位域时的溢出风险。
可选地,参照图3,所述步骤204,可以包括:
子步骤2041,根据所述编辑后的栈操作数和所述指令位域的字节位数差值,确定移动方向和移动位数。
子步骤2042,将所述编辑后的栈操作数中的信息向所述移动方向移动所述移动位数。
在本申请实施例中,移动方向是指栈操作数中的信息在栈操作数中的移动方向,具体可以是向左或者向右中的至少一种,也可以是向左和向右移动的组合方向。移动位数是指信息在栈操作数中移动的字节位数。具体的,在编辑后的栈操作数和指令位域的字节位数差值为N,栈操作数的元素位数为M,N小于等于M,M、N为大于等于0的正整数,可以首先将信息从栈操作数中向左移动M,再向右移动M+N,从而得到信息的M~M-N位。
示例性的,“lu12i.w rd,si20”指令的意义是,rd<-sext(si20)<<12,向寄存器的指令位域的[32...12]位加载立即数,这里的意义是将symbol的32位地址左移32位后右移44位,把32位地址的[32...12]位地址提取出来,填入指令的指令位域中。之所以是左移32位后右移44位,是因为操作数栈元素是64位有符号整数型,64位有符号整数型对于指令位域的si20来说是溢出的。
本申请实施例通过依据栈操作数和指令位域的字节位数之间的差值来对栈操作数中的信息进行移动,避免了栈操作数中的信息写入指令位域的溢出风险。
可选地,参照图4,所述步骤202,可以包括:
子步骤2021,对所述符号的信息执行所述重定位类型相对应信息编辑操作。
子步骤2022,将编辑后的信息压入所述栈操作数的栈顶。
在本申请实施例中,可以在将符号的信息压入栈操作数前对符号的信息执行例如求和、求差、求平均数、位置调换等编辑操作,然后将编辑后得到的信息压入栈操作数的栈顶,从而提高了栈风格的重定位类型所对应的栈编辑操作的灵活性。
可选地,所述步骤201,可以包括:在所述目标文件为宏指令时,获取与所述宏指令相对应的至少两个重定位表项。
在本申请实施例中,宏指令是汇编语言中的一种伪命令,其代表有一段包含指示多个重定位表项的源程序。通过宏命令可以将本申请实施例中的多个重定位表项进行组合,从而使得本申请实施例中提供的栈风格的重定位类型可以重复适用于不同符号的重定位类型的设计开发,提高了本方案中栈风格重定位类型的复用性。
示例性的,对于宏指令la,其可以只是有两条指令对应的重定位表项,分别是lu12i.w$r1,%abs(symbol)<<32>>44,ori$r1,$r1,%abs(symbol)&0xfff。“lu12i.wrd,si20”指令的意义是,rd<-sext(si20)<<12,向寄存器的[32...12]位加载立即数,这里的意义是将symbol的32位地址左移32位后右移44位,把32位地址的[32...12]位地址提取出来,填入指令的立即数位域中。“orird,rs,ui12”指令的意义是,rd<-rs|ui12,将通用寄存器rs中的值和无符号整数型u12求位与后,写入通用寄存器rd。这里是把symbol的32位地址的低12位写入指令位域。
可选地,所述步骤206可以包括:将编辑后的栈操作数中弹出的信息转换为指定数据类型,得到所述符合的重定位地址,并将所述重定位地址添加至指令位域。
在本申请实施例中,指定数据类型是指令位域的数据类型。由于通常栈操作数的元素是64位有符号整数型,但是指令位域不一定是有符号整数型,因此将栈操作数中弹出的信息转换为指定数据类型后再作为符号的重定位地址写入指令位域,从而使得本方案中栈风格的重定位类型可以适用于各种数据类型的指令位域。
本申请实施例提供的另一种重定位方法,通过在重定位表项中设置具有栈风格的重定位类型,从而基于重定位类型对应的栈编辑操作对栈操作数进行操作后将栈操作数弹出的信息符号的重定位地址写入指令位域,使得重定位类型基于栈风格相互正交,从而尽可能减少了重定位类型的耦合性和冗余,降低了重定位类型的复杂度。并且还通过在将栈操作数弹出的信息写入指令位域前依据栈操作数和指令位域的字节位数进行溢出检测,并执行防溢出操作,避免了栈操作数中的信息写入指令位域的溢出风险。并且还通过宏指令将多个重定位类型进行组合使用,提高了栈风格重定位类型使用的灵活性。
图5是本申请实施例提供了一种重定位装置30的结构框图,所述装置包括:
获取模块301,被配置为在加载目标文件时,获取所述目标文件中的重定位表项,所述重定位表项至少包括:符号、重定位类型;
编辑模块302,被配置为基于将所述符号的信息,对栈操作数执行所述重定位类型相对应的栈编辑操作;
链接模块303,被配置为将编辑后的栈操作数中弹出的信息作为所述符号的重定位地址并添加至执行文件中的指令位域。
可选地,所述链接模块303,还被配置为:
若编辑后的栈操作数的字节位数大于指令位域的字节位数,则对所述编辑后的栈操作数执行防溢出操作,得到目标栈操作数;
将所述目标栈操作数中弹出的信息作为所述符号的重定位地址并添加至指令位域。
可选地,所述链接模块303,还被配置为:
根据所述编辑后的栈操作数和所述指令位域的字节位数差值,确定移动方向和移动位数;
将所述编辑后的栈操作数中的信息向所述移动方向移动所述移动位数。
可选地,所述重定位类型相对应的栈编辑操作包括:压栈操作、弹栈操作中的至少一种;
所述编辑模块302,还被配置为:
在所述重定位类型相对应的栈编辑操作是压栈操作时,将所述符号的第一指定信息的压入所述栈操作数的栈顶;
在所述重定位类型相对应的栈编辑操作是弹栈操作时,从所述栈操作数的栈顶弹出所述符号的第二指定信息。
可选地,所述编辑模块302,还被配置为:
对所述符号的信息执行所述重定位类型相对应信息编辑操作;
将编辑后的信息压入所述栈操作数的栈顶。
可选地,所述获取模块301,还被配置为:
在所述目标文件为宏指令时,获取与所述宏指令相对应的至少两个重定位表项。
可选地,所述链接模块303,还被配置为:
将编辑后的栈操作数中弹出的信息转换为指定数据类型,得到所述符合的重定位地址,并将所述重定位地址添加至指令位域。
本申请实施例提供的一种重定位装置,通过在重定位表项中设置具有栈风格的重定位类型,从而基于重定位类型对应的栈编辑操作对栈操作数进行操作后将栈操作数弹出的信息符号的重定位地址写入指令位域,使得重定位类型基于栈风格相互正交,从而尽可能减少了重定位类型的耦合性和冗余,降低了重定位类型的复杂度。
本申请实施例提供了一种链接器,包括上述实施例所示的重定位装置。本申请又一实施例还提供一种编译系统,该编译系统包括上述的链接器和汇编器,所述链接器接收所述汇编器汇编得到的目标文件。所述链接器在加载可执行文件目标文件时,获取所述可执行文件目标文件中的重定位表项,所述重定位表项至少包括:符号、重定位类型;基于将所述符号的信息,对栈操作数执行所述重定位类型相对应的栈编辑操作;将编辑后的栈操作数中弹出的信息作为所述符号的重定位地址并添加至指令位域将编辑后的栈操作数中弹出的信息作为所述符号的重定位地址并添加至执行文件中的指令位域。
本申请实施例提供的链接器、编译系统,通过在重定位表项中设置具有栈风格的重定位类型,从而基于重定位类型对应的栈编辑操作对栈操作数进行操作后将栈操作数弹出的信息符号的重定位地址写入指令位域,使得重定位类型基于栈风格相互正交,从而尽可能减少了重定位类型的耦合性和冗余,降低了重定位类型的复杂度。
本申请实施例提供了一种电子设备,存储器及存储在所述存储器上并可在所述处理器上运行的程序或指令,所述程序或指令被所述处理器执行时实现上述任一所述的重定位方法。
本申请实施例提供的一种电子设备,通过在重定位表项中设置具有栈风格的重定位类型,从而基于重定位类型对应的栈编辑操作对栈操作数进行操作后将栈操作数弹出的信息符号的重定位地址写入指令位域,使得重定位类型基于栈风格相互正交,从而尽可能减少了重定位类型的耦合性和冗余,降低了重定位类型的复杂度。
本申请实施例提供了一种计算机存储介质,其上存储有计算机程序,计算机程序被处理器执行时能实现上述的重定位方法。
本申请的实施例提供一种计算机存储介质,通过在重定位表项中设置具有栈风格的重定位类型,从而基于重定位类型对应的栈编辑操作对栈操作数进行操作后将栈操作数弹出的信息符号的重定位地址写入指令位域,使得重定位类型基于栈风格相互正交,从而尽可能减少了重定位类型的耦合性和冗余,降低了重定位类型的复杂度。
本技术领域技术人员可以理解,本申请包括涉及用于执行本申请中所述操作中的一项或多项的设备。这些设备可以为所需的目的而专门设计和制造,或者也可以包括通用计算机中的已知设备。这些设备具有存储在其内的计算机程序,这些计算机程序选择性地激活或重构。这样的计算机程序可以被存储在设备(例如,计算机)的存储介质中或者存储在适于存储电子指令并分别耦联到总线的任何类型的介质中,该计算机存储介质包括但不限于任何类型的盘(包括软盘、硬盘、光盘、CD-ROM和磁光盘)、ROM(Read-Only Memory,只读存储器)、RAM(RandomAccess Memory,随即存储器)、EPROM(Erasable Programmable Read-Only Memory,可擦写可编程只读存储器)、EEPROM(Electrically Erasable ProgrammableRead-Only Memory,电可擦可编程只读存储器)、闪存、磁性卡片或光线卡片。也就是,存储介质包括由设备(例如,计算机)以能够读的形式存储或传输信息的任何介质。
本技术领域技术人员可以理解,可以用计算机程序指令来实现这些结构图和/或框图和/或流程图中的每个框以及这些结构图和/或框图和/或流程图中的框的组合。本技术领域技术人员可以理解,可以将这些计算机程序指令提供给通用计算机、专业计算机或其它可编程重定位方法的处理器来实现,从而通过计算机或其他可编程重定位方法的处理器来执行本申请公开的结构图和/或框图和/或流图的框或多个框中指定的方案。
以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。
Claims (18)
1.一种重定位方法,其特征在于,所述方法包括:
在加载目标文件时,获取所述目标文件中的重定位表项,所述重定位表项至少包括:符号、重定位类型;
基于将所述符号的信息,对栈操作数执行所述重定位类型相对应的栈编辑操作;
将编辑后的栈操作数中弹出的信息作为所述符号的重定位地址并添加至执行文件中的指令位域。
2.根据权利要求1所述的方法,其特征在于,所述将编辑后的栈操作数中弹出的信息作为所述符号的重定位地址并添加至执行文件中的指令位域,包括:
若编辑后的栈操作数的字节位数大于指令位域的字节位数,则对所述编辑后的栈操作数执行防溢出操作,得到目标栈操作数;
将所述目标栈操作数中弹出的信息作为所述符号的重定位地址并添加至指令位域。
3.根据权利要求2所述的方法,其特征在于,所述对所述编辑后的栈操作数执行防溢出操作,包括:
根据所述编辑后的栈操作数和所述指令位域的字节位数差值,确定移动方向和移动位数;
将所述编辑后的栈操作数中的信息向所述移动方向移动所述移动位数。
4.根据权利要求1所述的方法,其特征在于,所述重定位类型相对应的栈编辑操作包括:压栈操作、弹栈操作中的至少一种;
所述基于将所述符号的信息,对栈操作数执行所述重定位类型相对应的栈编辑操作,包括:
在所述重定位类型相对应的栈编辑操作是压栈操作时,将所述符号的第一指定信息的压入所述栈操作数的栈顶;
在所述重定位类型相对应的栈编辑操作是弹栈操作时,从所述栈操作数的栈顶弹出所述符号的第二指定信息。
5.根据权利要求4所述的方法,其特征在于,所述将所述符号的第一指定信息的压入所述栈操作数的栈顶,包括:
对所述符号的信息执行所述重定位类型相对应信息编辑操作;
将编辑后的信息压入所述栈操作数的栈顶。
6.根据权利要求1所述的方法,其特征在于,所述获取所述目标文件中重定位表项,包括:
在所述目标文件为宏指令时,获取与所述宏指令相对应的至少两个重定位表项。
7.根据权利要求1所述的方法,其特征在于,所述将编辑后的栈操作数中弹出的信息作为所述符号的重定位地址并添加至执行文件中的指令位域,包括:
将编辑后的栈操作数中弹出的信息转换为指定数据类型,得到所述符合的重定位地址,并将所述重定位地址添加至指令位域。
8.一种重定位装置,其特征在于,所述装置包括:
获取模块,被配置为在加载目标文件时,获取所述目标文件中的重定位表项,所述重定位表项至少包括:符号、重定位类型;
编辑模块,被配置为基于将所述符号的信息,对栈操作数执行所述重定位类型相对应的栈编辑操作;
链接模块,被配置为将编辑后的栈操作数中弹出的信息作为所述符号的重定位地址并添加至执行文件中的指令位域。
9.根据权利要求8所述的装置,其特征在于,所述链接模块,还被配置为:
若编辑后的栈操作数的字节位数大于指令位域的字节位数,则对所述编辑后的栈操作数执行防溢出操作,得到目标栈操作数;
将所述目标栈操作数中弹出的信息作为所述符号的重定位地址并添加至指令位域。
10.根据权利要求9所述的装置,其特征在于,所述链接模块,还被配置为:
根据所述编辑后的栈操作数和所述指令位域的字节位数差值,确定移动方向和移动位数;
将所述编辑后的栈操作数中的信息向所述移动方向移动所述移动位数。
11.根据权利要求8所述的装置,其特征在于,所述重定位类型相对应的栈编辑操作包括:压栈操作、弹栈操作中的至少一种;
所述编辑模块,还被配置为:
在所述重定位类型相对应的栈编辑操作是压栈操作时,将所述符号的第一指定信息的压入所述栈操作数的栈顶;
在所述重定位类型相对应的栈编辑操作是弹栈操作时,从所述栈操作数的栈顶弹出所述符号的第二指定信息。
12.根据权利要求11所述的装置,其特征在于,所述编辑模块,还被配置为:
对所述符号的信息执行所述重定位类型相对应信息编辑操作;
将编辑后的信息压入所述栈操作数的栈顶。
13.根据权利要求8所述的装置,其特征在于,所述获取模块,还被配置为:
在所述目标文件为宏指令时,获取与所述宏指令相对应的至少两个重定位表项。
14.根据权利要求8所述的装置,其特征在于,所述链接模块,还被配置为:
将编辑后的栈操作数中弹出的信息转换为指定数据类型,得到所述符合的重定位地址,并将所述重定位地址添加至指令位域。
15.一种链接器,其特征在于,包括权利要求8-14任一项所述的重定位装置。
16.一种编译系统,其特征在于,包括汇编器和权利要求15所述的链接器,所述链接器接收所述汇编器汇编得到的目标文件。
17.一种电子设备,其特征在于,包括处理器,存储器及存储在所述存储器上并可在所述处理器上运行的程序或指令,所述程序或指令被所述处理器执行时实现如权利要求1至7中任一项所述的重定位方法。
18.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储计算机程序,所述计算机程序被处理器执行时实现权利要求1至7中任一所述的重定位方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111146471.XA CN113760236A (zh) | 2021-09-28 | 2021-09-28 | 重定位方法、装置、链接器及编译系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111146471.XA CN113760236A (zh) | 2021-09-28 | 2021-09-28 | 重定位方法、装置、链接器及编译系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113760236A true CN113760236A (zh) | 2021-12-07 |
Family
ID=78798072
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111146471.XA Pending CN113760236A (zh) | 2021-09-28 | 2021-09-28 | 重定位方法、装置、链接器及编译系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113760236A (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6314564B1 (en) * | 1997-11-17 | 2001-11-06 | Agere Systems Guardian Corp. | Method for resolving arbitrarily complex expressions at link-time |
US20020124242A1 (en) * | 2000-10-27 | 2002-09-05 | Mcgoogan Sean | Bi-endian libraries |
CN101650664A (zh) * | 2009-06-30 | 2010-02-17 | 北京飞天诚信科技有限公司 | 链接方法和链接器 |
-
2021
- 2021-09-28 CN CN202111146471.XA patent/CN113760236A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6314564B1 (en) * | 1997-11-17 | 2001-11-06 | Agere Systems Guardian Corp. | Method for resolving arbitrarily complex expressions at link-time |
US20020124242A1 (en) * | 2000-10-27 | 2002-09-05 | Mcgoogan Sean | Bi-endian libraries |
CN101650664A (zh) * | 2009-06-30 | 2010-02-17 | 北京飞天诚信科技有限公司 | 链接方法和链接器 |
Non-Patent Citations (1)
Title |
---|
(美)莱文著: "大学计算机导论", vol. 1, 北京航空航天大学出版社, pages: 115 - 116 * |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6061783A (en) | Method and apparatus for manipulation of bit fields directly in a memory source | |
JP2002527815A (ja) | プログラムコード変換方法 | |
CN111290952B (zh) | 一种动态链接库函数的跟踪方法及装置 | |
US10459707B2 (en) | Instruction-set simulator and its simulator generation method | |
US7823140B2 (en) | Java bytecode translation method and Java interpreter performing the same | |
US8095775B1 (en) | Instruction pointers in very long instruction words | |
CN117827286B (zh) | Risc-v架构二进制转译文件复用方法、装置及存储介质 | |
CN114237612A (zh) | 程序代码的编译方法、装置、电子设备及存储介质 | |
CN115480871B (zh) | 一种通用的tms320c3x处理器指令集虚拟化仿真方法 | |
CN115421861B (zh) | 一种通用的TMS320C55x处理器指令集虚拟化仿真方法 | |
US7966474B2 (en) | System, method and computer program product for translating storage elements | |
CN113760236A (zh) | 重定位方法、装置、链接器及编译系统 | |
US20170115973A1 (en) | Operating method of semiconductor device and semiconductor system | |
US8464235B2 (en) | Adaptive production of assembler | |
CN114428603A (zh) | 一种基于编译器生成short和int类型指令的方法和系统 | |
JPH11242599A (ja) | コンピュータプログラム製品 | |
CN108351799B (zh) | 对客体系结构指令的高效仿真 | |
US20050251795A1 (en) | Method, system, and program for optimizing code | |
CN115421863B (zh) | 一种通用的mips64处理器指令集虚拟化仿真方法 | |
CN115421864B (zh) | 一种通用的PowerPC架构处理器指令集虚拟化仿真方法 | |
CN115421875B (zh) | 二进制翻译方法及装置 | |
Cocke et al. | The evolution of risc technology at ibm | |
Vishnyakov et al. | A method for analyzing code-reuse attacks | |
Fokina et al. | Automated Generation of Machine Instruction Decoders | |
Staursky | Lambda Calculus for Binary Security and Analysis |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20211207 |