CN103399774A - 链接方法及链接器及计算机系统 - Google Patents
链接方法及链接器及计算机系统 Download PDFInfo
- Publication number
- CN103399774A CN103399774A CN2013103230890A CN201310323089A CN103399774A CN 103399774 A CN103399774 A CN 103399774A CN 2013103230890 A CN2013103230890 A CN 2013103230890A CN 201310323089 A CN201310323089 A CN 201310323089A CN 103399774 A CN103399774 A CN 103399774A
- Authority
- CN
- China
- Prior art keywords
- file destination
- input file
- function
- long jump
- jump
- 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
Images
Abstract
本发明涉及计算机领域,公开了一种链接方法及链接器及计算机系统。方法包括:根据输入目标文件序列中的各输入目标文件,确定各输入目标文件的函数跳转是否为长跳转,如果是长跳转,则在各长跳转的调用函数所在的输入目标文件中为各长跳转分别创建各中转代码段,分配空间,创建中转标号;确定输入目标文件的各段在输出目标文件被映射到的段的段映射信息,将段映射信息写入输入目标文件;在发生长跳转的输入目标文件中写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件,链接长跳转修正后的输入目标文件,生成可执行文件。一避免由于长跳转而导致的链接失败的问题,另一节省了系统空间开销,节省了指令,有利于提高程序执行效率以及性能。
Description
技术领域
本发明涉及计算机领域,特别涉及一种链接方法及链接器及计算机系统。
背景技术
编译工具对软件程序的最后一个处理过程是链接,由链接器ld来完成。而在链接过程中,如果输入目标文件中的某调用函数与其对应的被调函数的跳转长度过远(譬如在ARM下,该函数额跳转长度大于系统预定的跳转上限32M),则函数跳转就会发生跳转错误,导致程序执行出错。
譬如当前链接为完全链接时,链接器对输入目标文件a.o、输入目标文件b.o、输入目标文件c.o、输入目标文件d.o、输入目标文件e.o、以及输入目标文件f.o进行完全链接(其链接命令:ld a.o b.o c.o d.o e.o f.o);如果a.o中的一调用函数与其对应的被调函数之间的跳转长度过长时候,则连接发生错误。
譬如当前链接为部分链接时,链接器对输入目标文件a.o、b.o、c.o、d.o先进行部分链接,得到一临时文件,然后对该临时文件与输入目标文件e.o、以及f.o进行完全链接(其汇编代码如:ld-r-o tmp a.o b.o c.o d.o e.o f.o;ldtmp.o e.o f.o);由于在部分链接中,部分链接只处理段级别的重定位,不会处理符号级别即函数级别的重定位,即使a.o中的一调用函数与其对应的被调函数之间的跳转长度过长时候,在部分链接环节(链接命令ld–r)步骤也不会暴露存在的长跳转错误,但是在最终链接过程时,该长跳转溢出导致的链接失败才会暴露出来,导致最终链接失败。
现有技术中将当前函数跳转的长度大于当前系统指令跳转的最大上限的跳转记为长跳转。
为了解决上述的由于长跳转导致问题,现有技术通常采用以下技术方案实现:
通过跳转到寄存器完成跳转:通过一条加载指令将跳转目标地址加载到一寄存器,然后通过这个寄存器完成了跳转。
在进行本发明的研究过程中,本发明人发现现有技术至少存在以下的缺陷:
通过寄存器完成跳转方案,虽然能够避免了系统指令跳转范围的限制,但是,其对长跳转的问题解决上需要消耗大量的代码以及的处理时间来完成跳转,导致程序性能以及效率大大降低。
发明内容
本发明实施例第一目的在于提供一种链接方法方法,应用该技术方案既避免由于长跳转而导致的链接失败的问题,还有利于提高程序执行性能。
本发明实施例第二目的在于提供一种链接方法方法,应用该技术方案既避免由于长跳转而导致的链接失败的问题,还有利于提高程序执行性能。
本发明实施例第三目的在于提供一种链接器,应用该技术方案既避免由于长跳转而导致的链接失败的问题,还有利于提高程序执行性能。
本发明实施例第四目的在于提供一种链接器,应用该技术方案既避免由于长跳转而导致的链接失败的问题,还有利于提高程序执行性能。
本发明实施例第五目的在于提供一种计算机,应用该技术方案既避免由于长跳转而导致的链接失败的问题,还有利于提高程序执行性能。
本发明实施例第六目的在于提供一种计算机,应用该技术方案既避免由于长跳转而导致的链接失败的问题,还有利于提高程序执行性能。
第一方面,本发明实施例提供的一种链接方法,包括:
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,
如果是长跳转,则:
在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,为各所述中转代码段分配空间,在各所述中间代码段中创建中转标号;
在所述输入目标文件的重定位段中创建中间代码段重定位信息;
确定所述输入目标文件的各段在输出目标文件中、被映射到的段的段映射信息,将所述段映射信息写入输入目标文件;
确定所述输入目标文件的各所述段的在输出目标文件中的加载地址信息,将所述加载地址信息信息写入所述输入目标文件;
在调用调整信息所述中间代码段写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件,
所述调用调整信息具体是:将所述长跳转的调用函数跳转至所述中转标号,将所述中转标号跳转至所述长跳转的被调用函数;
部分链接所述长跳转修正后的输入目标文件,生成输出目标文件。
第二方面,本发明实施例提供的一种链接方法,包括:
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,
如果是长跳转,则在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,为各所述中转代码段分配空间,在各所述中间代码段中创建中转标号;
确定所述输入目标文件的各段在输出目标文件被映射到的段的段映射信息,将所述段映射信息写入输入目标文件;
在发生所述长跳转的输入目标文件中写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件,
所述调用调整信息具体是:将所述长跳转的调用函数跳转至所述中转标号,将所述中转标号跳转至所述长跳转的被调用函数;链接所述长跳转修正后的输入目标文件,生成可执行文件。
结合第二方面,在第一种实现方式下,在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,包括:
在各所述长跳转的调用函数所在的所述输入目标文件的尾部为各所述长跳转分别创建各中转代码段;
确定所述输入目标文件的各段在输出目标文件中被映射到的段的段映射信息,将所述段映射信息写入输入目标文件,包括:
分别确定所述输入目标文件的各代码段,在输出目标文件中被映射到的段的段映射信息,使任一所述中转代码段分别位于所述中间代码段对应的所述输入目标文件的代码段的尾部;
将所述段映射信息写入输入目标文件。
结合第二方面,在第一种实现方式下,根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,包括:
根据所述输入目标文件中的预定义长跳转标记信息,确定所述输入目标文件的函数跳转是否为长跳转。
结合第二方面,在第一种实现方式下,根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,包括:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件与被调用函数所在的被调用输入目标文件的文件偏移长度,
如果所述文件偏移长度大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
结合第二方面,在第一种实现方式下,根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,包括:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
结合第二方面,在第一种实现方式下,根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,包括:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的被调用函数所在的被调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
结合第二方面,在第一种实现方式下,根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,包括:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件的长度、被调用函数所在的被调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
结合第二方面,在第一种实现方式下,
在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,包括:
在各所述长跳转的调用函数所在的所述输入目标文件的尾部为各所述长跳转分别创建各中转代码段;
确定所述输入目标文件的各段在输出目标文件中被映射到的段的段映射信息,将所述段映射信息写入输入目标文件,包括:
分别确定所述输入目标文件的各代码段,在输出目标文件中被映射到的段的段映射信息,使任一所述中转代码段分别位于所述中间代码段对应的所述输入目标文件的代码段的尾部;
将所述段映射信息写入输入目标文件。
结合第一方面,在第一种实现方式下,根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,包括:
根据所述输入目标文件中的预定义长跳转标记信息,确定所述输入目标文件的函数跳转是否为长跳转。
结合第一方面,在第一种实现方式下,根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,包括:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件与被调用函数所在的被调用输入目标文件的文件偏移长度,
如果所述文件偏移长度大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
结合第一方面,在第一种实现方式下,根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,包括:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
结合第一方面,在第一种实现方式下,根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,包括:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的被调用函数所在的被调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
结合第一方面,在第一种实现方式下,根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,包括:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件的长度、被调用函数所在的被调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
第三方面,本发明实施例提供的一种链接器,包括:
长跳转判定单元,用于根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转;
中转代码段创建单元,当任一所述输入目标文件的函数跳转为长跳转时,用于在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,为各所述中转代码段分配空间,在各所述中间代码段中创建中转标号;
中转代码段重定位信息创建单元,当任一所述输入目标文件的函数跳转为长跳转时,用于在所述输入目标文件的重定位段中创建中间代码段重定位信息;
段映射单元,确定所述输入目标文件的各段在输出目标文件中的被映射到的段的段映射信息,将所述段映射信息写入输入目标文件;
重定位单元,用于确定所述输入目标文件的各所述段的在输出目标文件中的加载地址信息,将所述加载地址信息写入所述输入目标文件;
调用调整信息写入单元,用于在所述中间代码段写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件,
所述调用调整信息具体是:当任一所述输入目标文件的函数跳转为长跳转时,将所述长跳转的调用函数跳转至所述中转标号,将所述中转标号跳转至所述长跳转的被调用函数;
部分链接单元,部分链接所述长跳转修正后的输入目标文件,生成输出目标文件。
结合第三方面,在第一种实现方式下,所述中转代码段创建单元具体用于:在各所述长跳转的调用函数所在的所述输入目标文件的尾部为各所述长跳转分别创建各中转代码段;
所述段映射单元具体用于:分别确定所述输入目标文件的各代码段,在输出目标文件中被映射到的段的段映射信息,使任一所述中转代码段分别位于所述中间代码段对应的所述输入目标文件的代码段的尾部,将所述段映射信息写入输入目标文件。
结合第三方面,在第一种实现方式下,所述长跳转判定单元,具体用于:根据所述输入目标文件中的预定义长跳转标记信息,确定所述输入目标文件的函数跳转是否为长跳转。
结合第三方面,在第一种实现方式下,所述长跳转判定单元,具体用于:遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件与被调用函数所在的被调用输入目标文件的文件偏移长度,
如果所述文件偏移长度大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
结合第三方面,在第一种实现方式下,所述长跳转判定单元,具体用于:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
结合第三方面,在第一种实现方式下,所述长跳转判定单元,具体用于:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的被调用函数所在的被调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
当任一所述输入目标文件的函数跳转为长跳转时,用于在所述输入目标文件的重定位段中创建中间代码段重定位信息;
结合第三方面,在第一种实现方式下,所述长跳转判定单元,具体用于:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件的长度、被调用函数所在的被调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
第四方面,本发明实施例提供的一种链接器,包括:
长跳转判定单元,用于根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,
中转代码段创建单元,当任一所述输入目标文件的函数跳转为长跳转时,用于在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,为各所述中转代码段分配空间,在各所述中间代码段中创建中转标号;
中转代码段重定位信息创建单元,当任一所述输入目标文件的函数跳转为长跳转时,用于确定所述输入目标文件的各段在输出目标文件被映射到的段的段映射信息,将所述段映射信息写入输入目标文件;
段映射单元,用于确定所述输入目标文件的各段在输出目标文件被映射到的段的段映射信息,将所述段映射信息写入输入目标文件;
调用调整信息写入单元,当任一所述输入目标文件的函数跳转为长跳转时,用于在发生所述长跳转的输入目标文件中写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件,
所述调用调整信息具体是:将所述长跳转的调用函数跳转至所述中转标号,将所述中转标号跳转至所述长跳转的被调用函数;
完全链接单元,用于完全链接所述长跳转修正后的输入目标文件,生成可执行文件。
结合第四方面,在第一种实现方式下,所述中转代码段创建单元具体用于:在各所述长跳转的调用函数所在的所述输入目标文件的尾部为各所述长跳转分别创建各中转代码段;
所述段映射单元具体用于:分别确定所述输入目标文件的各代码段,在输出目标文件中被映射到的段的段映射信息,使任一所述中转代码段分别位于所述中间代码段对应的所述输入目标文件的代码段的尾部,将所述段映射信息写入输入目标文件。
结合第四方面,在第一种实现方式下,所述长跳转判定单元,具体用于:根据所述输入目标文件中的预定义长跳转标记信息,确定所述输入目标文件的函数跳转是否为长跳转。
结合第四方面,在第一种实现方式下,所述长跳转判定单元,具体用于:遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件与被调用函数所在的被调用输入目标文件的文件偏移长度,
如果所述文件偏移长度大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
结合第四方面,在第一种实现方式下,所述长跳转判定单元,具体用于:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
结合第四方面,在第一种实现方式下,所述长跳转判定单元,具体用于:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的被调用函数所在的被调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
当任一所述输入目标文件的函数跳转为长跳转时,用于在所述输入目标文件的重定位段中创建中间代码段重定位信息;
结合第四方面,在第一种实现方式下,所述长跳转判定单元,具体用于:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件的长度、被调用函数所在的被调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
第五方面,本发明实施例提供的一种计算机系统,包括:
总线;
与所述总线相连的处理器;
与所述总线相连的存储器;
其中,所述处理器通过所述总线,调用所述存储器中存储的代码,以用于:
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,
如果是长跳转,则:
在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,为各所述中转代码段分配空间,在各所述中间代码段中创建中转标号;
在所述输入目标文件的重定位段中创建中间代码段重定位信息;
确定所述输入目标文件的各段在输出目标文件中、被映射到的段的段映射信息,将所述段映射信息写入输入目标文件;
确定所述输入目标文件的各所述段的在输出目标文件中的加载地址信息,将所述加载地址信息写入所述输入目标文件;
在所述中间代码段写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件,
所述调用调整信息具体是:将所述长跳转的调用函数跳转至所述中转标号,将所述中转标号跳转至所述长跳转的被调用函数;
部分链接所述长跳转修正后的输入目标文件,生成输出目标文件。
第六方面,本发明实施例提供的一种计算机系统,包括:
总线;
与所述总线相连的处理器;
与所述总线相连的存储器;
其中,所述处理器通过所述总线,调用所述存储器中存储的代码,以用于:
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,
如果是长跳转,则在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,为各所述中转代码段分配空间,在各所述中间代码段中创建中转标号;
确定所述输入目标文件的各段在输出目标文件被映射到的段的段映射信息,将所述段映射信息写入输入目标文件;
在发生所述长跳转的输入目标文件中写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件,
所述调用调整信息具体是:将所述长跳转的调用函数跳转至所述中转标号,将所述中转标号跳转至所述长跳转的被调用函数;链接所述长跳转修正后的输入目标文件,生成可执行文件。
由上可见,应用本实施例技术方案,由于本实施例在输入的输入目标文件序列后,根据输入目标文件确定各输入目标文件的函数跳转是否为长跳转,一旦发生长跳转,则进行以下一系列的长跳转修正操作:创建各中转代码段、中间代码段重定位信息创建、分别在各中转代码段分别写入各长跳转唯一对应的调用调整信息对应的汇编代码,从而对长跳转的调用信息进行修改:将所述长跳转的调用函数跳转至中转标号,将中转标号跳转至所述长跳转的被调用函数,确保调用函数跳转至中转标号,中转标号跳转至所述长跳转的被调用函数的跳转均不属于长跳转,得到长跳转修正后的输入目标文件,然后再部分链接所述长跳转修正后的输入目标文件,生成输出目标文件。采用该技术方案相对于现有技术一方面避免了由于长跳转而导致的链接失败的问题,另一方面其相对于现有技术中跳转到寄存器的技术方案,节省了系统空间开销,节省了指令,有利于提高程序执行性能。
附图说明:
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例1提供的一种链接方法流程示意图;
图2本发明实施例1-7中涉及的函数跳转示意图;
图3发明实施例1-7中涉及的段映射示意图;
图4为发明实施例2供的一种链接方法流程示意图;
图5发明实施例3提供的一种链接器结构示意图;
图6发明实施例4提供的一种链接器结构示意图;
图7发明实施例5提供的一种计算机系统结构示意图;
图8发明实施例6提供的一种计算机系统结构示意图;
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例1:
参见图1所示,本实施例提供了一种链接方法,其主要包括以下步骤:
步骤101:判定是否会发生长跳转,如果是,则执行步骤102,否则,执行步骤108。
在打开输入文件后,向链接器输入由包含该输入文件中所有目标文件构成的输入文件序列,根据该输入文件序列确定各输入目标文件的函数跳转是否为长跳转,如果存在某函数跳转为长跳转,则确定为会发生长跳转,否则,不会发生长跳转。
本步骤中,根据输入文件序列确定各输入目标文件的函数跳转是否为长跳转的具体实施方案可以但不限于采用现有技术实现。也可以但不限于按照本发明实施例提供的以下任一长跳转判定技术方案实现:
长跳转判定技术方案一:根据所述输入目标文件中的预定义长跳转标记信息,确定所述输入目标文件的函数跳转是否为长跳转。
参见图3所示,长跳转判定技术方案二:遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件与被调用函数所在的被调用输入目标文件的文件偏移长度size_min,
如果所述文件偏移长度size_min大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
参见图2所示,长跳转判定技术方案三:遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件的长度size_min、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度size_begin之和size_min+size_begin是否大于预定函数跳转长度上限,
如果size_min+size_begin大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
参见图2所示,长跳转判定技术方案四:遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的被调用函数所在的被调用输入目标文件的长度size_min、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度size_end之和size_min+size_end是否大于预定函数跳转长度上限,
如果size_min+size_end大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
参见图2所示,长跳转判定技术方案五:遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件的长度size_min、被调用函数所在的被调用输入目标文件的长度size_begin、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度size_max之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
长跳转判定技术方案还可以为长跳转判定技术方案二至五之任意两个或者两个以上的组合匹配。
步骤102:创建中转代码段。
本步骤具体是:在各长跳转的调用函数所在的输入目标文件中为各长跳转分别创建各中转代码段,为各中转代码段分配空间,在各中间代码段中创建中转标号。
譬如:参见图2所示,对于以下对输入目标文件:a.o b.o c.o d.o e.o f.og.o……i.o进行部分链接得到临时文件tmp.o的情形(链接命令为:ld –r –otmp.o a.o b.o c.o d.o e.o f.o g.o……i.o),设如果输入目标文件c.o中的某函数(记为调用函数)需要调用输入目标文件k.o中的另一函数(记为被调用函数),如果调用函数到被调用函数之间的跳转为长跳转(记为长跳转1),则在输入目标文件c.o中为该长跳转1创建一中转代码段(记为中转代码段1),为中转代码段1分配空间,在中间代码段1中创建中转标号(记为中转标号1)。
同理地,如果在其他输入目标文件(a.o b.o d.o e.o f.o g.o……i.o中的任一)中存在发生长跳转的调用函数,则在该发生长跳转调用函数所在的输入目标文件中创建中转代码段,分别为各创建的中转代码段分配空间,分别在各创建的各中间代码段中创建与该长跳转唯一对应的中转标号。其中任一长跳转分别与该跳转的调用函数、被调用函数分别唯一对应。
在本实施例中,在各长跳转的调用函数所在的输入目标文件中为各所述长跳转分别创建各中转代码段时,可以但不限于在各长跳转的调用函数所在的输入目标文件的前部或者中部或者其他位置为各长跳转分别创建各中转代码段。
作为本实施例的示意,可以但不限于在各长跳转的调用函数所在的输入目标文件的尾部为各长跳转分别创建各中转代码段,参见图3所示。采用该技术方案有利于进一步简化中转代码段位置的计算,有利于提高程序执行效率以及性能。
步骤103:在输入目标文件的重定位段中创建中间代码段重定位信息。
在重定位段中创建中间代码段重定位信息(此时中间代码段重定位信息在创建初始化时为空),为该创建的中间代码段重定位信息分配空间,以便后期在该分配空间内写入具体的中间代码段重定位信息。
步骤104:段映射。
确定各输入目标文件的各段在输出目标文件中被映射到的段的段映射信息,将段映射信息写入输入目标文件。
本步骤可以但不限于按照现有技术实现。
在本实施例中,在会发生长跳转的情况下,由于在步骤102中在各在长跳转的调用函数所在的输入目标文件中为各长跳转创建了中转代码段,即相对于现有技术改变了源文件:输入目标文件。
当输入目标文件c.o对应的代码段303不会发生长跳转,输入目标文件a.o、b.o、c.o分别对应的代码段301、代码段302、代码段304将发生长跳转,且在步骤102时将发生长跳转的中转代码段3011、3021、3041分别创建在各代码段301、302、304的尾部时,在本步骤进行段映射时:
分别确定输入目标文件的各代码段在输出目标文件中被映射到的段的段映射信息,使任一中转代码段分别位于所述中间代码段对应的所述输入目标文件的代码段的尾部,,得到如图3中300所示的被影射的输出文件代码段结构。
步骤105:段重定位。
本步骤具体是,确定各输入目标文件的各段的在输出目标文件中的加载地址信息,将各加载地址信息写入输入目标文件。
本步骤可以但不限于按照现有技术实现。
步骤106:在各中间代码段分别写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件。
对于步骤102为各长跳转创建的各中间代码段内,分别为各长跳转写入各长跳转的调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件。
该各长跳转的调用调整信息对应的具体是:将长跳转的调用函数跳转至本长跳转唯一对应的中转标号,再将该中转标号跳转至本长跳转的被调用函数。
步骤107:部分链接上述长跳转修正后的输入目标文件,生成输出目标文件。
对经过长跳转修正后的输入目标文件进行部分链接,生成输出目标文件,以供后续对该输出目标文件进行链接操作,最终得到可执行文件,
步骤108:按照现有技术对输入目标文件进行部分链接处理。
由上可见,应用本实施例技术方案,由于本实施例在输入的输入目标文件序列后,根据输入目标文件确定各输入目标文件的函数跳转是否为长跳转,一旦发生长跳转,则进行以下一系列的长跳转修正操作:创建各中转代码段、中间代码段重定位信息创建、分别在各中转代码段分别写入各长跳转唯一对应的调用调整信息对应的汇编代码,从而对长跳转的调用信息进行修改:将所述长跳转的调用函数跳转至中转标号,将中转标号跳转至所述长跳转的被调用函数,确保调用函数跳转至中转标号,中转标号跳转至所述长跳转的被调用函数的跳转均不属于长跳转,得到长跳转修正后的输入目标文件,然后再部分链接所述长跳转修正后的输入目标文件,生成输出目标文件。采用该技术方案相对于现有技术一方面避免了由于长跳转而导致的链接失败的问题,另一方面其相对于现有技术中跳转到寄存器的技术方案,节省了系统空间开销,节省了指令,有利于提高程序执行效率以及性能。
实施例2:
参见图4所示,本实施例提供了一种链接方法,其主要包括以下步骤:
步骤401:判定是否会发生长跳转,如果是,则执行步骤402,否则,执行步骤407。
本实施例具体可以但不限于参见实施例1中步骤101所示,在这里不做赘述。
步骤402:创建中转代码段。
本实施例具体可以但不限于参见实施例1中步骤102所示,在这里不做赘述。
步骤403:在输入目标文件的重定位段中创建中间代码段重定位信息。
本实施例具体可以但不限于参见实施例1中步骤103所示,在这里不做赘述。
步骤404:段映射。
本实施例具体可以但不限于参见实施例1中步骤104所示,在这里不做赘述。
步骤405:在各中间代码段分别写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件。
本实施例具体可以但不限于参见实施例1中步骤106所示,在这里不做赘述。
步骤406:完全链接长跳转修正后的输入目标文件,生成可执行文件。
对经过长跳转修正后的输入目标文件进行完全链接,得到可执行文件。
步骤407:完全链接输入目标文件,生成可执行文件。
对于不会发生长跳转的情形,则按照现有技术直接完全链接输入目标文件,生成可执行文件。
由上可见,与实施例同理,由于本实施例在输入的输入目标文件序列后,根据输入目标文件确定各输入目标文件的函数跳转是否为长跳转,一旦发生长跳转,则进行以下一系列的长跳转修正操作:创建各中转代码段、中间代码段重定位信息创建、分别在各中转代码段分别写入各长跳转唯一对应的调用调整信息对应的汇编代码,从而对长跳转的调用信息进行修改:将所述长跳转的调用函数跳转至中转标号,将中转标号跳转至所述长跳转的被调用函数,确保调用函数跳转至中转标号,中转标号跳转至所述长跳转的被调用函数的跳转均不属于长跳转,得到长跳转修正后的输入目标文件,然后再部分链接所述长跳转修正后的输入目标文件,生成输出目标文件。采用该技术方案相对于现有技术一方面避免了由于长跳转而导致的链接失败的问题,另一方面其相对于现有技术中跳转到寄存器的技术方案,节省了系统空间开销,节省了指令,有利于提高程序执行效率以及性能。
实施例3:
参见图5所示,
本实施例提供了一种链接器,该链接器具体为被预先定义或者设置为采用部分链接方式的链接器。本实施例链接器主要包括:长跳转判定单元501、中转代码段创建单元502、中转代码段重定位信息创建单元503、段映射单元504、重定位单元505、调用调整信息写入单元506、以及部分链接单元507。
其中各部分的连接关系以及工作原理如下:
长跳转判定单元501根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转;
中转代码段创建单元502当任一所述输入目标文件的函数跳转为长跳转时,在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,为各所述中转代码段分配空间,在各所述中间代码段中创建中转标号;
中转代码段重定位信息创建单元503,当任一所述输入目标文件的函数跳转为长跳转时,在所述输入目标文件的重定位段中创建中间代码段重定位信息;
段映射单元504确定所述输入目标文件的各段在输出目标文件中的被映射到的段的段映射信息,将所述段映射信息写入输入目标文件;
重定位单元505确定所述输入目标文件的各所述段的在输出目标文件中的加载地址信息,将所述加载地址信息写入所述输入目标文件;
调用调整信息写入单元506,当任一所述输入目标文件的函数跳转为长跳转时,在所述中间代码段写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件,所述调用调整信息具体是:当任一所述输入目标文件的函数跳转为长跳转时,将所述长跳转的调用函数跳转至所述中转标号,将所述中转标号跳转至所述长跳转的被调用函数;
部分链接单元507,部分链接所述长跳转修正后的输入目标文件,生成输出目标文件。
进一步的工作原理以及相应的有益效果详细参见实施例1的相应描述。
实施例3:
参见图6所示,本实施例提供了一种链接器,该链接器具体为被预先定义或者设置为采用部分链接方式的链接器。本实施例链接器主要包括:长跳转判定单元601、中转代码段创建单元602、中转中转代码段重定位信息创建单元603、段映射单元604、调用调整信息写入单元605、以及完全链接单元606。
其中各部分的连接关系以及工作原理如下:
长跳转判定单元601,根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,
中转代码段创建单元602,当任一输入目标文件的函数跳转为长跳转时,中转代码段创建单元602在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,为各所述中转代码段分配空间,在各所述中间代码段中创建中转标号;
中转中转代码段重定位信息创建单元603,当任一所述输入目标文件的函数跳转为长跳转时,中转中转代码段重定位信息创建单元603确定所述输入目标文件的各段在输出目标文件被映射到的段的段映射信息,将所述段映射信息写入输入目标文件;
段映射单元604,确定所述输入目标文件的各段在输出目标文件被映射到的段的段映射信息,将所述段映射信息写入输入目标文件;
调用调整信息写入单元605,当任一所述输入目标文件的函数跳转为长跳转时,调用调整信息写入单元605在发生所述长跳转的输入目标文件中写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件,其中调用调整信息具体是:将所述长跳转的调用函数跳转至所述中转标号,将所述中转标号跳转至所述长跳转的被调用函数;
完全链接单元,完全链接所述长跳转修正后的输入目标文件,生成可执行文件。
进一步的工作原理以及相应的有益效果详细参见实施例2的相应描述。
实施例5:
参见图7所示,本实施例提供了一种计算机系统,其包括:
总线703;
与所述总线703相连的处理器701;
与所述总线703相连的存储器702;
其中,所述处理器701通过所述总线703,调用所述存储器702中存储的代码,以用于:
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,
如果是长跳转,则:
在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,为各所述中转代码段分配空间,在各所述中间代码段中创建中转标号;
在所述输入目标文件的重定位段中创建中间代码段重定位信息;
确定所述输入目标文件的各段在输出目标文件中、被映射到的段的段映射信息,将所述段映射信息写入输入目标文件;
确定所述输入目标文件的各所述段的在输出目标文件中的加载地址信息,将所述加载地址信息写入所述输入目标文件;
在所述中间代码段写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件,
所述调用调整信息具体是:将所述长跳转的调用函数跳转至所述中转标号,将所述中转标号跳转至所述长跳转的被调用函数;
部分链接所述长跳转修正后的输入目标文件,生成输出目标文件。
进一步的工作原理以及相应的有益效果详细参见实施例1的相应描述。
实施例6:
参见图8所示,本实施例提供了种计算机系统,其包括:
总线;
与所述总线相连的处理器801;
与所述总线相连的存储器702;
其中,所述处理器通过所述总线,调用所述存储器702中存储的代码,以用于:
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,
如果是长跳转,则在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,为各所述中转代码段分配空间,在各所述中间代码段中创建中转标号;
确定所述输入目标文件的各段在输出目标文件被映射到的段的段映射信息,将所述段映射信息写入输入目标文件;
确定所述输入目标文件的各所述段的在输出文件中的加载地址信息,将所述加载地址信息写入所述输入目标文件;
在发生所述长跳转的输入目标文件中写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件,
所述调用调整信息具体是:将所述长跳转的调用函数跳转至所述中转标号,将所述中转标号跳转至所述长跳转的被调用函数;链接所述长跳转修正后的输入目标文件,生成可执行文件。
进一步的工作原理以及相应的有益效果详细参见实施例2的相应描述。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
以上所述的实施方式,并不构成对该技术方案保护范围的限定。任何在上述实施方式的精神和原则之内所作的修改、等同替换和改进等,均应包含在该技术方案的保护范围之内。
Claims (30)
1.一种链接方法,其特征在于,包括:
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,
如果是长跳转,则:
在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,为各所述中转代码段分配空间,在各所述中间代码段中创建中转标号;
在所述输入目标文件的重定位段中创建中间代码段重定位信息;
确定所述输入目标文件的各段在输出目标文件中、被映射到的段的段映射信息,将所述段映射信息写入输入目标文件;
确定所述输入目标文件的各所述段的在输出目标文件中的加载地址信息,将所述加载地址信息信息写入所述输入目标文件;
在调用调整信息所述中间代码段写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件,
所述调用调整信息具体是:将所述长跳转的调用函数跳转至所述中转标号,将所述中转标号跳转至所述长跳转的被调用函数;
部分链接所述长跳转修正后的输入目标文件,生成输出目标文件。
2.根据权利要求1所述的链接方法,其特征在于,
在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,包括:
在各所述长跳转的调用函数所在的所述输入目标文件的尾部为各所述长跳转分别创建各中转代码段;
确定所述输入目标文件的各段在输出目标文件中被映射到的段的段映射信息,将所述段映射信息写入输入目标文件,包括:
分别确定所述输入目标文件的各代码段,在输出目标文件中被映射到的段的段映射信息,使任一所述中转代码段分别位于所述中间代码段对应的所述输入目标文件的代码段的尾部;
将所述段映射信息写入输入目标文件。
3.根据权利要求1所述的链接方法,其特征在于,
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,包括:
根据所述输入目标文件中的预定义长跳转标记信息,确定所述输入目标文件的函数跳转是否为长跳转。
4.根据权利要求1所述的链接方法,其特征在于,
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,包括:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件与被调用函数所在的被调用输入目标文件的文件偏移长度,
如果所述文件偏移长度大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
5.根据权利要求1所述的链接方法,其特征在于,
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,包括:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
6.根据权利要求1所述的链接方法,其特征在于,
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,包括:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的被调用函数所在的被调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
7.根据权利要求1所述的链接方法,其特征在于,
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,包括:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件的长度、被调用函数所在的被调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
8.一种链接方法,其特征在于,包括:
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,
如果是长跳转,则在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,为各所述中转代码段分配空间,在各所述中间代码段中创建中转标号;
确定所述输入目标文件的各段在输出目标文件被映射到的段的段映射信 息,将所述段映射信息写入输入目标文件;
在发生所述长跳转的输入目标文件中写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件,
所述调用调整信息具体是:将所述长跳转的调用函数跳转至所述中转标号,将所述中转标号跳转至所述长跳转的被调用函数;链接所述长跳转修正后的输入目标文件,生成可执行文件。
9.根据权利要求8所述的链接方法,其特征在于,
在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,包括:
在各所述长跳转的调用函数所在的所述输入目标文件的尾部为各所述长跳转分别创建各中转代码段;
确定所述输入目标文件的各段在输出目标文件中被映射到的段的段映射信息,将所述段映射信息写入输入目标文件,包括:
分别确定所述输入目标文件的各代码段,在输出目标文件中被映射到的段的段映射信息,使任一所述中转代码段分别位于所述中间代码段对应的所述输入目标文件的代码段的尾部;
将所述段映射信息写入输入目标文件。
10.根据权利要求8所述的链接方法,其特征在于,
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,包括:
根据所述输入目标文件中的预定义长跳转标记信息,确定所述输入目标文件的函数跳转是否为长跳转。
11.根据权利要求8所述的链接方法,其特征在于,
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件 的函数跳转是否为长跳转,包括:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件与被调用函数所在的被调用输入目标文件的文件偏移长度,
如果所述文件偏移长度大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
12.根据权利要求8所述的链接方法,其特征在于,
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,包括:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
13.根据权利要求8所述的链接方法,其特征在于,
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,包括:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的被调用函数所在的被调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
14.根据权利要求8所述的链接方法,其特征在于,
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件 的函数跳转是否为长跳转,包括:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件的长度、被调用函数所在的被调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
15.一种链接器,其特征在于,包括:
长跳转判定单元,用于根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转;
中转代码段创建单元,当任一所述输入目标文件的函数跳转为长跳转时,用于在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,为各所述中转代码段分配空间,在各所述中间代码段中创建中转标号;
中转代码段重定位信息创建单元,当任一所述输入目标文件的函数跳转为长跳转时,用于在所述输入目标文件的重定位段中创建中间代码段重定位信息;
段映射单元,确定所述输入目标文件的各段在输出目标文件中的被映射到的段的段映射信息,将所述段映射信息写入输入目标文件;
重定位单元,用于确定所述输入目标文件的各所述段的在输出目标文件中的加载地址信息,将所述加载地址信息写入所述输入目标文件;
调用调整信息写入单元,用于在所述中间代码段写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件,
所述调用调整信息具体是:当任一所述输入目标文件的函数跳转为长跳转时,将所述长跳转的调用函数跳转至所述中转标号,将所述中转标号跳转至所述长跳转的被调用函数;
部分链接单元,部分链接所述长跳转修正后的输入目标文件,生成输出目标文件。
16.根据权利要求15所述的链接器,其特征在于,
所述中转代码段创建单元具体用于:在各所述长跳转的调用函数所在的所述输入目标文件的尾部为各所述长跳转分别创建各中转代码段;
所述段映射单元具体用于:分别确定所述输入目标文件的各代码段,在输出目标文件中被映射到的段的段映射信息,使任一所述中转代码段分别位于所述中间代码段对应的所述输入目标文件的代码段的尾部,将所述段映射信息写入输入目标文件。
17.根据权利要求15所述的链接器,其特征在于,
所述长跳转判定单元,具体用于:根据所述输入目标文件中的预定义长跳转标记信息,确定所述输入目标文件的函数跳转是否为长跳转。
18.根据权利要求15所述的链接器,其特征在于,
所述长跳转判定单元,具体用于:遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件与被调用函数所在的被调用输入目标文件的文件偏移长度,
如果所述文件偏移长度大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
19.根据权利要求15所述的链接器,其特征在于,
所述长跳转判定单元,具体用于:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
20.根据权利要求15所述的链接器,其特征在于,
所述长跳转判定单元,具体用于:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的被调用函数所在的被调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
当任一所述输入目标文件的函数跳转为长跳转时,用于在所述输入目标文件的重定位段中创建中间代码段重定位信息。
21.根据权利要求15所述的链接器,其特征在于,
所述长跳转判定单元,具体用于:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件的长度、被调用函数所在的被调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
22.一种链接器,所述链接器被定义为完全链接器,所述链接器包括:
长跳转判定单元,用于根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,
中转代码段创建单元,当任一所述输入目标文件的函数跳转为长跳转时,用于在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,为各所述中转代码段分配空间,在各所述中间代码段中创建中转标号;
中转代码段重定位信息创建单元,当任一所述输入目标文件的函数跳转为长跳转时,用于确定所述输入目标文件的各段在输出目标文件被映射到的段的段映射信息,将所述段映射信息写入输入目标文件;
段映射单元,用于确定所述输入目标文件的各段在输出目标文件被映射到的段的段映射信息,将所述段映射信息写入输入目标文件;
调用调整信息写入单元,当任一所述输入目标文件的函数跳转为长跳转时,用于在发生所述长跳转的输入目标文件中写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件,
所述调用调整信息具体是:将所述长跳转的调用函数跳转至所述中转标号,将所述中转标号跳转至所述长跳转的被调用函数;
完全链接单元,用于完全链接所述长跳转修正后的输入目标文件,生成可执行文件。
23.根据权利要求22所述的链接器,其特征在于,
所述中转代码段创建单元具体用于:在各所述长跳转的调用函数所在的所述输入目标文件的尾部为各所述长跳转分别创建各中转代码段;
所述段映射单元具体用于:分别确定所述输入目标文件的各代码段,在输出目标文件中被映射到的段的段映射信息,使任一所述中转代码段分别位于所述中间代码段对应的所述输入目标文件的代码段的尾部,将所述段映射信息写入输入目标文件。
24.根据权利要求22所述的链接器,其特征在于,
所述长跳转判定单元,具体用于:根据所述输入目标文件中的预定义长跳转标记信息,确定所述输入目标文件的函数跳转是否为长跳转。
25.根据权利要求22所述的链接器,其特征在于,
所述长跳转判定单元,具体用于:遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件与被调用函数 所在的被调用输入目标文件的文件偏移长度,
如果所述文件偏移长度大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
26.根据权利要求22所述的链接器,其特征在于,
所述长跳转判定单元,具体用于:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
27.根据权利要求22所述的链接器,其特征在于,
所述长跳转判定单元,具体用于:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的被调用函数所在的被调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
当任一所述输入目标文件的函数跳转为长跳转时,用于在所述输入目标文件的重定位段中创建中间代码段重定位信息。
28.根据权利要求22所述的链接器,其特征在于,
所述长跳转判定单元,具体用于:
遍历所述输入目标文件序列的文件链表,确定各所述函数跳转的调用函数所在的调用输入目标文件的长度、被调用函数所在的被调用输入目标文件的长度、与所述调用输入目标文件到被调用函数所在的被调用输入目标文件 的文件偏移长度之和是否大于预定函数跳转长度上限,
如果大于预定函数跳转长度上限,则确定所述函数跳转为所述长跳转。
29.一种计算机系统,其特征在于,包括:
总线;
与所述总线相连的处理器;
与所述总线相连的存储器;
其中,所述处理器通过所述总线,调用所述存储器中存储的代码,以用于:
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,
如果是长跳转,则:
在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,为各所述中转代码段分配空间,在各所述中间代码段中创建中转标号;
在所述输入目标文件的重定位段中创建中间代码段重定位信息;
确定所述输入目标文件的各段在输出目标文件中、被映射到的段的段映射信息,将所述段映射信息写入输入目标文件;
确定所述输入目标文件的各所述段的在输出目标文件中的加载地址信息,将所述加载地址信息写入所述输入目标文件;
在所述中间代码段写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件,
所述调用调整信息具体是:将所述长跳转的调用函数跳转至所述中转标号,将所述中转标号跳转至所述长跳转的被调用函数;
部分链接所述长跳转修正后的输入目标文件,生成输出目标文件。
30.一种计算机系统,其特征在于,包括:
总线;
与所述总线相连的处理器;
与所述总线相连的存储器;
其中,所述处理器通过所述总线,调用所述存储器中存储的代码,以用于:
根据输入目标文件序列中的各输入目标文件,确定各所述输入目标文件的函数跳转是否为长跳转,
如果是长跳转,则在各所述长跳转的调用函数所在的所述输入目标文件中为各所述长跳转分别创建各中转代码段,为各所述中转代码段分配空间,在各所述中间代码段中创建中转标号;
确定所述输入目标文件的各段在输出目标文件被映射到的段的段映射信息,将所述段映射信息写入输入目标文件;
在发生所述长跳转的输入目标文件中写入调用调整信息对应的汇编代码,得到长跳转修正后的输入目标文件,
所述调用调整信息具体是:将所述长跳转的调用函数跳转至所述中转标号,将所述中转标号跳转至所述长跳转的被调用函数;链接所述长跳转修正后的输入目标文件,生成可执行文件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2013103230890A CN103399774A (zh) | 2013-07-29 | 2013-07-29 | 链接方法及链接器及计算机系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2013103230890A CN103399774A (zh) | 2013-07-29 | 2013-07-29 | 链接方法及链接器及计算机系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN103399774A true CN103399774A (zh) | 2013-11-20 |
Family
ID=49563408
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2013103230890A Pending CN103399774A (zh) | 2013-07-29 | 2013-07-29 | 链接方法及链接器及计算机系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103399774A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103984531B (zh) * | 2014-05-30 | 2016-09-28 | 龙芯中科技术有限公司 | 超长分支跳转处理方法及装置 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5787447A (en) * | 1995-05-08 | 1998-07-28 | Sun Microsystems, Inc. | Memory allocation maintaining ordering across multiple heaps |
CN101004681A (zh) * | 2006-12-22 | 2007-07-25 | 中兴通讯股份有限公司 | 嵌入式系统动态补丁长跳转的实现方法 |
CN101266549A (zh) * | 2008-03-19 | 2008-09-17 | 华为技术有限公司 | 插入代码的方法、装置及存储介质 |
CN101697131A (zh) * | 2009-11-04 | 2010-04-21 | 中兴通讯股份有限公司 | 一种可重定位文件动态加载的方法及装置 |
CN102156661A (zh) * | 2010-02-11 | 2011-08-17 | 华为技术有限公司 | 在线补丁的激活方法、装置及系统 |
CN103218262A (zh) * | 2010-02-11 | 2013-07-24 | 华为技术有限公司 | 在线补丁的激活方法、装置及系统 |
-
2013
- 2013-07-29 CN CN2013103230890A patent/CN103399774A/zh active Pending
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5787447A (en) * | 1995-05-08 | 1998-07-28 | Sun Microsystems, Inc. | Memory allocation maintaining ordering across multiple heaps |
CN101004681A (zh) * | 2006-12-22 | 2007-07-25 | 中兴通讯股份有限公司 | 嵌入式系统动态补丁长跳转的实现方法 |
CN101266549A (zh) * | 2008-03-19 | 2008-09-17 | 华为技术有限公司 | 插入代码的方法、装置及存储介质 |
CN101697131A (zh) * | 2009-11-04 | 2010-04-21 | 中兴通讯股份有限公司 | 一种可重定位文件动态加载的方法及装置 |
CN102156661A (zh) * | 2010-02-11 | 2011-08-17 | 华为技术有限公司 | 在线补丁的激活方法、装置及系统 |
CN103218262A (zh) * | 2010-02-11 | 2013-07-24 | 华为技术有限公司 | 在线补丁的激活方法、装置及系统 |
Non-Patent Citations (1)
Title |
---|
莱文: "《链接器和加载器》", 30 September 2009, 北京航空航天大学出版社, article "链接器和加载器", pages: 3-7 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103984531B (zh) * | 2014-05-30 | 2016-09-28 | 龙芯中科技术有限公司 | 超长分支跳转处理方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10705935B2 (en) | Generating job alert | |
CN111198868B (zh) | 一种智能分库实时数据迁移方法和装置 | |
CN105095287A (zh) | Lsm数据合并排序方法和装置 | |
EP2637095A1 (en) | Thin client system, management server, workplace environment setting method and workplace environment setting program | |
CN105531668B (zh) | 用于执行进程的迁移的方法、迁移器及计算机可读介质 | |
US20150331712A1 (en) | Concurrently processing parts of cells of a data structure with multiple processes | |
CN102385524A (zh) | 一种基于混编指令集的编译链指令替换方法 | |
US9483274B1 (en) | Method of splitting register live ranges | |
CN105094691A (zh) | 一种数据操作的方法、设备和系统 | |
CN104205780A (zh) | 一种存储数据的方法和装置 | |
GB2530052A (en) | Outputting map-reduce jobs to an archive file | |
CN103473185A (zh) | 缓存写入的方法、缓存装置和存储系统 | |
CN103810099A (zh) | 代码跟踪方法及其系统 | |
CN114647416A (zh) | 基于注解的业务流实现方法及装置、存储介质、电子设备 | |
CN102880473A (zh) | 基于quartz框架的任务执行方法及装置 | |
CN102331920A (zh) | 一种数据处理方法及装置 | |
CN103399774A (zh) | 链接方法及链接器及计算机系统 | |
CN115202589B (zh) | 放置组成员选择方法、装置、设备及可读存储介质 | |
CN110018866B (zh) | 用户界面主题更新方法、装置、系统、车机及车辆 | |
CN105574031A (zh) | 用于数据库索引的方法和系统 | |
US11068246B2 (en) | Control flow graph analysis | |
CN110765069A (zh) | 一种数据迁移方法、装置及系统 | |
CN109582318A (zh) | Portobuf本地化的处理方法、装置、终端及存储介质 | |
CN111880803B (zh) | 一种应用于多平台的软件构建方法及装置 | |
CN107817972A (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 | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20131120 |