Created
April 23, 2020 02:38
-
-
Save Theldus/06cd55f4a231972fc48eea117bda691c to your computer and use it in GitHub Desktop.
Dynamic library from scratch =)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; ------------------------------ | |
; nasm -f bin -o libs.so libs.S | |
; ------------------------------ | |
BITS 64 | |
org 0 | |
ADDR equ 0x200000 | |
; Elf header constants | |
ET_DIN equ 3 | |
; Program header constants | |
PT_LOAD equ 1 | |
PT_DYNAMIC equ 2 | |
; Section Header constants | |
SHT_PROGBITS equ 1 | |
SHT_STRTAB equ 3 | |
SHT_DYNAMIC equ 6 | |
SHT_DYNSYM equ 11 | |
; Dynamic Symbol table constants | |
DT_NULL equ 0 | |
DT_HASH equ 4 | |
DT_STRTAB equ 5 | |
DT_SYMTAB equ 6 | |
DT_STRSZ equ 10 | |
DT_SYMENT equ 11 | |
; Symbol bindings | |
STB_LOCAL equ 0 | |
STB_GLOBAL equ 1 | |
STB_WEAK equ 2 | |
; Symbol types | |
STT_FUNC equ 2 | |
STT_SECTION equ 3 | |
; ------------------- | |
; Elf Header | |
; ------------------- | |
ehdr: ; Elf32_Ehdr | |
db 0x7F, "ELF", 2, 1, 1, 0 ; e_ident | |
times 8 db 0 | |
dw ET_DIN ; e_type | |
dw 0x3e ; e_machine | |
dd 1 ; e_version | |
dq func ; e_entry | |
dq phdr - $$ ; e_phoff | |
dq shdr - $$ ; e_shoff | |
dd 0 ; e_flags | |
dw ehdrsize ; e_ehsize | |
dw phdr_entry_size ; e_phentsize | |
dw 3 ; e_phnum | |
dw shdr_entry_size ; e_shentsize | |
dw 6 ; e_shnum | |
dw 1 ; e_shstrndx | |
ehdrsize equ $ - ehdr | |
; -------------------- | |
; Program header LOAD | |
; -------------------- | |
phdr: ; Elf32_Phdr | |
dd PT_LOAD ; p_type | |
dd 5 ; p_flags | |
dq 0 ; p_offset | |
dq $$ ; p_vaddr | |
dq $$ ; p_paddr | |
dq filesize ; p_filesz | |
dq filesize ; p_memsz | |
dq 0x1000 ; p_align | |
phdr_entry_size equ $ - phdr | |
; ------------------------------- | |
; Program header LOAD | |
; mainly to make DYNAMIC works =) | |
; ------------------------------- | |
phdr_load_dyn: ; Elf32_Phdr | |
dd PT_LOAD ; p_type | |
dd 6 ; p_flags | |
dq dynamic_array - $$ ; p_offset | |
dq dynamic_array + ADDR ; p_vaddr | |
dq dynamic_array + ADDR ; p_paddr | |
dq dynamic_array_size ; p_filesz | |
dq dynamic_array_size ; p_memsz | |
dq 0x1000 ; p_align | |
; ----------------------- | |
; Program header DYNAMIC | |
; ----------------------- | |
phdr_dynamic: ; Elf32_Phdr | |
dd PT_DYNAMIC ; p_type | |
dd 6 ; p_flags | |
dq dynamic_array - $$ ; p_offset | |
dq dynamic_array + ADDR ; p_vaddr | |
dq dynamic_array + ADDR ; p_paddr | |
dq dynamic_array_size ; p_filesz | |
dq dynamic_array_size ; p_memsz | |
dq 0x1000 ; p_align | |
; ----------------- | |
; Section Headers | |
; ----------------- | |
shdr: | |
; Nulled section | |
dd 0 ; sh_name | |
dd 0 ; sh_type | |
dq 0 ; sf_flags | |
dq 0 ; sh_addr | |
dq 0 ; sh_offset | |
dq 0 ; sh_size | |
dd 0 ; sh_link | |
dd 0 ; sh_info | |
dq 0 ; sh_addralign | |
dq 0 ; sh_entsize | |
shdr_entry_size equ $ - shdr | |
shdrsize equ $ - shdr | |
; ---------------------------- | |
; Section Header String Table | |
; ---------------------------- | |
shdr_strtab: | |
dd 1 ; sh_name | |
dd SHT_STRTAB ; sh_type | |
dq 0 ; sf_flags | |
dq 0 ; sh_addr | |
dq shstr_table - $$ ; sh_offset | |
dq shstr_table_size ; sh_size | |
dd 0 ; sh_link | |
dd 0 ; sh_info | |
dq 0 ; sh_addralign | |
dq 0 ; sh_entsize | |
; ----------------------- | |
; Dynamic Symbol Table | |
; ----------------------- | |
shdr_dynsym: | |
dd dynsym_str - shstr_table ; sh_name | |
dd SHT_DYNSYM ; sh_type | |
dq 2 ; sf_flags | |
dq symb_tbl - $$ ; sh_addr | |
dq symb_tbl - $$ ; sh_offset | |
dq symb_tbl_size ; sh_size | |
dd 3 ; sh_link | |
dd 1 ; sh_info | |
dq 0 ; sh_addralign | |
dq symb_tbl_entry_size ; sh_entsize | |
; ---------------------------- | |
; Dynamic Symbol String Table | |
; ---------------------------- | |
shdr_dynsymstr: | |
dd dynstr_str - shstr_table ; sh_name | |
dd SHT_STRTAB ; sh_type | |
dq 2 ; sf_flags | |
dq 0 ; sh_addr | |
dq shstr_table - $$ ; sh_offset | |
dq shstr_table_size ; sh_size | |
dd 0 ; sh_link | |
dd 0 ; sh_info | |
dq 0 ; sh_addralign | |
dq 0 ; sh_entsize | |
; -------------------- | |
; Section Header Text | |
; -------------------- | |
shdr_text: | |
dd text_str - shstr_table ; sh_name | |
dd SHT_PROGBITS ; sh_type | |
dq 6 ; sf_flags | |
dq func ; sh_addr | |
dq func - $$ ; sh_offset | |
dq shdr_text_size ; sh_size | |
dd 0 ; sh_link | |
dd 1 ; sh_info | |
dq 0 ; sh_addralign | |
dq 0 ; sh_entsize | |
; -------------------------- | |
; Section Header Dynamic | |
; -------------------------- | |
shdr_dynamic: | |
dd dynamic_str - shstr_table ; sh_name | |
dd SHT_DYNAMIC ; sh_type | |
dq 3 ; sf_flags | |
dq dynamic_array + ADDR ; sh_addr | |
dq dynamic_array ; sh_offset | |
dq dynamic_array_size ; sh_size | |
dd 0 ; sh_link | |
dd 0 ; sh_info | |
dq 0 ; sh_addralign | |
dq 0 ; sh_entsize | |
; --------------------- | |
; SH String table | |
; --------------------- | |
shstr_table: | |
db 0 | |
shstrtab_str: db ".shstrtab", 0 | |
text_str: db ".text", 0 | |
dynsym_str: db ".dynsym", 0 | |
dynstr_str: db ".dynstr", 0 | |
dynamic_str: db ".dynamic", 0 | |
func_name_str: db "func", 0 | |
db 0 | |
shstr_table_size equ $ - shstr_table | |
; ------------------- | |
; Symbol Table | |
; ------------------- | |
symb_tbl: | |
; Null symbol, first entry shold be null | |
dd 0 ; st_name | |
db 0 ; st_info | |
db 0 ; st_other | |
dw 0 ; st_shndx | |
dq 0 ; st_value | |
dq 0 ; st_size | |
symb_tbl_entry_size equ $ - symb_tbl | |
; Function name | |
dd func_name_str - shstr_table ; st_name | |
db (STB_GLOBAL << 4)|STT_FUNC ; st_info | |
db 0 ; st_other | |
dw 4 ; st_shndx | |
dq func ; st_value | |
dq 0 ; st_size | |
symb_tbl_size equ $ - symb_tbl | |
; -------------- | |
; Dynamic Array | |
; -------------- | |
dynamic_array: | |
; DT_HASH | |
dq DT_HASH ; d_tag | |
dq symb_hash_table ; d_ptr | |
; DT_STRTAB | |
dq DT_STRTAB ; d_tag | |
dq shstr_table ; d_ptr | |
; DT_SYMTAB | |
dq DT_SYMTAB ; d_tag | |
dq symb_tbl ; d_ptr | |
; DT_STRSZ | |
dq DT_STRSZ ; d_tag | |
dq shstr_table_size ; d_val | |
; DT_SYMENT | |
dq DT_SYMENT ; d_tag | |
dq symb_tbl_entry_size ; d_val | |
; DT_NULL | |
dq DT_NULL ; d_tag | |
dq 0 ; d_un | |
dynamic_array_size equ $ - dynamic_array | |
; --------------------- | |
; Symbol Hash Table | |
; --------------------- | |
symb_hash_table: | |
dd 2 ; nbuckets | |
dd 2 ; nchain | |
; Bucket list | |
dd 0, 1 | |
; Chain list | |
dd 0, 0 | |
symb_hash_tbl_size equ $ - symb_hash_table | |
;=========================================== | |
; Code goes here xD | |
;=========================================== | |
func: | |
mov eax, 42 | |
ret | |
shdr_text_size equ $ - func | |
filesize equ $ - $$ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment