aboutsummaryrefslogtreecommitdiff
path: root/libdynld
diff options
context:
space:
mode:
authorbhgv <bhgv.empire@gmail.com>2020-05-12 12:50:49 +0300
committerbhgv <bhgv.empire@gmail.com>2020-05-12 12:50:49 +0300
commit9b5d5f8a4640dbecdc87e5b6e7e95f71018632cf (patch)
treed3135c3861ef93ed2523642d3c5f64c7819b7def /libdynld
parent73c13e732072c17f3e584e11a51d1f7dc8d88e32 (diff)
parent31b4edc67b75658ce5e2d41f2fc87331f4b26d49 (diff)
Merge branch 'master' of https://github.com/bhgv/Inferno-OS-bhgv
Diffstat (limited to 'libdynld')
-rw-r--r--libdynld/dynld-riscv64.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/libdynld/dynld-riscv64.c b/libdynld/dynld-riscv64.c
new file mode 100644
index 0000000..040111d
--- /dev/null
+++ b/libdynld/dynld-riscv64.c
@@ -0,0 +1,42 @@
+#include "lib9.h"
+#include <a.out.h>
+#include <dynld.h>
+
+#define CHK(i,ntab) if((unsigned)(i)>=(ntab))return "bad relocation index"
+
+long
+dynmagic(void)
+{
+ return DYN_MAGIC | I_MAGIC;
+}
+
+char*
+dynreloc(uchar *b, ulong p, int m, Dynsym **tab, int ntab)
+{
+ int i;
+ ulong v, *pp;
+
+ p += (ulong)b;
+ pp = (ulong*)p;
+ v = *pp;
+ switch(m){
+ case 0:
+ v += (ulong)b;
+ break;
+ case 1:
+ i = v>>22;
+ v &= 0x3fffff;
+ CHK(i, ntab);
+ v += tab[i]->addr;
+ break;
+ case 2:
+ i = v>>22;
+ CHK(i, ntab);
+ v = tab[i]->addr -p-4;
+ break;
+ default:
+ return "bad relocation mode";
+ }
+ *pp = v;
+ return nil;
+}