diff options
Diffstat (limited to 'lib/mlibc/options/rtdl/x86_64')
-rw-r--r-- | lib/mlibc/options/rtdl/x86_64/elf.hpp | 37 | ||||
-rw-r--r-- | lib/mlibc/options/rtdl/x86_64/entry.S | 11 | ||||
-rw-r--r-- | lib/mlibc/options/rtdl/x86_64/runtime.S | 36 |
3 files changed, 84 insertions, 0 deletions
diff --git a/lib/mlibc/options/rtdl/x86_64/elf.hpp b/lib/mlibc/options/rtdl/x86_64/elf.hpp new file mode 100644 index 0000000..2a80644 --- /dev/null +++ b/lib/mlibc/options/rtdl/x86_64/elf.hpp @@ -0,0 +1,37 @@ +#pragma once + +#include <elf.h> + +#define ELF_CLASS ELFCLASS64 +#define ELF_MACHINE EM_X86_64 + +using elf_ehdr = Elf64_Ehdr; +using elf_phdr = Elf64_Phdr; +using elf_dyn = Elf64_Dyn; +using elf_rel = Elf64_Rel; +using elf_rela = Elf64_Rela; +using elf_relr = Elf64_Relr; +using elf_sym = Elf64_Sym; +using elf_addr = Elf64_Addr; + +using elf_info = Elf64_Xword; +using elf_addend = Elf64_Sxword; + +#define ELF_R_SYM ELF64_R_SYM +#define ELF_R_TYPE ELF64_R_TYPE +#define ELF_ST_BIND ELF64_ST_BIND + +#define R_NONE R_X86_64_NONE +#define R_JUMP_SLOT R_X86_64_JUMP_SLOT +#define R_ABSOLUTE R_X86_64_64 +#define R_GLOB_DAT R_X86_64_GLOB_DAT +#define R_RELATIVE R_X86_64_RELATIVE +#define R_IRELATIVE R_X86_64_IRELATIVE +// #define R_OFFSET +#define R_COPY R_X86_64_COPY +#define R_TLS_DTPMOD R_X86_64_DTPMOD64 +#define R_TLS_DTPREL R_X86_64_DTPOFF64 +#define R_TLS_TPREL R_X86_64_TPOFF64 +#define R_TLSDESC R_X86_64_TLSDESC + +#define TP_TCB_OFFSET 0 diff --git a/lib/mlibc/options/rtdl/x86_64/entry.S b/lib/mlibc/options/rtdl/x86_64/entry.S new file mode 100644 index 0000000..ea64111 --- /dev/null +++ b/lib/mlibc/options/rtdl/x86_64/entry.S @@ -0,0 +1,11 @@ + +.global _start +_start: + call relocateSelf + + mov %rsp, %rdi + call interpreterMain + + jmp *%rax +.section .note.GNU-stack,"",%progbits + diff --git a/lib/mlibc/options/rtdl/x86_64/runtime.S b/lib/mlibc/options/rtdl/x86_64/runtime.S new file mode 100644 index 0000000..d8593c4 --- /dev/null +++ b/lib/mlibc/options/rtdl/x86_64/runtime.S @@ -0,0 +1,36 @@ + +.global pltRelocateStub +pltRelocateStub: + # we need to save / restore all registers than can hold function arguments + # we do not need to save callee-saved registers as they will not be trashed by lazyRelocate + # TODO: save floating point argument registers + + push %rsi + push %rdi + mov 16(%rsp), %rdi + mov 24(%rsp), %rsi + + push %rax + push %rcx + push %rdx + push %r8 + push %r9 + push %r10 + + call lazyRelocate + mov %rax, %r11 + + pop %r10 + pop %r9 + pop %r8 + pop %rdx + pop %rcx + pop %rax + + pop %rdi + pop %rsi + add $16, %rsp + jmp *%r11 + +.section .note.GNU-stack,"",%progbits + |