mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-03 09:49:23 +02:00
GP-5211: Fix RISCV 32- and 64-bit compiler specifications and relocation handler
This commit is contained in:
parent
5acdc3b522
commit
f26d36c6bb
5 changed files with 458 additions and 230 deletions
|
@ -17,7 +17,7 @@
|
|||
<entry size="1" alignment="1" />
|
||||
<entry size="2" alignment="2" />
|
||||
<entry size="4" alignment="4" />
|
||||
<entry size="8" alignment="4" />
|
||||
<entry size="8" alignment="8" />
|
||||
</size_alignment_map>
|
||||
</data_organization>
|
||||
<global>
|
||||
|
@ -30,73 +30,110 @@
|
|||
</returnaddress>
|
||||
<stackpointer register="sp" space="ram"/>
|
||||
<default_proto>
|
||||
<prototype name="__stdcall" extrapop="0" stackshift="0" strategy="register">
|
||||
<prototype name="__stdcall" extrapop="0" stackshift="0">
|
||||
<input>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="a0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="a1"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="a2"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="a3"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="a4"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="a5"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="a6"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="a7"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="4">
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa0"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa1"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa2"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa3"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa4"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa5"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa6"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa7"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="500" align="4">
|
||||
<addr offset="16" space="ram"/>
|
||||
</pentry>
|
||||
</input>
|
||||
<output>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a1"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a2"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a3"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a4"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a5"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a6"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a7"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="500" align="4">
|
||||
<addr offset="0" space="stack"/>
|
||||
</pentry>
|
||||
<rule>
|
||||
<datatype name="any"/>
|
||||
<varargs first="0"/>
|
||||
<join align="true"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="homogeneous-float-aggregate" maxprimitives="2"/>
|
||||
<join_per_primitive storage="float"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="float"/>
|
||||
<consume storage="float"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="struct" minsize="9"/>
|
||||
<convert_to_ptr/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="union" minsize="9"/>
|
||||
<convert_to_ptr/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="any"/>
|
||||
<join/>
|
||||
</rule>
|
||||
</input>
|
||||
<output>
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa0"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa1"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a1"/>
|
||||
</pentry>
|
||||
<rule>
|
||||
<datatype name="float"/>
|
||||
<consume storage="float"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="homogeneous-float-aggregate" maxprimitives="2"/>
|
||||
<join_per_primitive storage="float"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="any"/>
|
||||
<join/>
|
||||
</rule>
|
||||
</output>
|
||||
<unaffected>
|
||||
<register name="sp"/>
|
||||
|
@ -127,6 +164,44 @@
|
|||
<register name="fs10"/>
|
||||
<register name="fs11"/>
|
||||
</unaffected>
|
||||
<killedbycall>
|
||||
<register name="ra"/>
|
||||
<register name="t0"/>
|
||||
<register name="t1"/>
|
||||
<register name="t2"/>
|
||||
<register name="t3"/>
|
||||
<register name="t4"/>
|
||||
<register name="t5"/>
|
||||
<register name="t6"/>
|
||||
<register name="a0"/>
|
||||
<register name="a1"/>
|
||||
<register name="a2"/>
|
||||
<register name="a3"/>
|
||||
<register name="a4"/>
|
||||
<register name="a5"/>
|
||||
<register name="a6"/>
|
||||
<register name="a7"/>
|
||||
<register name="fa0"/>
|
||||
<register name="fa1"/>
|
||||
<register name="fa2"/>
|
||||
<register name="fa3"/>
|
||||
<register name="fa4"/>
|
||||
<register name="fa5"/>
|
||||
<register name="fa6"/>
|
||||
<register name="fa7"/>
|
||||
<register name="ft0"/>
|
||||
<register name="ft1"/>
|
||||
<register name="ft2"/>
|
||||
<register name="ft3"/>
|
||||
<register name="ft4"/>
|
||||
<register name="ft5"/>
|
||||
<register name="ft6"/>
|
||||
<register name="ft7"/>
|
||||
<register name="ft8"/>
|
||||
<register name="ft9"/>
|
||||
<register name="ft10"/>
|
||||
<register name="ft11"/>
|
||||
</killedbycall>
|
||||
</prototype>
|
||||
</default_proto>
|
||||
</compiler_spec>
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
<entry size="1" alignment="1" />
|
||||
<entry size="2" alignment="2" />
|
||||
<entry size="4" alignment="4" />
|
||||
<entry size="8" alignment="4" />
|
||||
<entry size="8" alignment="8" />
|
||||
</size_alignment_map>
|
||||
</data_organization>
|
||||
<global>
|
||||
|
@ -28,43 +28,64 @@
|
|||
</returnaddress>
|
||||
<stackpointer register="sp" space="ram"/>
|
||||
<default_proto>
|
||||
<prototype name="__stdcall" extrapop="0" stackshift="0" strategy="register">
|
||||
<prototype name="__stdcall" extrapop="0" stackshift="0">
|
||||
<input>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a1"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a2"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a3"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a4"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a5"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a6"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a7"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="500" align="4">
|
||||
<addr offset="16" space="ram"/>
|
||||
<addr offset="0" space="stack"/>
|
||||
</pentry>
|
||||
<rule>
|
||||
<datatype name="any"/>
|
||||
<varargs first="0"/>
|
||||
<join align="true"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="struct" minsize="9"/>
|
||||
<convert_to_ptr/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="union" minsize="9"/>
|
||||
<convert_to_ptr/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="any"/>
|
||||
<join/>
|
||||
</rule>
|
||||
</input>
|
||||
<output>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a1"/>
|
||||
</pentry>
|
||||
<rule>
|
||||
<datatype name="any"/>
|
||||
<join/>
|
||||
</rule>
|
||||
</output>
|
||||
<unaffected>
|
||||
<register name="sp"/>
|
||||
|
@ -83,6 +104,24 @@
|
|||
<register name="s10"/>
|
||||
<register name="s11"/>
|
||||
</unaffected>
|
||||
<killedbycall>
|
||||
<register name="ra"/>
|
||||
<register name="t0"/>
|
||||
<register name="t1"/>
|
||||
<register name="t2"/>
|
||||
<register name="t3"/>
|
||||
<register name="t4"/>
|
||||
<register name="t5"/>
|
||||
<register name="t6"/>
|
||||
<register name="a0"/>
|
||||
<register name="a1"/>
|
||||
<register name="a2"/>
|
||||
<register name="a3"/>
|
||||
<register name="a4"/>
|
||||
<register name="a5"/>
|
||||
<register name="a6"/>
|
||||
<register name="a7"/>
|
||||
</killedbycall>
|
||||
</prototype>
|
||||
</default_proto>
|
||||
</compiler_spec>
|
||||
|
|
|
@ -30,73 +30,110 @@
|
|||
</returnaddress>
|
||||
<stackpointer register="sp" space="ram"/>
|
||||
<default_proto>
|
||||
<prototype name="__stdcall" extrapop="0" stackshift="0" strategy="register">
|
||||
<prototype name="__stdcall" extrapop="0" stackshift="0">
|
||||
<input>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a1"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a2"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a3"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a4"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a5"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a6"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a7"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa0"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa1"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa2"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa3"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa4"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa5"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa6"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa7"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="500" align="4">
|
||||
<addr offset="16" space="ram"/>
|
||||
</pentry>
|
||||
</input>
|
||||
<output>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<pentry minsize="1" maxsize="8" extension="zero">
|
||||
<register name="a0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<pentry minsize="1" maxsize="8" extension="zero">
|
||||
<register name="a1"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="1" maxsize="8" extension="zero">
|
||||
<register name="a2"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8" extension="zero">
|
||||
<register name="a3"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8" extension="zero">
|
||||
<register name="a4"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8" extension="zero">
|
||||
<register name="a5"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8" extension="zero">
|
||||
<register name="a6"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8" extension="zero">
|
||||
<register name="a7"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="500" align="8">
|
||||
<addr offset="0" space="stack"/>
|
||||
</pentry>
|
||||
<rule>
|
||||
<datatype name="any"/>
|
||||
<varargs first="0"/>
|
||||
<join align="true"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="homogeneous-float-aggregate" maxprimitives="2"/>
|
||||
<join_per_primitive storage="float"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="float"/>
|
||||
<consume storage="float"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="struct" minsize="17"/>
|
||||
<convert_to_ptr/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="union" minsize="17"/>
|
||||
<convert_to_ptr/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="any"/>
|
||||
<join/>
|
||||
</rule>
|
||||
</input>
|
||||
<output>
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa0"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa1"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8" extension="zero">
|
||||
<register name="a0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8" extension="zero">
|
||||
<register name="a1"/>
|
||||
</pentry>
|
||||
<rule>
|
||||
<datatype name="float"/>
|
||||
<consume storage="float"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="homogeneous-float-aggregate" maxprimitives="2"/>
|
||||
<join_per_primitive storage="float"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="any"/>
|
||||
<join/>
|
||||
</rule>
|
||||
</output>
|
||||
<unaffected>
|
||||
<register name="sp"/>
|
||||
|
@ -127,6 +164,44 @@
|
|||
<register name="fs10"/>
|
||||
<register name="fs11"/>
|
||||
</unaffected>
|
||||
<killedbycall>
|
||||
<register name="ra"/>
|
||||
<register name="t0"/>
|
||||
<register name="t1"/>
|
||||
<register name="t2"/>
|
||||
<register name="t3"/>
|
||||
<register name="t4"/>
|
||||
<register name="t5"/>
|
||||
<register name="t6"/>
|
||||
<register name="a0"/>
|
||||
<register name="a1"/>
|
||||
<register name="a2"/>
|
||||
<register name="a3"/>
|
||||
<register name="a4"/>
|
||||
<register name="a5"/>
|
||||
<register name="a6"/>
|
||||
<register name="a7"/>
|
||||
<register name="fa0"/>
|
||||
<register name="fa1"/>
|
||||
<register name="fa2"/>
|
||||
<register name="fa3"/>
|
||||
<register name="fa4"/>
|
||||
<register name="fa5"/>
|
||||
<register name="fa6"/>
|
||||
<register name="fa7"/>
|
||||
<register name="ft0"/>
|
||||
<register name="ft1"/>
|
||||
<register name="ft2"/>
|
||||
<register name="ft3"/>
|
||||
<register name="ft4"/>
|
||||
<register name="ft5"/>
|
||||
<register name="ft6"/>
|
||||
<register name="ft7"/>
|
||||
<register name="ft8"/>
|
||||
<register name="ft9"/>
|
||||
<register name="ft10"/>
|
||||
<register name="ft11"/>
|
||||
</killedbycall>
|
||||
</prototype>
|
||||
</default_proto>
|
||||
</compiler_spec>
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
</returnaddress>
|
||||
<stackpointer register="sp" space="ram"/>
|
||||
<default_proto>
|
||||
<prototype name="__stdcall" extrapop="0" stackshift="0" strategy="register">
|
||||
<prototype name="__stdcall" extrapop="0" stackshift="0">
|
||||
<input>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a0"/>
|
||||
|
@ -54,9 +54,26 @@
|
|||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a7"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="500" align="4">
|
||||
<addr offset="16" space="ram"/>
|
||||
<pentry minsize="1" maxsize="500" align="8">
|
||||
<addr offset="0" space="stack"/>
|
||||
</pentry>
|
||||
<rule>
|
||||
<datatype name="any"/>
|
||||
<varargs first="0"/>
|
||||
<join align="true"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="struct" minsize="17"/>
|
||||
<convert_to_ptr/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="union" minsize="17"/>
|
||||
<convert_to_ptr/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="any"/>
|
||||
<join/>
|
||||
</rule>
|
||||
</input>
|
||||
<output>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
|
@ -65,6 +82,10 @@
|
|||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a1"/>
|
||||
</pentry>
|
||||
<rule>
|
||||
<datatype name="any"/>
|
||||
<join/>
|
||||
</rule>
|
||||
</output>
|
||||
<unaffected>
|
||||
<register name="sp"/>
|
||||
|
@ -83,6 +104,24 @@
|
|||
<register name="s10"/>
|
||||
<register name="s11"/>
|
||||
</unaffected>
|
||||
<killedbycall>
|
||||
<register name="ra"/>
|
||||
<register name="t0"/>
|
||||
<register name="t1"/>
|
||||
<register name="t2"/>
|
||||
<register name="t3"/>
|
||||
<register name="t4"/>
|
||||
<register name="t5"/>
|
||||
<register name="t6"/>
|
||||
<register name="a0"/>
|
||||
<register name="a1"/>
|
||||
<register name="a2"/>
|
||||
<register name="a3"/>
|
||||
<register name="a4"/>
|
||||
<register name="a5"/>
|
||||
<register name="a6"/>
|
||||
<register name="a7"/>
|
||||
</killedbycall>
|
||||
</prototype>
|
||||
</default_proto>
|
||||
</compiler_spec>
|
||||
|
|
|
@ -322,21 +322,21 @@ public class RISCV_ElfRelocationHandler
|
|||
|
||||
case R_RISCV_HI20:
|
||||
// Absolute address %hi(symbol) (U-Type)
|
||||
value32 = (int) ((symbolValue + 0x800) & 0xfffff000) |
|
||||
value32 = (int) ((addend + symbolValue + 0x800) & 0xfffff000) |
|
||||
(memory.getInt(relocationAddress) & 0xfff);
|
||||
memory.setInt(relocationAddress, value32);
|
||||
break;
|
||||
|
||||
case R_RISCV_LO12_I:
|
||||
// Absolute address %lo(symbol) (I-Type)
|
||||
value32 = ((int) (symbolValue & 0x00000fff) << 20) |
|
||||
value32 = ((int) ((addend + symbolValue) & 0x00000fff) << 20) |
|
||||
(memory.getInt(relocationAddress) & 0xfffff);
|
||||
memory.setInt(relocationAddress, value32);
|
||||
break;
|
||||
|
||||
case R_RISCV_LO12_S:
|
||||
// Absolute address %lo(symbol) (S-Type)
|
||||
value32 = (int) (symbolValue & 0x00000fff);
|
||||
value32 = (int) ((addend + symbolValue) & 0x00000fff);
|
||||
value32 = ((value32 & 0x1f) << 7) | ((value32 & 0xfe0) << 20) |
|
||||
(memory.getInt(relocationAddress) & 0x1fff07f);
|
||||
memory.setInt(relocationAddress, value32);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue