CN103955354B - 重定位方法和装置 - Google Patents

重定位方法和装置 Download PDF

Info

Publication number
CN103955354B
CN103955354B CN201410195468.0A CN201410195468A CN103955354B CN 103955354 B CN103955354 B CN 103955354B CN 201410195468 A CN201410195468 A CN 201410195468A CN 103955354 B CN103955354 B CN 103955354B
Authority
CN
China
Prior art keywords
instruction
jump instruction
jump
address
span
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.)
Active
Application number
CN201410195468.0A
Other languages
English (en)
Other versions
CN103955354A (zh
Inventor
彭飞
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Loongson Technology Corp Ltd
Original Assignee
Loongson Technology Corp Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Loongson Technology Corp Ltd filed Critical Loongson Technology Corp Ltd
Priority to CN201410195468.0A priority Critical patent/CN103955354B/zh
Publication of CN103955354A publication Critical patent/CN103955354A/zh
Application granted granted Critical
Publication of CN103955354B publication Critical patent/CN103955354B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Abstract

本发明提供一种重定位方法和装置。该方法包括:获取代码缓冲区中的第一跳转指令段,第一跳转指令段包括第一跳转指令以及至少一条空指令;代码缓冲区用于存储插桩之后的程序代码,第一跳转指令存储在第一地址中,第一跳转指令对应的目标指令存储在第二地址中,第一地址与第二地址之间的地址跨度为第一跨度;根据第一跳转指令生成第二跳转指令段,第二跳转指令段包括第一指令和第二跳转指令,第一指令用于将第二地址存储到目标寄存器,所述第二跳转指令为用于指示跳转到存储在目标寄存器中的第二地址的寄存器跳转指令;将第一跳转指令段替换为第二跳转指令段。本发明实施例提供的方法,扩展了跳转指令的跳转空间,提高了程序跳转的准确性。

Description

重定位方法和装置
技术领域
本发明涉及计算机技术,尤其涉及一种重定位方法和装置。
背景技术
动态二进制插桩是指在可执行程序运行时,除了正常执行原始程序外,在该原始程序二进制代码的相关位置插入其他代码,并执行插入后的代码(包括原始程序二进制代码和所插入的其他代码),用于完成程序运行时信息收集、分析、优化等工作。动态二进制插桩的过程需要用到动态二进制插桩软件(SEntre),具体的插桩过程为:计算机通过SEntre软件在应用程序启动的时候对其进行截获,获取该应用程序的执行权限;之后,将应用程序二进制代码从原空间拷贝到代码缓存区域,并在应用程序二进制代码拷贝时进行插桩,并对缓存区中的插桩后的二进制代码进行重定位,以重新确定二进制代码中的相关跳转指令的目标地址;最后,将截获的执行权限交给插桩后的代码,以执行插桩后的程序,并输出用户需要的插桩信息。
现有技术中,对直接寻址的跳转指令进行重定位时,由于对原程序二进制代码进行插桩的原因,导致跳转指令需要跳转的地址跨度扩大,当其跨度值大于跨度阈值时,引发程序跳转错误的问题。
发明内容
本发明实施例提供一种重定位方法和装置,用以解决现有技术中由于对原程序二进制代码进行插桩的原因,导致跳转指令需要跳转的地址跨度扩大,当其跨度值大于跨度阈值时,无法实现对该跳转指令的重定位的技术问题。
第一方面,本发明实施例提供一种重定位方法,包括:
获取代码缓冲区中的第一跳转指令段,所述第一跳转指令段包括用于直接寻址的第一跳转指令以及至少一条空指令;所述代码缓冲区用于存储插桩之后的程序代码,所述第一跳转指令存储在第一地址中,所述第一跳转指令对应的目标指令存储在第二地址中,所述第一地址与所述第二地址之间的地址跨度为第一跨度;
根据所述第一跳转指令生成第二跳转指令段,所述第二跳转指令段包括第一指令和第二跳转指令,所述第一指令用于将所述第二地址存储到目标寄存器,所述第二跳转指令为用于指示跳转到存储在所述目标寄存器中的所述第二地址的寄存器跳转指令;
将所述第一跳转指令段替换为所述第二跳转指令段,以使得执行所述代码缓冲区中的程序代码时根据所述第二跳转指令段跳转到所述第一跳转指令对应的目标指令。
结合第一方面,在第一方面的第一种可能的实施方式中,在所述根据所述第一跳转指令生成第二跳转指令段之前,还包括:
判断所述第一跨度是否超过跨度阈值;
在所述第一跨度未超过跨度阈值时,根据所述第一跨度将所述第一跳转指令中的目标地址修改为所述第二地址;
所述根据所述第一跳转指令生成第二跳转指令段,包括:
在所述第一跨度值超过跨度阈值时,根据所述第一跳转指令生成第二跳转指令段。
结合第一方面,在第一方面的第二种可能的实施方式中,所述获取代码缓冲区中的第一跳转指令段之前,还包括:
当待拷贝的代码为第一跳转指令时,在代码缓冲区插入至少一条空指令;
将所述第一跳转指令拷贝到所述至少一条空指令之后,在所述代码缓冲区中所述至少一条空指令以及所述第一跳转指令构成所述第一跳转指令段。
结合第一方面至第一方面的第二种可能的实施方式中的任一项,在第一方面的第三种可能的实施方式中,所述根据所述第一跳转指令生成第二跳转指令段,包括:
根据所述第一跨度生成第一指令;
根据所述第一指令生成第二跳转指令。
结合第一方面的第三种可能的实施方式,在第一方面的第四种可能的实施方式中,所述根据所述第一跳转指令生成第二跳转指令段还包括:
查找空闲寄存器;
生成第二指令,所述第二指令,用于将所述空闲寄存器设置为目标寄存器,位于所述第一指令之前;
生成第三指令,所述第三指令,用于将所述目标寄存器复位,位于所述第二跳转指令之后。
结合第一方面的第四种可能的实施方式,在第一方面的第五种可能的实施方式中,所述根据所述第一跳转指令生成第二跳转指令段还包括:
生成第四指令,所述第四指令,用于将所述第二跳转指令携带的延迟槽中存储的内容替换为所述第一跳转指令携带的延迟槽中存储的内容,位于所述第二跳转指令与所述第三指令之间。
结合第一方面的第五种可能的实施方式,在第一方面的第六种可能的实施方式中,所述第一跳转指令为j指令或者jal指令;在所述第一跳转指令为j指令时,所述第二跳转指令为jr指令;在所述第一跳转指令为jal指令时,所述第二跳转指令为jalr指令。
第二方面,本发明实施例提供一种重定位装置,包括:
获取模块,用于获取代码缓冲区中的第一跳转指令段,所述第一跳转指令段包括用于直接寻址的第一跳转指令以及至少一条空指令;所述代码缓冲区用于存储插桩之后的程序代码,所述第一跳转指令存储在第一地址中,所述第一跳转指令对应的目标指令存储在第二地址中,所述第一地址与所述第二地址之间的地址跨度为第一跨度;
生成模块,用于根据所述获取模块所获取的所述第一跳转指令生成第二跳转指令段,所述第二跳转指令段包括第一指令和第二跳转指令,所述第一指令用于将所述第二地址存储到目标寄存器,所述第二跳转指令为用于指示跳转到存储在所述目标寄存器中的所述第二地址的寄存器跳转指令;
替换模块,用于将所述获取模块获取的所述第一跳转指令段替换为所述第二跳转指令段,以使得执行所述代码缓冲区中的程序代码时根据所述第二跳转指令段跳转到所述第一跳转指令对应的目标指令。
结合第二方面,在第二方面的第一种可能的实施方式中,所述重定位装置还包括:
判断模块,用于在所述生成模块根据所述第一跳转指令生成第二跳转指令段之前,判断所述第一跨度是否超过跨度阈值;
修改模块,用于在所述判断模块判断所述第一跨度未超过跨度阈值时,根据所述第一跨度将所述第一跳转指令中的目标地址修改为所述第二地址;
则所述生成模块,具体用于在所述判断模块判断所述第一跨度值超过跨度阈值时,根据所述第一跳转指令生成第二跳转指令段。
结合第二方面,在第二方面的第二种可能的实施方式中,所述重定位装置还包括:
插入模块,用于在所述获取模块获取代码缓冲区中的第一跳转指令段之前,当待拷贝的代码为第一跳转指令时,在代码缓冲区插入至少一条空指令;
拷贝模块,用于将所述第一跳转指令拷贝到所述至少一条空指令之后,在所述代码缓冲区中所述至少一条空指令以及所述第一跳转指令构成所述第一跳转指令段。
结合第二方面至第二方面的第二种可能的实施方式中的任一项,在第二方面的第三种可能的实施方式中,所述生成模块,具体包括:
第一生成单元,用于根据所述第一跨度生成第一指令;
第二生成单元,用于根据所述第一生成单元生成的所述第一指令生成第二跳转指令。
结合第二方面的第三种可能的实施方式,在第二方面的第四种可能的实施方式中,所述生成模块,还包括:
查找单元,用于查找空闲寄存器;
第三生成单元,用于生成第二指令,所述第二指令,用于将所述空闲寄存器设置为目标寄存器,位于所述第一指令之前;
第四生成单元,用于生成第三指令,所述第三指令,用于将所述目标寄存器复位,位于所述第二跳转指令之后。
结合第二方面的第四种可能的实施方式,在第二方面的第五种可能的实施方式中,所述生成模块,还包括:
第五生成单元,用于生成第四指令,所述第四指令,用于将所述第二跳转指令携带的延迟槽中存储的内容替换为所述第一跳转指令携带的延迟槽中存储的内容,位于所述第二跳转指令与所述第三指令之间。
结合第二方面的第五种可能的实施方式,在第二方面的第六种可能的实施方式中,所述第一跳转指令为j指令或者jal指令;在所述第一跳转指令为j指令时,所述第二跳转指令为jr指令;在所述第一跳转指令为jal指令时,所述第二跳转指令为jalr指令。
本发明实施例提供一种重定位方法和装置,通过获取代码缓冲区中的包括第一跳转指令和至少一条空指令的第一跳转指令段,并根据该第一跳转指令段生成第二跳转指令段后,将第一跳转指令段替换为第二跳转指令段。由于第二跳转指令段中的第一指令用于将目标指令所在的第二地址存储到目标寄存器中,第二跳转指令段中的第二跳转指令可以指向目标寄存器中的第二地址,而目标寄存器中的32位地址均可用,因此,本发明实施例利用第二跳转指令段替换第一跳转指令段,扩展了跳转指令的跳转空间,提高了程序跳转的准确性。
附图说明
图1为本发明实施例一提供的重定位方法的流程示意图;
图2为本发明实施例二提供的重定位方法的流程示意图;
图3为本发明实施例三提供的重定位装置的结构示意图一;
图4为本发明实施例三提供的重定位装置的结构示意图二;
图5为本发明实施例三提供的重定位装置的结构示意图三;
图6为本发明实施例三提供的重定位装置的结构示意图四;
图7为本发明实施例三提供的重定位装置的结构示意图五。
具体实施方式
实施例一
图1为本发明实施例一提供的重定位方法的流程示意图。该方法适用于对应用程序二进制代码进行插桩的过程中导致跳转指令空间不足的场景。在本发明实施例中,该方法的执行主体可以为计算机,还可以为其他具有无内部互锁流水级的微处理器(Microprocessor Withoutinterlocked Piped Stages,以下简称MIPS)的设备。现以利用动态二进制软件SEntre对应用程序二进制代码进行插桩为例进行详细说明,通过SEntre软件在原本的应用程序启动的时候对其进行截获,获取该应用程序的执行权限;之后,将应用程序二进制代码从原空间拷贝到代码缓冲区域,在代码拷贝的过程中,可以根据实际需要对代码进行插桩,并在代码缓冲区存储插桩后的代码。此时,若要执行代码缓冲区中的程序代码,需要对程序代码中的相关代码进行重定位。
如图1所示,本发明实施例提供的重定位方法包括:
S101:获取代码缓冲区中的第一跳转指令段,所述第一跳转指令段包括用于直接寻址的第一跳转指令以及至少一条空指令;所述代码缓冲区用于存储插桩之后的程序代码,所述第一跳转指令存储在第一地址中,所述第一跳转指令对应的目标指令存储在第二地址中,所述第一地址与所述第二地址之间的地址跨度为第一跨度。
其中,第一跳转指令是可以直接寻址的跳转指令,在代码运行时,通过直接寻址的跳转指令可以跳跃式的执行相关的指令代码,此处相关的指令代码即为目标指令。
在本实施例中,第一跳转指令段中的至少一条空指令可以存储在所述第一跳转指令之前也可以存储在所述第一跳转指令之后,当所述至少一条指令为2条以上的空指令时,2条以上的空指令存储的位置也不做限定,例如,有3条空指令,这3条空指令可以全部存储在所述第一跳转指令之前,也可以全部存储在所述第一跳转指令之后,还可以2条空指令存储在所述第一跳转指令之前、1条空指令存储在所述第一跳转指令之后,优选的,为了便于对第一跳转指令段的获取,所述至少一条空指令存储在所述第一跳转指令之前。
需要说明的是,上述第一跳转指令在原空间所在的地址与在代码缓冲区所在的第一地址是不同的。假设在原空间,第一跳转指令所在的地址为A,其要跳转到的目标指令所在的地址为B,则在进行代码拷贝以及插桩后,第一跳转指令在代码缓冲区的位置就变为第一地址,其要跳转到的目标指令所在的地址就变为第二地址;其中,原空间中的A和B之间的地址跨度若为x,代码缓冲区中第一地址与第二地址之间的地址跨度(第一跨度)可能也为x,也可能为x+y,这里的y在代码拷贝过程中进行插桩时所插入的代码占用的地址跨度。
S102:根据所述第一跳转指令生成第二跳转指令段,所述第二跳转指令段包括第一指令和第二跳转指令,所述第一指令用于将所述第二地址存储到目标寄存器,所述第二跳转指令为用于指示跳转到存储在所述目标寄存器中的所述第二地址的寄存器跳转指令。
S103:将所述第一跳转指令段替换为所述第二跳转指令段,以使得执行所述代码缓冲区中的程序代码时根据所述第二跳转指令段跳转到所述第一跳转指令对应的目标指令。
在本发明实施例中,由于第二跳转指令可以指向目标寄存器,即使对原始的程序代码进行插桩导致第一跳转指令所在的第一地址与目标指令所在的第二地址之间的地址跨度增大,在根据第二跳转指令进行跳转时,其会跳到目标寄存器里面的所存储的第二地址中(寄存器中的地址空间足够大,32位地址均可用),因而避免了由于插桩导致第一跳转指令需要跳转的地址跨度超出跨度阈值而无法对该第一跳转指令进行重定位,从而导致程序跳转出错的问题。
本发明实施例提供的重定位方法,通过获取代码缓冲区中的包括第一跳转指令和至少一条空指令的第一跳转指令段,并根据该第一跳转指令段生成第二跳转指令段后,将第一跳转指令段替换为第二跳转指令段。由于第二跳转指令段中的第一指令用于将目标指令所在的第二地址存储到目标寄存器中,第二跳转指令段中的第二跳转指令可以指向目标寄存器中的第二地址,而目标寄存器中的32位地址均可用,因此,本发明实施例利用第二跳转指令段替换第一跳转指令段,扩展了跳转指令的跳转空间,提高了程序跳转的准确性。
实施例二
图2为本发明实施例二提供的重定位方法的流程示意图。本实施例涉及的判断第一跳转指令所在的第一地址与目标指令所在的第二地址之间的第一跨度是否超过跨度阈值,并根据判断结果执行相应的操作的具体流程。如图2所示,该方法包括:
S201:当待拷贝的代码为第一跳转指令时,在代码缓冲区插入至少一条空指令。
S202:将所述第一跳转指令拷贝到所述至少一条空指令之后,在所述代码缓冲区中所述至少一条空指令以及所述第一跳转指令构成所述第一跳转指令段。
具体的,计算机将程序代码从原空间拷贝到代码缓冲区域,拷贝的过程实际上是代码逐条扫描并拷贝的过程,这里对代码的扫描实际上是对代码的类型进行扫描。当计算机在代码拷贝时,会判断该代码是否为第一跳转指令。当判断当前所扫描的某一条代码为第一跳转指令时,在代码缓冲区插入至少一条空指令,并在该第一跳转指令拷贝到至少一条空指令之后,从而在代码缓冲区中,该至少一条空指令和第一跳转指令构成第一跳转指令段。
S203:获取代码缓冲区中的第一跳转指令段,所述第一跳转指令段包括用于直接寻址的第一跳转指令以及至少一条空指令;所述代码缓冲区用于存储插桩之后的程序代码,所述第一跳转指令存储在第一地址中,所述第一跳转指令对应的目标指令存储在第二地址中,所述第一地址与所述第二地址之间的地址跨度为第一跨度。
需要说明的是,在代码拷贝的过程中,计算机可以根据实际需要对代码进行插桩,并存储插桩后的代码,也就是说代码缓冲区存储的是插桩后的程序代码。当原空间的代码完全拷贝到代码缓冲区后,计算机可以获取代码缓冲区的第一跳转指令段,该第一跳转指令段包括用于直接寻址的第一跳转指令以及至少一条空指令。该第一跳转指令存储在代码缓冲区的第一地址中,该第一跳转指令对应的目标指令存储在第二地址中。计算机可以通过相应的跳转指令跳转到第二地址所存储的目标指令上,以执行该目标指令。上述第一地址实际上是第一跳转指令在代码缓冲区所在的位置,其与目标指令所在的第二地址之间的地址跨度为第一跨度。需要说明的是,上述第一跳转指令在原空间所在的地址与在代码缓冲区所在的第一地址是不同的。假设在原空间,第一跳转指令所在的地址为A,其要跳转到的目标指令所在的地址为B,则在进行代码拷贝以及插桩后,第一跳转指令在代码缓冲区的位置就变为第一地址,其要跳转到的目标指令所在的地址就变为第二地址;其中,A和B之间的地址跨度若为x,第一地址与第二地址之间的地址跨度可能也为x,也可能为x+y,这里的y在代码拷贝过程中进行插桩时所插入的代码占用的地址跨度。
S204:判断所述第一跨度是否超过跨度阈值,若否,执行S205,若是,执行S206。
具体的,若第一跳转指令为j指令,则计算机判断j指令所在的位置(第一地址)与j指令对应的目标指令所在的位置(第二地址)之间的地址跨度(即第一跨度)是否超过跨度阈值,该跨度阈值可以为256M。
S205:在所述第一跨度未超过跨度阈值时,根据所述第一跨度将所述第一跳转指令中的目标地址修改为所述第二地址。
具体的,当计算机判断上述第一跨度没有超过跨度阈值,则可以根据该第一跨度将第一跳转指令中的目标地址修改为目标指令所在的第二地址,以使得计算机在运行到第一地址中的第一跳转指令时,根据该第一跳转指令中的修改后的目标地址跳转到第二地址中(此时的第二地址可以不用存储在目标寄存器中),从而执行第二地址中的目标指令。
S206:在所述第一跨度值超过跨度阈值时,根据所述第一跳转指令生成第二跳转指令段。
具体的,当计算机判断上述第一跨度超过跨度阈值,也就是说若计算机执行到第一地址中的第一跳转指令后,从第一跳转指令所在的第一地址跳转到目标指令所经过的第一跨度超出了跨度阈值的范围,则很有可能带来程序的跳转错误。在本发明实施例中,当第一跨度超过跨度阈值时,计算机根据第一跳转指令生成第二跳转指令段,该第二跳转指令段包括第一指令和第二跳转指令,第一指令用于将第二地址存储到目标寄存器,第二跳转指令可以指示计算机跳转到目标寄存器中的第二地址上。
S207:将所述第一跳转指令段替换为所述第二跳转指令段,以使得执行所述代码缓冲区中的程序代码时根据所述第二跳转指令段跳转到所述第一跳转指令对应的目标指令。
进一步地,在上述图2所示的实施例中,上述S206具体包括:根据第一跨度生成第一指令,并根据第一指令生成第二跳转指令。
具体的,当计算机确定了第一跳转指令所在的第一地址与目标指令所在的第二地址之间的第一跨度之后,为了能够将目标指令所在的第二地址存储至目标寄存器,以使得计算机可以通过第二跳转指令跳转至该目标寄存器中进而扩展跳转空间,因此计算机会根据上述第一跨度生成第一指令,并根据该第一指令生成第二跳转指令。需要说明的是,该生成的第二跳转指令的类型可以依第一跳转指令的类型而定。
进一步地,上述S206还可以包括:计算机还可以查找空闲寄存器,以使得计算机可以通过生成的第二指令将该空闲寄存器设定为目标寄存器,从而通过第一指令将目标指令所在的第二地址存储至目标寄存器中,并且可以通过生成的第三指令将目标寄存器进行复位。相应的,第二跳转指令段除了包括第一指令和第二跳转指令,还可以包括第二指令和第三指令。对应的,第一跳转指令段中包括预留的至少一条空指令,在将第一跳转指令段替换为第二跳转指令段时,可以是将第一跳转指令替换为第二跳转指令,将上述的至少一条空指令(此种情况下,该至少一条空指令可以为3条)分别替换为第一指令、第二指令和第三指令。
更进一步地,上述S206还可以包括:计算机还可以生成第四指令,该第四指令用于将第二跳转指令携带的延迟槽中存储的内容替换为第一跳转指令携带的延迟槽中存储的内容,由于第一跳转指令或者第二跳转指令在生成时,其后都会携带延时槽,延时槽中会随机存储一些指令,为了保证将第一跳转指令段替换为第二跳转指令段后程序代码的一致性,需要生成第四指令将第二跳转指令携带的延迟槽中存储的内容替换为第一跳转指令携带的延迟槽中存储的内容,在第一跳转指令和第二跳转指令携带的延时槽中的内容相同时,这一指令可以省略。故,第二跳转指令段除了包括第一指令、第二跳转指令、第二指令和第三指令之外,还可以包括第四指令。对应的,第一跳转指令段中包括预留的至少一条空指令,在将第一跳转指令段替换为第二跳转指令段时,可以是将第一跳转指令替换为第二跳转指令,将上述的至少一条空指令(此种情况下,该至少一条空指令可以为4条)分别替换为第一指令、第二指令、第三指令和第四指令。
需要说明的是,第一跳转指令段中的空指令的条数与第二跳转指令段中的指令条数相关。当第二跳转指令段中包括第一指令和第二跳转指令时,第一跳转指令段中空指令可以为一条;当第二跳转指令段中除了包括第一指令和第二跳转指令,还包括第二指令和第三指令时,第一跳转指令段中空指令可以为三条;当第二跳转指令段中除了包括第一指令、第二跳转指令、第二指令和第三指令,还包括第四指令时,第一跳转指令段中空指令可以为四条。当然,第二跳转指令段还可以包括其他的指令,本发明实施例在此不做限定,只是第一跳转指令段中的空指令的条数与第二跳转指令段所包括的指令条数相关即可。
另外,需要说明的是,第二跳转指令段中的各条指令在生成顺序上,本发明实施例对此并不做限制,只有在以条作为单位进行替换(即将第一跳转指令段中的指令以条为单位替换为第二跳转指令段中的各条指令)时,需要按照指令的排列顺序进行生成;否则,当以指令段为单位进行替换时,指令的生成时间不限制,只要生成之后排序即可。相应的,在排序时上述第二指令位于第一指令之后,第三指令位于第二跳转指令之后,第四指令位于第二跳转指令与第三指令之间。
进一步地,以MIPS指令集为例对第一跳转指令进行详细说明,在MIPS指令集架构中,提供了j和jal跳转指令作为直接寻址的跳转指令,即上述第一跳转指令可以为j指令或者jal指令。
其中,第一跳转指令的格式可以参见下述表1所示:
表1
跳转指令 31-26 25-0
j,target 2 target
jal,target 3 target
在表1中,26-31位是操作码,通过操作码的值来区分是j指令还是jal指令,0-25位(26位)指的是第一跳转指令j或jal与其要跳跃到的目标指令之间的地址跨度,而这个地址跨度在256M范围之内。
可选的,可以通过判断代码缓冲区的代码的26-31位的操作码的值来判断是否为第一跳转指令。若该代码的操作码的值为2,说明该代码是第一跳转指令,且是j指令;当该代码的操作码的值为3,说明该代码缓冲区的代码是第一跳转指令,且是jal指令。若待拷贝代码为j指令,则将代拷贝代码替换为jr指令;若待拷贝代码为第一跳转指令中的jal指令,则将代拷贝代码替换为jalr指令。
其中,第二跳转指令的格式可以参见下述表2所示:
表2
指令 31-26 25-21 20-16 15-11 10-6 5-0
jr s 0 s 0 0 0 8
jalr s 0 s 0 31 0 9
上述表2中,26-31位是操作码,用于区分是一般的跳转指令(例如:第一跳转指令)还是第二跳转指令;0-5位的值用于区分是该第二跳转指令是jr指令还是jalr指令;21-25位表示的是要跳转到哪一个目标寄存器中的第二地址中(目标寄存器的名称为s);16-20位是固定是0,没有实际的意义;11-15位和6-10位也是设计时所设计的固定的值。从表2可以看出,这个第二跳转指令指向目标寄存器s,该目标寄存器s具有32位的地址空间。
本发明实施例提供的重定位方法,通过判断第一跳转指令在代码缓冲区所在的第一地址与目标指令所在的第二地址之间的第一跨度是否超过跨度阈值,并在该第一跨度超过第跨度时,根据第一跳转指令生成第二跳转指令段。由于第二跳转指令段中的第一指令用于将目标指令所在的第二地址存储到目标寄存器中,第二跳转指令段中的第二跳转指令可以指向目标寄存器中的第二地址,而目标寄存器中的32位地址均可用,因此,本发明实施例利用第二跳转指令段替换第一跳转指令段,扩展了跳转指令的跳转空间,提高了程序跳转的准确性。另一方面,本发明实施例在第一跨度未超过跨度阈值时,仅将第一跳转指令的目标地址更改为第二地址,即继续沿用第一跳转指令进行跳转,这样也节省了计算机的开销。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
实施例三
图3为本发明实施例三提供的重定位装置的结构示意图一。该装置可以为计算机,也可以集成在计算机中。该装置包括:获取模块10、生成模块11和替换模块12;其中,获取模块10,用于获取代码缓冲区中的第一跳转指令段,所述第一跳转指令段包括用于直接寻址的第一跳转指令以及至少一条空指令;所述代码缓冲区用于存储插桩之后的程序代码,所述第一跳转指令存储在第一地址中,所述第一跳转指令对应的目标指令存储在第二地址中,所述第一地址与所述第二地址之间的地址跨度为第一跨度;生成模块11,用于根据所述获取模块10所获取的所述第一跳转指令生成第二跳转指令段,所述第二跳转指令段包括第一指令和第二跳转指令,所述第一指令用于将所述第二地址存储到目标寄存器,所述第二跳转指令为用于指示跳转到存储在所述目标寄存器中的所述第二地址的寄存器跳转指令;替换模块12,用于将所述获取模块10获取的所述第一跳转指令段替换为所述第二跳转指令段,以使得执行所述代码缓冲区中的程序代码时根据所述第二跳转指令段跳转到所述第一跳转指令对应的目标指令。
图4为本发明实施例三提供的重定位装置的结构示意图二。在上述图3所示重定位装置的基础上,进一步地,所述重定位装置还包括:判断模块13和修改模块14。其中,判断模块13,用于在所述生成模块11根据所述第一跳转指令生成第二跳转指令段之前,判断所述第一跨度是否超过跨度阈值;修改模块14,用于在所述判断模块13判断所述第一跨度未超过跨度阈值时,根据所述第一跨度将所述第一跳转指令中的目标地址修改为所述第二地址;则所述生成模块11,具体用于在所述判断模块13判断所述第一跨度值超过跨度阈值时,根据所述第一跳转指令生成第二跳转指令段。
图5为本发明实施例三提供的重定位装置的结构示意图三。在上述图4所示重定位装置的基础上,进一步地,所述重定位装置还包括:插入模块15和拷贝模块16。其中,插入模块15,用于在所述获取模块10获取代码缓冲区中的第一跳转指令段之前,当待拷贝的代码为第一跳转指令时,在代码缓冲区插入至少一条空指令;拷贝模块16,用于将所述第一跳转指令拷贝到所述至少一条空指令之后,在所述代码缓冲区中所述至少一条空指令以及所述第一跳转指令构成所述第一跳转指令段。
图6为本发明实施例三提供的重定位装置的结构示意图四。在上述图3、图4或图5所示实施例的基础上,进一步地,上述生成模块11,具体包括:第一生成单元111,用于根据所述第一跨度生成第一指令;第二生成单元112,用于根据所述第一指令生成第二跳转指令。
图7为本发明实施例三提供的重定位装置的结构示意图五。在上述图6所示重定位装置的基础上,进一步地,上述生成模块11,还包括:查找单元113,用于查找空闲寄存器;第三生成单元114,用于生成第二指令,所述第二指令,用于将所述空闲寄存器设置为目标寄存器,位于所述第一指令之前;第四生成单元115,用于生成第三指令,所述第三指令用于将所述目标寄存器复位,位于所述第二跳转指令之后。
可选的,上述生成模块11,还可以包括:第五生成单元116,用于生成第四指令,所述第四指令,用于将所述第二跳转指令携带的延迟槽中存储的内容替换为所述第一跳转指令携带的延迟槽中存储的内容,位于所述第二跳转指令与所述第三指令之间。
上述第一跳转指令为j指令或者jal指令;在所述第一跳转指令为j指令时,所述第二跳转指令为jr指令;在所述第一跳转指令为jal指令时,所述第二跳转指令为jalr指令。
本发明实施例提供的重定位装置可以执行上述方法实施例,其实现原理和技术效果类似,在此不再赘述。
本发明实施例提供的重定位装置,通过判断第一跳转指令在代码缓冲区所在的第一地址与目标指令所在的第二地址之间的第一跨度是否超过跨度阈值,并在该第一跨度超过第跨度时,根据第一跳转指令生成第二跳转指令段。由于第二跳转指令段中的第一指令用于将目标指令所在的第二地址存储到目标寄存器中,第二跳转指令段中的第二跳转指令可以指向目标寄存器中的第二地址,而目标寄存器中的32位地址均可用,因此,本发明实施例利用第二跳转指令段替换第一跳转指令段,扩展了跳转指令的跳转空间,提高了程序跳转的准确性。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

Claims (14)

1.一种重定位方法,其特征在于,包括:
获取代码缓冲区中的第一跳转指令段,所述第一跳转指令段包括用于直接寻址的第一跳转指令以及至少一条空指令;所述代码缓冲区用于存储插桩之后的程序代码,所述第一跳转指令存储在第一地址中,所述第一跳转指令对应的目标指令存储在第二地址中,所述第一地址与所述第二地址之间的地址跨度为第一跨度;
根据所述第一跳转指令生成第二跳转指令段,所述第二跳转指令段包括第一指令和第二跳转指令,所述第一指令用于将所述第二地址存储到目标寄存器,所述第二跳转指令为用于指示跳转到存储在所述目标寄存器中的所述第二地址的寄存器跳转指令;
将所述第一跳转指令段替换为所述第二跳转指令段,以使得执行所述代码缓冲区中的程序代码时根据所述第二跳转指令段跳转到所述第一跳转指令对应的目标指令。
2.根据权利要求1所述的重定位方法,其特征在于,在所述根据所述第一跳转指令生成第二跳转指令段之前,还包括:
判断所述第一跨度是否超过跨度阈值;
在所述第一跨度未超过跨度阈值时,根据所述第一跨度将所述第一跳转指令中的目标地址修改为所述第二地址;
所述根据所述第一跳转指令生成第二跳转指令段,包括:
在所述第一跨度超过跨度阈值时,根据所述第一跳转指令生成第二跳转指令段。
3.根据权利要求1所述的重定位方法,其特征在于,所述获取代码缓冲区中的第一跳转指令段之前,还包括:
当待拷贝的代码为第一跳转指令时,在代码缓冲区插入至少一条空指令;
将所述第一跳转指令拷贝到所述至少一条空指令之后,在所述代码缓冲区中所述至少一条空指令以及所述第一跳转指令构成所述第一跳转指令段。
4.根据权利要求1-3任一项所述的重定位方法,其特征在于,所述根据所述第一跳转指令生成第二跳转指令段,包括:
根据所述第一跨度生成第一指令;
根据所述第一指令生成第二跳转指令。
5.根据权利要求4所述的重定位方法,其特征在于,所述根据所述第一跳转指令生成第二跳转指令段还包括:
查找空闲寄存器;
生成第二指令,所述第二指令,用于将所述空闲寄存器设置为目标寄存器,位于所述第一指令之前;
生成第三指令,所述第三指令,用于将所述目标寄存器复位,位于所述第二跳转指令之后。
6.根据权利要求5所述的重定位方法,其特征在于,所述根据所述第一跳转指令生成第二跳转指令段还包括:
生成第四指令,所述第四指令,用于将所述第二跳转指令携带的延迟槽中存储的内容替换为所述第一跳转指令携带的延迟槽中存储的内容,位于所述第二跳转指令与所述第三指令之间。
7.根据权利要求6所述的重定位方法,其特征在于,所述第一跳转指令为j指令或者jal指令;在所述第一跳转指令为j指令时,所述第二跳转指令为jr指令;在所述第一跳转指令为jal指令时,所述第二跳转指令为jalr指令。
8.一种重定位装置,其特征在于,包括:
获取模块,用于获取代码缓冲区中的第一跳转指令段,所述第一跳转指令段包括用于直接寻址的第一跳转指令以及至少一条空指令;所述代码缓冲区用于存储插桩之后的程序代码,所述第一跳转指令存储在第一地址中,所述第一跳转指令对应的目标指令存储在第二地址中,所述第一地址与所述第二地址之间的地址跨度为第一跨度;
生成模块,用于根据所述获取模块所获取的所述第一跳转指令生成第二跳转指令段,所述第二跳转指令段包括第一指令和第二跳转指令,所述第一指令用于将所述第二地址存储到目标寄存器,所述第二跳转指令为用于指示跳转到存储在所述目标寄存器中的所述第二地址的寄存器跳转指令;
替换模块,用于将所述获取模块获取的所述第一跳转指令段替换为所述第二跳转指令段,以使得执行所述代码缓冲区中的程序代码时根据所述第二跳转指令段跳转到所述第一跳转指令对应的目标指令。
9.根据权利要求8所述的重定位装置,其特征在于,所述重定位装置还包括:
判断模块,用于在所述生成模块根据所述第一跳转指令生成第二跳转指令段之前,判断所述第一跨度是否超过跨度阈值;
修改模块,用于在所述判断模块判断所述第一跨度未超过跨度阈值时,根据所述第一跨度将所述第一跳转指令中的目标地址修改为所述第二地址;
则所述生成模块,具体用于在所述判断模块判断所述第一跨度超过跨度阈值时,根据所述第一跳转指令生成第二跳转指令段。
10.根据权利要求8所述的重定位装置,其特征在于,所述重定位装置还包括:
插入模块,用于在所述获取模块获取代码缓冲区中的第一跳转指令段之前,当待拷贝的代码为第一跳转指令时,在代码缓冲区插入至少一条空指令;
拷贝模块,用于将所述第一跳转指令拷贝到所述至少一条空指令之后,在所述代码缓冲区中所述至少一条空指令以及所述第一跳转指令构成所述第一跳转指令段。
11.根据权利要求8-10任一项所述的重定位装置,其特征在于,所述生成模块,具体包括:
第一生成单元,用于根据所述第一跨度生成第一指令;
第二生成单元,用于根据所述第一生成单元生成的所述第一指令生成第二跳转指令。
12.根据权利要求11所述的重定位装置,其特征在于,所述生成模块,还包括:
查找单元,用于查找空闲寄存器;
第三生成单元,用于生成第二指令,所述第二指令,用于将所述空闲寄存器设置为目标寄存器,位于所述第一指令之前;
第四生成单元,用于生成第三指令,所述第三指令,用于将所述目标寄存器复位,位于所述第二跳转指令之后。
13.根据权利要求12所述的重定位装置,其特征在于,所述生成模块,还包括:
第五生成单元,用于在生成第四指令,所述第四指令,用于将所述第二跳转指令携带的延迟槽中存储的内容替换为所述第一跳转指令携带的延迟槽中存储的内容,位于所述第二跳转指令与所述第三指令之间。
14.根据权利要求13所述的重定位装置,其特征在于,所述第一跳转指令为j指令或者jal指令;在所述第一跳转指令为j指令时,所述第二跳转指令为jr指令;在所述第一跳转指令为jal指令时,所述第二跳转指令为jalr指令。
CN201410195468.0A 2014-05-09 2014-05-09 重定位方法和装置 Active CN103955354B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201410195468.0A CN103955354B (zh) 2014-05-09 2014-05-09 重定位方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201410195468.0A CN103955354B (zh) 2014-05-09 2014-05-09 重定位方法和装置

Publications (2)

Publication Number Publication Date
CN103955354A CN103955354A (zh) 2014-07-30
CN103955354B true CN103955354B (zh) 2017-03-15

Family

ID=51332631

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410195468.0A Active CN103955354B (zh) 2014-05-09 2014-05-09 重定位方法和装置

Country Status (1)

Country Link
CN (1) CN103955354B (zh)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104035825B (zh) * 2014-06-17 2018-01-02 龙芯中科技术有限公司 跳转源列表处理方法、装置及编译器
CN106155660B (zh) * 2015-04-14 2019-06-25 龙芯中科技术有限公司 随机测试程序生成方法及装置
CN106445575B (zh) * 2015-08-13 2019-12-31 龙芯中科技术有限公司 程序的重写方法和装置
CN106874222B (zh) * 2016-12-26 2020-12-15 深圳市紫光同创电子有限公司 指令延时控制方法、控制器以及存储器
CN108874468B (zh) * 2018-06-20 2021-03-26 深圳市腾讯网络信息技术有限公司 应用程序的加载方法、装置、计算机设备及存储介质
CN115017058B (zh) * 2022-08-04 2022-11-29 飞腾信息技术有限公司 一种内核模块的测试方法、装置、电子设备及存储介质

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103399775A (zh) * 2013-08-05 2013-11-20 北京华为数字技术有限公司 一种热补丁方法及设备

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20120083802A (ko) * 2011-01-18 2012-07-26 삼성전자주식회사 가상머신을 위한 코드 재배치 장치 및 방법

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103399775A (zh) * 2013-08-05 2013-11-20 北京华为数字技术有限公司 一种热补丁方法及设备

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
DIOTA: Dynamic Instrumentation, Optimization and Transformation of Applications;Jonas Maebe等;《International Conference on Parallel Architectures and Compilation Techniques》;20021231;第1-11页 *

Also Published As

Publication number Publication date
CN103955354A (zh) 2014-07-30

Similar Documents

Publication Publication Date Title
CN103955354B (zh) 重定位方法和装置
CN100401258C (zh) 用于在执行被转换指令时维持环境的方法
CN103927187B (zh) 嵌入式系统程序执行方法
CN108027748B (zh) 指令集模拟器及其模拟器生成方法
JPH04225431A (ja) 命令キャッシュ効率を増大するコンピュータ命令をコンパイルする方法
US11494308B2 (en) Methods and devices for bypassing the internal cache of an advanced DRAM memory controller
US20080127151A1 (en) Source Code Modification Technique
CN109101237A (zh) 代码的加密编译方法及装置
CN105653906A (zh) 基于地址随机的反内核挂钩方法
US20100083379A1 (en) Information processing device, information processing method, and computer readable recording medium
CN105446725A (zh) 用于模型驱动开发的方法和系统
KR20210011060A (ko) 분기 명령어의 유형에 기초한 사전 분기 예측의 선택적 수행
JP2007531946A (ja) データ処理装置におけるデータ整合性
CN104049947B (zh) 基于动态重命名的矢量寄存器堆的寄存器重新配置
US20210141907A1 (en) Method and device for patching vulnerability of binary
US7269828B2 (en) Method for safely instrumenting large binary code
CN106055343A (zh) 一种基于程序演进模型的目标代码逆向工程系统
CN101847096A (zh) 包含栈变量函数的优化方法
CN109145534A (zh) 针对软件虚拟机保护的反混淆系统及方法
CN107977577A (zh) 访存指令访问检测方法及装置
CN109739824A (zh) 日志获取方法及设备
CN110737573B (zh) 用户界面ui自动化测试的方法和装置
CN107885489B (zh) 一种快速检测实名登记数据指标的方法和系统
US20130152049A1 (en) Warning of register and storage area assignment errors
CN103106097A (zh) 一种即时编译系统中的栈运算优化方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CP01 Change in the name or title of a patent holder
CP01 Change in the name or title of a patent holder

Address after: 100095 Building 2, Longxin Industrial Park, Zhongguancun environmental protection technology demonstration park, Haidian District, Beijing

Patentee after: Loongson Zhongke Technology Co.,Ltd.

Address before: 100095 Building 2, Longxin Industrial Park, Zhongguancun environmental protection technology demonstration park, Haidian District, Beijing

Patentee before: LOONGSON TECHNOLOGY Corp.,Ltd.