; vim: set ft=nasm et: %include "linkscr.inc" [section .header] %include "elf.inc" ;%ifndef PT_INTERP_VAL ;%define PT_INTERP_VAL "/lib64/ld-linux-x86-64.so.2" ;%endif global _EHDR _EHDR: ehdr: ; e_ident db 0x7F, "ELF" db EI_CLASS, EI_DATA, EI_VERSION, 0;EI_OSABI db 0;EI_OSABIVERSION times 7 db 0 dw ELF_TYPE ; e_type dw ELF_MACHINE ; e_machine dd EI_VERSION ; e_version dq _smol_start ; e_entry dq phdr - ehdr ; e_phoff dq 0 ; e_shoff dd 0 ; e_flags dw ehdr.end - ehdr ; e_ehsize dw phdr.load - phdr.dynamic ; e_phentsize %ifdef USE_NX %ifdef USE_INTERP dw 4 ; e_phnum %else dw 3 ; e_phnum %endif dw 0, 0, 0 ; e_shentsize, e_shnum, e_shstrndx ehdr.end: %endif global _PHDR _PHDR: phdr: %ifdef USE_INTERP phdr.interp: dd PT_INTERP ; p_type ; e_phnum, e_shentsize dd 0 ; p_flags ; e_shnum, e_shstrndx %ifndef USE_NX ehdr.end: %endif dq interp - ehdr ; p_offset dq interp, interp ; p_vaddr, p_paddr dq interp.end - interp ; p_filesz dq interp.end - interp ; p_memsz dq 0 ; p_align %endif phdr.dynamic: dd PT_DYNAMIC ; p_type ; e_phnum, e_shentsize dd 0 ; p_flags ; e_shnum, e_shstrndx %ifndef USE_INTERP ehdr.end: dq dynamic - ehdr ; p_offset dq dynamic, 0 ; p_vaddr, p_paddr dq dynamic.end - dynamic ; p_filesz dq dynamic.end - dynamic ; p_memsz dq 0 ; p_align %else dq dynamic - ehdr ; p_offset dq dynamic;, 0 ; p_vaddr, p_paddr %ifndef PT_INTERP_VAL global _INTERP _INTERP: interp: db "/lib64/ld-linux-x86-64.so.2",0 interp.end: dd 0 %else dq 0 dq dynamic.end - dynamic ; p_filesz dq dynamic.end - dynamic ; p_memsz dq 0 ; p_align %endif %endif %ifndef USE_NX phdr.load: dd PT_LOAD ; p_type dd PHDR_R | PHDR_W | PHDR_X ; p_flags dq 0 ; p_offset dq ehdr, 0 ; p_vaddr, p_paddr dq _smol_total_filesize ; p_filesz dq _smol_total_memsize ; p_memsz dq 0x1000 ; p_align %else %ifdef ORDER_DT ; data and then text phdr.load: dd PT_LOAD dd PHDR_R | PHDR_W dq 0 dq ehdr, 0 dq _smol_dataandheader_size dq _smol_dataandheaderandbss_size dq 0x1000 ; let's hope this works phdr.load2: dd PT_LOAD dd PHDR_R | PHDR_X dq 0;_smol_data_off dq _smol_text_vma_org,0 ;_smol_data_start, 0 dq _smol_total_filesize;_smol_data_size dq _smol_total_filesize;_smol_dataandbss_size dq 0x1000 %else ; text and then data phdr.load: dd PT_LOAD dd PHDR_R | PHDR_X dq 0 dq ehdr, 0 dq _smol_textandheader_size dq _smol_textandheader_size dq 0x1000 ; let's hope this works phdr.load2: dd PT_LOAD dd PHDR_R | PHDR_W dq 0;_smol_data_off dq _smol_data_vma_org,0 ;_smol_data_start, 0 dq _smol_total_filesize;_smol_data_size dq _smol_total_filesize;_smol_dataandbss_size dq 0x1000 %endif %endif phdr.end: %ifdef PT_INTERP_VAL [section .interp] global _INTERP _INTERP: interp: db PT_INTERP_VAL,0 interp.end: %endif ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [section .rela.plt] global _rela_plt _rela_plt: %ifndef USE_NX dq ehdr %else ; need sth. for this %error "TODO" %endif dq ELF_R_INFO(0,R_JUMP_SLOT) ;dq 0 ; addend [section .dynsym] global _dynsym _dynsym: ;; entry 0 dd _symbols.libc._dl_sym - _dynstr db 0 ; info ; rest is ignored ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [section .bss.got.plt.start nobits] ; yep, GOT in .bss global _GLOBAL_OFFSET_TABLE_ _GLOBAL_OFFSET_TABLE_: _gotplt: .dynamic: resq 1 .linkmap: resq 1 .dlfixup: resq 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; [section .dynamic] global _DYNAMIC _DYNAMIC: dynamic: dynamic.strtab: dq DT_STRTAB dq _dynstr dynamic.symtab: dq DT_SYMTAB dq _dynsym dynamic.pltgot: dq DT_PLTGOT dq _gotplt dynamic.jmprel: dq DT_JMPREL dq _rela_plt ; what follows, are DT_NEEDED tags, DT_NULL, and the .dynstr section, ; all generated by the python script. then, the startup code follows