summaryrefslogtreecommitdiff
path: root/service/arch/x86_64/rtld_link.S
blob: 9f86030b620686c8dbdb29abca891bee06fbddce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
.section .text

.extern kc_dynamic_link

// TODO: investigate whether saving r9, r8, rcx and rdx is actually necessary here

.hidden _rtld_link
.global _rtld_link
.type _rtld_link, @function
_rtld_link:
    push %rbp
    mov %rsp, %rbp
    push %r9
    push %r8
    push %rcx
    push %rdx
    push %rsi
    push %rdi
    mov 8(%rbp), %rdi
    mov 16(%rbp), %rsi
    push %rbp
    mov %rsp, %rbp
    and $-0x10, %rsp
    call kc_dynamic_link
    mov %rbp, %rsp
    pop %rbp
    pop %rdi
    pop %rsi
    pop %rdx
    pop %rcx
    pop %r8
    pop %r9
    mov %rbp, %rsp
    pop %rbp
    add $0x10, %rsp
    jmp *(%rax)
.size _rtld_link, . - _rtld_link