1995-02-23 15:30:26 -05:00
|
|
|
# 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
|
|
|
|
|
|
|
|
.long 0x4000 # traceback table
|
|
|
|
__eabi: mflr 0
|
|
|
|
bl .Laddr # get current address
|
|
|
|
|
|
|
|
# Table of addresses
|
|
|
|
.Ltable:
|
|
|
|
.long .Ltable # address we are really at
|
|
|
|
.long _GLOBAL_OFFSET_TABLE_ # normal GOT address
|
|
|
|
.long _GOT2_START_ # -mrelocatable GOT pointers start
|
|
|
|
.long _GOT2_END_ # -mrelocatable GOT pointers end
|
|
|
|
|
|
|
|
.Laddr: mflr 11 # real address of .Ltable
|
|
|
|
lwz 12,0(11) # linker generated address of .Ltable
|
|
|
|
subf. 12,12,11 # calculate difference
|
|
|
|
bc 4,2,.Lreloc # skip if we need to relocate
|
|
|
|
|
|
|
|
# Normal program, load up register 2
|
|
|
|
|
|
|
|
mtlr 0 # restore link register
|
|
|
|
lwz 2,4(11) # normal GOT address
|
|
|
|
blr
|
|
|
|
|
|
|
|
# We need to relocate the .got2 pointers. Don't load register 2
|
|
|
|
|
|
|
|
.Lreloc:
|
|
|
|
stwu 30,-4(1)
|
|
|
|
stwu 31,-4(1)
|
|
|
|
lwz 30,8(11) # GOT pointers start
|
|
|
|
lwz 31,12(11) # GOT pointers end
|
|
|
|
add 30,12,30 # adjust pointers
|
|
|
|
add 31,12,31
|
|
|
|
|
|
|
|
cmpw 1,30,31 # any pointers to adjust
|
|
|
|
bc 12,6,.Ldone
|
|
|
|
|
|
|
|
.Lloop: lwz 11,0(30) # next pointer
|
|
|
|
add 11,11,12 # adjust
|
|
|
|
stw 11,0(30)
|
|
|
|
addi 30,30,4 # bump to next word
|
|
|
|
cmpw 1,30,31 # more pointers to adjust?
|
|
|
|
bc 4,6,.Lloop
|
|
|
|
|
|
|
|
# Done adjusting pointers, return
|
|
|
|
|
|
|
|
.Ldone:
|
|
|
|
mtlr 0 # restore link register
|
|
|
|
lwz 31,0(1)
|
1995-02-28 16:39:57 -05:00
|
|
|
lwz 30,4(1) # restore regs
|
1995-02-23 15:30:26 -05:00
|
|
|
addic 1,1,8 # pop stack
|
|
|
|
blr
|