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)