diff --git a/arch/x64/elf-dl.s b/arch/x64/elf-dl.s
new file mode 100644
index 0000000000000000000000000000000000000000..acb5228d7ef6a6af23081b594c515534798b86bd
--- /dev/null
+++ b/arch/x64/elf-dl.s
@@ -0,0 +1,52 @@
+
+.include "arch/x64/cfi.s"
+
+.text
+
+.global __elf_resolve_pltgot
+
+// calling convension:
+// %rsp + 8: index
+// %rsp + 0:  object
+__elf_resolve_pltgot:
+	.cfi_startproc simple
+	.cfi_def_cfa %rsp, 0
+	.cfi_rel_offset %rip, 16
+	sub $8, %rsp  # make room for resolved address
+	.cfi_adjust_cfa_offset 8
+	pushq_cfi %rax
+	pushq_cfi %rbx
+	pushq_cfi %rcx
+	pushq_cfi %rdx
+	pushq_cfi %rsi
+	pushq_cfi %rdi
+	pushq_cfi %rbp
+	pushq_cfi %r8
+	pushq_cfi %r9
+	pushq_cfi %r10
+	pushq_cfi %r11
+	pushq_cfi %r12
+	pushq_cfi %r13
+	pushq_cfi %r14
+	pushq_cfi %r15
+	mov 16*8+8(%rsp), %edi
+	mov 16*8+0(%rsp), %rsi
+	call elf_resolve_pltgot
+	mov %rax, 15*8(%rsp)
+	popq_cfi %r15
+	popq_cfi %r14
+	popq_cfi %r13
+	popq_cfi %r12
+	popq_cfi %r11
+	popq_cfi %r10
+	popq_cfi %r9
+	popq_cfi %r8
+	popq_cfi %rbp
+	popq_cfi %rdi
+	popq_cfi %rsi
+	popq_cfi %rdx
+	popq_cfi %rcx
+	popq_cfi %rbx
+	popq_cfi %rax
+	ret $16
+	.cfi_endproc