Previous: OpenRISC-Regs, Up: OpenRISC-Syntax [Contents][Index]
ELF relocations are available as defined in the OpenRISC architecture specification.
R_OR1K_HI_16_IN_INSN is obtained using ‘hi’ and
R_OR1K_LO_16_IN_INSN and R_OR1K_SLO16 are obtained using
‘lo’. For signed offsets R_OR1K_AHI16 is obtained from
‘ha’. For example:
l.movhi r5, hi(symbol) l.ori r5, r5, lo(symbol) l.movhi r5, ha(symbol) l.addi r5, r5, lo(symbol)
These “high” mnemonics extract bits 31:16 of their operand, and the “low” mnemonics extract bits 15:0 of their operand.
The PC relative relocation R_OR1K_GOTPC_HI16 can be obtained by
enclosing an operand inside of ‘gotpchi’. Likewise, the
R_OR1K_GOTPC_LO16 relocation can be obtained using ‘gotpclo’.
These are mostly used when assembling PIC code. For example, the
standard PIC sequence on OpenRISC to get the base of the global offset
table, PC relative, into a register, can be performed as:
l.jal 0x8 l.movhi r17, gotpchi(_GLOBAL_OFFSET_TABLE_-4) l.ori r17, r17, gotpclo(_GLOBAL_OFFSET_TABLE_+0) l.add r17, r17, r9
Several relocations exist to allow the link editor to perform GOT data
references. The R_OR1K_GOT16 relocation can obtained by enclosing an
operand inside of ‘got’. For example, assuming the GOT base is in
register r17.
l.lwz r19, got(a)(r17) l.lwz r21, 0(r19)
Also, several relocations exist for local GOT references. The
R_OR1K_GOTOFF_AHI16 relocation can obtained by enclosing an operand
inside of ‘gotoffha’. Likewise, R_OR1K_GOTOFF_LO16 and
R_OR1K_GOTOFF_SLO16 can be obtained by enclosing an operand inside of
‘gotofflo’. For example, assuming the GOT base is in register
rl7:
l.movhi r19, gotoffha(symbol) l.add r19, r19, r17 l.lwz r19, gotofflo(symbol)(r19)
The above PC relative relocations use a l.jal (jump) instruction
and reading of the link register to load the PC. OpenRISC also supports
page offset PC relative locations without a jump instruction using the
l.adrp instruction. By default the l.adrp instruction will
create an R_OR1K_PCREL_PG21 relocation.
Likewise, BFD_RELOC_OR1K_LO13 and BFD_RELOC_OR1K_SLO13 can
be obtained by enclosing an operand inside of ‘po’. For example:
l.adrp r3, symbol l.ori r4, r3, po(symbol) l.lbz r5, po(symbol)(r3) l.sb po(symbol)(r3), r6
Likewise the page offset relocations can be used with GOT references. The
relocation R_OR1K_GOT_PG21 can be obtained by enclosing an
l.adrp immediate operand inside of ‘got’. Likewise,
R_OR1K_GOT_LO13 can be obtained by enclosing an operand inside of
‘gotpo’. For example to load the value of a GOT symbol into register
‘r5’ we can do:
l.adrp r17, got(_GLOBAL_OFFSET_TABLE_) l.lwz r5, gotpo(symbol)(r17)
There are many relocations that can be requested for access to thread local storage variables. All of the OpenRISC TLS mnemonics are supported:
R_OR1K_TLS_GD_HI16 is requested using ‘tlsgdhi’.
R_OR1K_TLS_GD_LO16 is requested using ‘tlsgdlo’.
R_OR1K_TLS_GD_PG21 is requested using ‘tldgd’.
R_OR1K_TLS_GD_LO13 is requested using ‘tlsgdpo’.
R_OR1K_TLS_LDM_HI16 is requested using ‘tlsldmhi’.
R_OR1K_TLS_LDM_LO16 is requested using ‘tlsldmlo’.
R_OR1K_TLS_LDM_PG21 is requested using ‘tldldm’.
R_OR1K_TLS_LDM_LO13 is requested using ‘tlsldmpo’.
R_OR1K_TLS_LDO_HI16 is requested using ‘dtpoffhi’.
R_OR1K_TLS_LDO_LO16 is requested using ‘dtpofflo’.
R_OR1K_TLS_IE_HI16 is requested using ‘gottpoffhi’.
R_OR1K_TLS_IE_AHI16 is requested using ‘gottpoffha’.
R_OR1K_TLS_IE_LO16 is requested using ‘gottpofflo’.
R_OR1K_TLS_IE_PG21 is requested using ‘gottp’.
R_OR1K_TLS_IE_LO13 is requested using ‘gottppo’.
R_OR1K_TLS_LE_HI16 is requested using ‘tpoffhi’.
R_OR1K_TLS_LE_AHI16 is requested using ‘tpoffha’.
R_OR1K_TLS_LE_LO16 is requested using ‘tpofflo’.
R_OR1K_TLS_LE_SLO16 also is requested using ‘tpofflo’
depending on the instruction format.
Here are some example TLS model sequences.
First, General Dynamic:
l.movhi r17, tlsgdhi(symbol) l.ori r17, r17, tlsgdlo(symbol) l.add r17, r17, r16 l.or r3, r17, r17 l.jal plt(__tls_get_addr) l.nop
Initial Exec:
l.movhi r17, gottpoffhi(symbol) l.add r17, r17, r16 l.lwz r17, gottpofflo(symbol)(r17) l.add r17, r17, r10 l.lbs r17, 0(r17)
And finally, Local Exec:
l.movhi r17, tpoffha(symbol) l.add r17, r17, r10 l.addi r17, r17, tpofflo(symbol) l.lbs r17, 0(r17)
Previous: OpenRISC-Regs, Up: OpenRISC-Syntax [Contents][Index]