Skip to content

Instantly share code, notes, and snippets.

@typeswitch-dev
Created September 3, 2022 00:24
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • 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.
Minimal Linux x86-64 program written in NASM assembly
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment