- BITS 32
- org 0x08048000 ; conventional Linux i32 load address
- ehdr: ; ELF file header
- db 0x7F, "ELF", 1, 1, 1 ; e_ident
- times 9 db 0
- dw 2 ; e_type 2=executable, 3=shared lib
- dw 3 ; e_machine 3=i32/386
- dd 1 ; e_version 1=current
- dd _start ; e_entry absolute entry point
- dd phdr - $$ ; e_phoff file offset to PHT, 0=none
- dd 0 ; e_shoff file offset to SHT, 0=none
- dd 0 ; e_flags 0 for i386
- dw ehdrsize ; e_ehsize ELF header size
- dw phdrsize ; e_phentsize PHT entry size
- dw 1 ; e_phnum #entries in PHT
- dw 0 ; e_shentsize SHT entry size
- dw 0 ; e_shnum #entries in SHT
- dw 0 ; e_shstrndx file offset to string table, 0=none
- ehdrsize equ $ - ehdr
- phdr: ; Program Header Table (PHT) with one entry
- dd 1 ; p_type 1=load into memory
- dd 0 ; p_offset file offset to start of segment
- dd $$ ; p_vaddr virt. address where loaded
- dd $$ ; p_paddr abs. address where loaded
- dd filesize ; p_filesz how much loaded from file
- dd filesize ; p_memsz segment size in meory
- dd 5 ; p_flags permissions, R-X
- dd 0x1000 ; p_align alignment required
- phdrsize equ $ - phdr
- _start: ; entry point
- mov bl, 42 ; return code in bottom 8 bits of EAX
- mov eax, 1 ; exit function call number
- int 0x80 ; Linux i32 system call
- filesize equ $ - $$
- Assemble it, make it executable and run it, displaying the return
- code.
- $ nasm -f bin -o tiny.elf tiny.asm
- $ chmod +x tiny.elf
- $ ./tiny.elf ; echo $?
- 42
Raw Paste