BITS 32
        org     0x00000000
        db      0x7F, "ELF"     ; e_ident
        db      1,1,1,9
        dd      0,0
        dw      2               ; e_type
        dw      3               ; e_machine
        dd      1               ; e_version
        dd      _start          ; e_entry
        dd      phdr - $$       ; e_phoff
        dd      0               ; e_shoff
        dd      0               ; e_flags
        dw      52              ; e_ehsize
        dw      32              ; e_phentsize
        dw      3               ; e_phnum
        dw      40              ; e_shentsize
        dw      0               ; e_shnum
        dw      0               ; e_shstrndx
phdr:   dd      1               ; p_type
        dd      0               ; p_offset
        dd      $$              ; p_vaddr
        dd      0               ; p_paddr
        dd      filesize        ; p_filesz
        dd      filesize        ; p_memsz
        dd      7               ; p_flags
        dd      0               ; p_align
phdr_interp:
        dd      3               ; p_type
        dd      interp          ; p_offset
        dd      interp          ; p_vaddr
        dd      interp          ; p_paddr
        dd      interp_end - interp     ; p_filesz
        dd      interp_end - interp     ; p_memsz
        dd      4               ; p_flags
        dd      1               ; p_align
phdr_dynamic:
        dd      2               ; p_type
        dd      dynamic         ; p_offset
        dd      dynamic         ; p_vaddr
        dd      dynamic         ; p_paddr
        dd      dynamic_end - dynamic   ; p_filesz
        dd      dynamic_end - dynamic   ; p_memsz
        dd      6               ; p_flags
        dd      4               ; p_align
hello:  db      "Hello, world!", 0
_start:
        push    hello
call_puts:
        call    call_puts
        pop     EAX
        push    byte 0
call_exit:
        call    call_exit

dynamic:
        dd      1               ; DT_NEEDED
        dd      str_libc - strtab
        dd      4               ; DT_HASH
        dd      hash
        dd      5               ; DT_STRTAB
        dd      strtab
        dd      10              ; DT_STRSZ
        dd      strtab_end - strtab
        dd      11              ; DT_SYMENT
        dd      16
        dd      6               ; DT_SYMTAB
        dd      symtab
        dd      17              ; DT_REL
        dd      dt_rel
        dd      18              ; DT_RELSZ
        dd      16
        dd      19              ; DT_RELENT
        dd      8
        dd      0
        dd      0
dynamic_end:
hash:
        dd      1               ; number of buckets
        dd      1               ; number of chains
        dd      0
        dd      0
dt_rel:
        dd      call_puts + 1
        dd      0x000 + 0x02        ; R_386_PC32
        dd      call_exit + 1
        dd      0x100 + 0x02        ; R_386_PC32
symtab:
        dd      str_puts - strtab
        dd      0
        dd      4
        db      0x10 + 0x02
        db      0
        dw      0

        dd      str_exit - strtab
        dd      0
        dd      4
        db      0x10 + 0x02
        db      0
        dw      0
strtab:
        db      0
str_libc:
        db      "libc.so.6", 0
str_puts:
        db      "puts", 0
str_exit:
        db      "exit", 0
strtab_end:
interp:
        db      "/lib/ld-linux.so.2", 0
interp_end:

filesize equ    $ - $$
