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