BITS 64
org 0x400000
elf_ident:
db 0x7F, "ELF" ; EI_MAG = ELF magic
db 2 ; EI_CLASS = ELFCLASS64 (elf64)
db 1 ; EI_DATA = ELFDATA2LSB (little-endian)
db 1 ; EI_VERSION = EV_CURRENT
db 0 ; null terminator
db 0 ; ABI version
db 0 ; alignment padding
start:
inc eax
mov bl, 42
int 0x80
times 6 + start - $ db 0 ; padding
elf_hdr:
dw 2 ; Elf64_Half e_type = ET_EXEC
dw 0x3E ; Elf64_Half e_machine = AMD x64
dd 1 ; Elf64_Word e_version = 1
dq start ; Elf64_Addr e_entry = start offset
dq prog_hdr - $$ ; Elf64_Off e_phoff = prog_hdr offset
dq 0 ; Elf64_Off e_shoff = 0 (we don't have one)
dd 0 ; Elf64_Word e_flags = 0 (nothing special, i guess)
dw prog_hdr - elf_ident ; Elf64_Half e_ehsize = elf_hdr_size
dw end - prog_hdr ; Elf64_Half e_phentsize
dw 1 ; Elf64_Half e_phnum = 1 (we only need one)
dw 0x40 ; Elf64_Half e_shentsize = 64 (required)
dw 0 ; Elf64_Half e_shnum = 0 (we don't have any)
dw 0 ; Elf64_Half e_shstrndx = 0 (we still don't have any)
prog_hdr:
dd 1 ; Elf64_Word p_type = 1
dd 5 ; Elf64_Word p_flags = PF_R | PF_X
dq 0 ; Elf64_Off p_offset = 0
dq $$ ; Elf64_Addr p_vaddr = org
dq $$ ; Elf64_Addr p_paddr = org
dq end - $$ ; Elf64_Xword p_filesz = size of file
dq end - $$ ; Elf64_Xword p_memsz = size of file
dq 0x200000 ; Elf64_Xword p_align
end: ; nothing after this line