8sa1-gcc/gcc/config/rs6000/eabi.asm

58 lines
1.4 KiB
NASM
Raw Normal View History

# 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)
lwz 30,4(1) # restore regs
addic 1,1,8 # pop stack
blr