about summary refs log tree commit diff
path: root/src/ldso/or1k
diff options
context:
space:
mode:
Diffstat (limited to 'src/ldso/or1k')
-rw-r--r--src/ldso/or1k/dlsym.s5
-rw-r--r--src/ldso/or1k/start.s34
2 files changed, 39 insertions, 0 deletions
diff --git a/src/ldso/or1k/dlsym.s b/src/ldso/or1k/dlsym.s
new file mode 100644
index 00000000..b2f4dfe3
--- /dev/null
+++ b/src/ldso/or1k/dlsym.s
@@ -0,0 +1,5 @@
+.global dlsym
+.type   dlsym,@function
+dlsym:
+	l.j	plt(__dlsym)
+	 l.ori	r5, r9, 0
diff --git a/src/ldso/or1k/start.s b/src/ldso/or1k/start.s
new file mode 100644
index 00000000..83b7c2c6
--- /dev/null
+++ b/src/ldso/or1k/start.s
@@ -0,0 +1,34 @@
+.global _dlstart
+_dlstart:
+	l.jal	1f
+	 l.nop
+1:	l.movhi	r5, gotpchi(_GLOBAL_OFFSET_TABLE_+0)
+	l.ori	r5, r5, gotpclo(_GLOBAL_OFFSET_TABLE_+4)
+	l.add	r5, r5, r9
+	l.movhi	r3, gotoffhi(_DYNAMIC)
+	l.ori	r3, r3, gotofflo(_DYNAMIC)
+	l.add	r5, r5, r3
+
+	l.lwz	r3, 0(r1)
+	l.addi	r4, r1, 4
+	l.jal	plt(__reloc_self)
+	 l.addi	r1, r1, -16
+
+	l.lwz	r3, 16(r1)
+	l.jal	plt(__dynlink)
+	 l.addi	r4, r1, 20
+	l.addi	r1, r1, 16
+
+	l.lwz	r4, 0(r1)
+1:	l.addi	r4, r4, -1
+	l.lwz	r5, 4(r1)
+	l.sfeqi	r5, -1
+	l.bf	1b
+	 l.addi	r1, r1, 4
+
+	l.addi	r4, r4, 1
+	l.addi	r1, r1, -4
+	l.sw	0(r1), r4
+
+	l.jr	r11
+	 l.ori	r3, r0, 0