📄 eabi.asm
字号:
# File to either setup register 2 to point to the GOT, or to adjust the# pointers in the .got2 section to point to their new addresses. .file "eabi.asm" .section ".text" .globl __eabi .section ".got2","aw".LCTOC1 = . # +32768# Table of addresses.Ltable = .-.LCTOC1 .long .LCTOC1 # address we are really at.Lgot = .-.LCTOC1 .long _GLOBAL_OFFSET_TABLE_ # normal GOT address.Lgots = .-.LCTOC1 .long _GOT_START_ # start of .got section.Lgote = .-.LCTOC1 .long _GOT_END_ # end of .got section.Lgot2s = .-.LCTOC1 .long _GOT2_START_ # -mrelocatable GOT pointers start.Lgot2e = .-.LCTOC1 .long _GOT2_END_ # -mrelocatable GOT pointers end.Lfixups = .-.LCTOC1 .long _FIXUP_START_ # start of .fixup section.Lfixupe = .-.LCTOC1 .long _FIXUP_END_ # end of .fixup section .text.Lptr: .long .LCTOC1-.Laddr # PC relative pointer to .got2 .long 0x4000 # traceback table__eabi: mflr 0 bl .Laddr # get current address.Laddr: mflr 12 # real address of .Laddr lwz 11,(.Lptr-.Laddr)(12) # linker generated address of .LCTOC1 add 11,11,12 # correct to real pointer lwz 12,.Ltable(11) # get linker's idea of where .Laddr is subf. 12,12,11 # calculate difference mtlr 0 # restore link register bc 4,2,.Lreloc # skip if we need to relocate# Only load up register 2 if there is a .got section lwz 3,.Lgots(11) # start of .got section lwz 4,.Lgote(11) # end of .got section cmpw 1,3,4 # .got section non-empty? bc 12,6,.Ldone# Normal program, load up register 2 lwz 2,.Lgot(11) # normal GOT address (obsolete in register 2) mr 13,2 # also same as _SDA_BASE_ (V.4 small data ptr) b __do_global_ctors # do any C++ global constructors (which returns to caller)# We need to relocate the .got2 pointers. Don't load register 2.Lreloc: lwz 3,.Lgot2s(11) # GOT pointers start lwz 4,.Lgot2e(11) # GOT pointers end add 3,12,3 # adjust pointers add 4,12,4 cmpw 1,3,4 # any pointers to adjust bc 12,6,.Lfix.Lloop: lwz 5,0(3) # next pointer add 5,5,12 # adjust stw 5,0(3) addi 3,3,4 # bump to next word cmpw 1,3,4 # more pointers to adjust? bc 4,6,.Lloop# Fixup any user initialized pointers now (the compiler drops pointers to# each of the relocs that it does in the .fixup section). Note, the pointers# themselves have already been fixed up by the previous loop..Lfix: lwz 3,.Lfixups(11) # fixup pointers start lwz 4,.Lfixupe(11) # fixup pointers end cmpw 1,3,4 # any user pointers to adjust bc 12,6,.Ldone.Lfloop: lwz 5,0(3) # next pointer lwz 6,0(5) # get the pointer it points to add 6,6,12 # adjust stw 6,0(5) addi 3,3,4 # bump to next word cmpw 1,3,4 # more pointers to adjust? bc 4,6,.Lfloop# Done adjusting pointers, return.Ldone: b __do_global_ctors # do any C++ global constructors (which returns to caller)# Routines for saving floating point registers, called by the compiler.# Called with r11 pointing to the stack header word of the caller of the# function, just beyond the end of the floating point save area. .globl _savefpr_14 .globl _savefpr_15 .globl _savefpr_16 .globl _savefpr_17 .globl _savefpr_18 .globl _savefpr_19 .globl _savefpr_20 .globl _savefpr_21 .globl _savefpr_22 .globl _savefpr_23 .globl _savefpr_24 .globl _savefpr_25 .globl _savefpr_26 .globl _savefpr_27 .globl _savefpr_28 .globl _savefpr_29 .globl _savefpr_30 .globl _savefpr_31 .long 0x00400000 # traceback tag_savefpr_14: stfd 14,-144(11) # save fp registers_savefpr_15: stfd 15,-136(11)_savefpr_16: stfd 16,-128(11)_savefpr_17: stfd 17,-120(11)_savefpr_18: stfd 18,-112(11)_savefpr_19: stfd 19,-104(11)_savefpr_20: stfd 20,-96(11)_savefpr_21: stfd 21,-88(11)_savefpr_22: stfd 22,-80(11)_savefpr_23: stfd 23,-72(11)_savefpr_24: stfd 24,-64(11)_savefpr_25: stfd 25,-56(11)_savefpr_26: stfd 26,-48(11)_savefpr_27: stfd 27,-40(11)_savefpr_28: stfd 28,-32(11)_savefpr_29: stfd 29,-24(11)_savefpr_30: stfd 30,-16(11)_savefpr_31: stfd 31,-8(11) blr# Routines for saving integer registers, called by the compiler.# Called with r11 pointing to the stack header word of the caller of the# function, just beyond the end of the integer save area. .globl _savegpr_14 .globl _savegpr_15 .globl _savegpr_16 .globl _savegpr_17 .globl _savegpr_18 .globl _savegpr_19 .globl _savegpr_20 .globl _savegpr_21 .globl _savegpr_22 .globl _savegpr_23 .globl _savegpr_24 .globl _savegpr_25 .globl _savegpr_26 .globl _savegpr_27 .globl _savegpr_28 .globl _savegpr_29 .globl _savegpr_30 .globl _savegpr_31 .long 0x00400000 # traceback tag_savegpr_14: stw 14,-72(11) # save gp registers_savegpr_15: stw 15,-68(11)_savegpr_16: stw 16,-64(11)_savegpr_17: stw 17,-60(11)_savegpr_18: stw 18,-56(11)_savegpr_19: stw 19,-52(11)_savegpr_20: stw 20,-48(11)_savegpr_21: stw 21,-44(11)_savegpr_22: stw 22,-40(11)_savegpr_23: stw 23,-36(11)_savegpr_24: stw 24,-32(11)_savegpr_25: stw 25,-28(11)_savegpr_26: stw 26,-24(11)_savegpr_27: stw 27,-20(11)_savegpr_28: stw 28,-16(11)_savegpr_29: stw 29,-12(11)_savegpr_30: stw 30,-8(11)_savegpr_31: stw 31,-4(11) blr# Routines for restoring floating point registers, called by the compiler.# Called with r11 pointing to the stack header word of the caller of the# function, just beyond the end of the floating point save area. .globl _restfpr_14 .globl _restfpr_15 .globl _restfpr_16 .globl _restfpr_17 .globl _restfpr_18 .globl _restfpr_19 .globl _restfpr_20 .globl _restfpr_21 .globl _restfpr_22 .globl _restfpr_23 .globl _restfpr_24 .globl _restfpr_25 .globl _restfpr_26 .globl _restfpr_27 .globl _restfpr_28 .globl _restfpr_29 .globl _restfpr_30 .globl _restfpr_31 .long 0x00600000 # traceback tag_restfpr_14: lfd 14,-144(11) # restore fp registers_restfpr_15: lfd 15,-136(11)_restfpr_16: lfd 16,-128(11)_restfpr_17: lfd 17,-120(11)_restfpr_18: lfd 18,-112(11)_restfpr_19: lfd 19,-104(11)_restfpr_20: lfd 20,-96(11)_restfpr_21: lfd 21,-88(11)_restfpr_22: lfd 22,-80(11)_restfpr_23: lfd 23,-72(11)_restfpr_24: lfd 24,-64(11)_restfpr_25: lfd 25,-56(11)_restfpr_26: lfd 26,-48(11)_restfpr_27: lfd 27,-40(11)_restfpr_28: lfd 28,-32(11)_restfpr_29: lfd 29,-24(11)_restfpr_30: lfd 30,-16(11)_restfpr_31: lfd 31,-8(11) blr# Routines for restoring integer registers, called by the compiler.# Called with r11 pointing to the stack header word of the caller of the# function, just beyond the end of the integer restore area. .globl _restgpr_14 .globl _restgpr_15 .globl _restgpr_16 .globl _restgpr_17 .globl _restgpr_18 .globl _restgpr_19 .globl _restgpr_20 .globl _restgpr_21 .globl _restgpr_22 .globl _restgpr_23 .globl _restgpr_24 .globl _restgpr_25 .globl _restgpr_26 .globl _restgpr_27 .globl _restgpr_28 .globl _restgpr_29 .globl _restgpr_30 .globl _restgpr_31 .long 0x00600000 # traceback tag_restgpr_14: lwz 14,-72(11) # rest gp registers_restgpr_15: lwz 15,-68(11)_restgpr_16: lwz 16,-64(11)_restgpr_17: lwz 17,-60(11)_restgpr_18: lwz 18,-56(11)_restgpr_19: lwz 19,-52(11)_restgpr_20: lwz 20,-48(11)_restgpr_21: lwz 21,-44(11)_restgpr_22: lwz 22,-40(11)_restgpr_23: lwz 23,-36(11)_restgpr_24: lwz 24,-32(11)_restgpr_25: lwz 25,-28(11)_restgpr_26: lwz 26,-24(11)_restgpr_27: lwz 27,-20(11)_restgpr_28: lwz 28,-16(11)_restgpr_29: lwz 29,-12(11)_restgpr_30: lwz 30,-8(11)_restgpr_31: lwz 31,-4(11) blr# Routines for restoring floating point registers, called by the compiler.# Called with r11 pointing to the stack header word of the caller of the# function, just beyond the end of the floating point save area.# In addition to restoring the fp registers, it will return to the caller's# caller .globl _restfpr_14_x .globl _restfpr_15_x .globl _restfpr_16_x .globl _restfpr_17_x .globl _restfpr_18_x .globl _restfpr_19_x .globl _restfpr_20_x .globl _restfpr_21_x .globl _restfpr_22_x .globl _restfpr_23_x .globl _restfpr_24_x .globl _restfpr_25_x .globl _restfpr_26_x .globl _restfpr_27_x .globl _restfpr_28_x .globl _restfpr_29_x .globl _restfpr_30_x .globl _restfpr_31_x .long 0x00600000 # traceback tag_restfpr_14_x: lfd 14,-144(11) # restore fp registers_restfpr_15_x: lfd 15,-136(11)_restfpr_16_x: lfd 16,-128(11)_restfpr_17_x: lfd 17,-120(11)_restfpr_18_x: lfd 18,-112(11)_restfpr_19_x: lfd 19,-104(11)_restfpr_20_x: lfd 20,-96(11)_restfpr_21_x: lfd 21,-88(11)_restfpr_22_x: lfd 22,-80(11)_restfpr_23_x: lfd 23,-72(11)_restfpr_24_x: lfd 24,-64(11)_restfpr_25_x: lfd 25,-56(11)_restfpr_26_x: lfd 26,-48(11)_restfpr_27_x: lfd 27,-40(11)_restfpr_28_x: lfd 28,-32(11)_restfpr_29_x: lfd 29,-24(11)_restfpr_30_x: lfd 30,-16(11)_restfpr_31_x: lwz 0,4(11) lfd 31,-8(11) mtlr 0 mr 1,11 blr# Routines for restoring integer registers, called by the compiler.# Called with r11 pointing to the stack header word of the caller of the# function, just beyond the end of the integer restore area. .globl _restgpr_14_x .globl _restgpr_15_x .globl _restgpr_16_x .globl _restgpr_17_x .globl _restgpr_18_x .globl _restgpr_19_x .globl _restgpr_20_x .globl _restgpr_21_x .globl _restgpr_22_x .globl _restgpr_23_x .globl _restgpr_24_x .globl _restgpr_25_x .globl _restgpr_26_x .globl _restgpr_27_x .globl _restgpr_28_x .globl _restgpr_29_x .globl _restgpr_30_x .globl _restgpr_31_x .long 0x00600000 # traceback tag_restgpr_14_x: lwz 14,-72(11) # rest gp registers_restgpr_15_x: lwz 15,-68(11)_restgpr_16_x: lwz 16,-64(11)_restgpr_17_x: lwz 17,-60(11)_restgpr_18_x: lwz 18,-56(11)_restgpr_19_x: lwz 19,-52(11)_restgpr_20_x: lwz 20,-48(11)_restgpr_21_x: lwz 21,-44(11)_restgpr_22_x: lwz 22,-40(11)_restgpr_23_x: lwz 23,-36(11)_restgpr_24_x: lwz 24,-32(11)_restgpr_25_x: lwz 25,-28(11)_restgpr_26_x: lwz 26,-24(11)_restgpr_27_x: lwz 27,-20(11)_restgpr_28_x: lwz 28,-16(11)_restgpr_29_x: lwz 29,-12(11)_restgpr_30_x: lwz 30,-8(11)_restgpr_31_x: lwz 0,4(11) lwz 31,-4(11) mtlr 0 mr 1,11 blr
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -