Skip to content

Instantly share code, notes, and snippets.

@typeswitch-dev
Created September 3, 2022 00:24
Show Gist options
  • Save typeswitch-dev/8c0baef76ed6086ed2ce24193bc4d5b0 to your computer and use it in GitHub Desktop.
Save typeswitch-dev/8c0baef76ed6086ed2ce24193bc4d5b0 to your computer and use it in GitHub Desktop.

Revisions

  1. typeswitch-dev created this gist Sep 3, 2022.
    55 changes: 55 additions & 0 deletions minimal-elf64.asm
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,55 @@
    bits 64
    org 0x4000000

    elf_header:
    .size equ .end - $
    .e_ident db 0x7F, 'E', 'L', 'F' ; EI_MAG0 ... EI_MAG3
    db 2 ; EI_CLASS: 1 => 32 bits, 2 => 64 bits
    db 1 ; EI_DATA: 1 => lil endian, 2 => big "
    db 1 ; EI_VERSION: original version
    db 0 ; EI_OSABI: 0 => System V ABI
    db 0 ; EI_ABIVERSION
    times 7 db 0 ; EI_PAD: padding
    .e_type dw 0x0002 ; executable file
    .e_machine dw 0x003E ; target architecture
    .e_version dd 1 ; original version
    .e_entry dq start ; program entry point
    .e_phoff dq program_header.off ; program header offset
    .e_shoff dq section_header.off ; section header offset
    .e_flags dd 0x0 ; flags depending on target
    .e_ehsize dw elf_header.size ; size of elf_header
    .e_phentsiz dw program_header.esize ; size of a program header entry
    .e_phnum dw program_header.count ; number of program header entries
    .e_shentsiz dw section_header.esize ; size of a section header entry
    .e_shnum dw section_header.count ; number of section header entries
    .e_shstrndx dw 0 ; index of section names entry
    .end:

    program_header:
    .off equ $ - elf_header
    .esize equ .eend - $
    .count equ 1
    .p_type dd 0x1 ; PT_LOAD: loadable segment
    .p_flags dd 0x7 ; flags, RWX permission
    .p_offset dq 0 ; offset of segment
    .p_vaddr dq program.start ; virtual address of segment
    .p_paddr dq 0 ; physical address of segment
    .p_filesz dq program.size ; size in file
    .p_memsz dq program.size ; size in memory
    .p_align dq 0 ; align
    .eend:

    section_header: ; no section header required!
    .off equ 0
    .count equ 0
    .esize equ 0

    start: mov rax, 60 ; exit syscall
    mov rdi, 42 ; exit code
    syscall

    program:
    .start equ elf_header
    .end equ $
    .size equ .end - .start