我手動編寫的可執行ELF頭+節目標題是這樣的:ELF程序頭偏移
elf_head:
e_ident db 7Fh, 'ELF', 1, 1, 1
times 9 db 0
e_type dw 2 ; ET_EXEC
e_mach dw 3 ; EM_386
e_ver dd 1 ; EV_CURRENT
e_entry dd 0x08048000+elf_head_len ; entry point
e_phoff dd 34h ; program header table offset
e_shoff dd 00h ; section header table offset
e_flags dd 0 ; flags
e_elfhs dw 34h ; ELF header size
e_phes dw 20h ; program header entry size
e_phec dw 01h ; program header entries count
e_shes dw 00h
e_shec dw 00h
e_shsn dw 00h
elf_ph:
p_type dd 01h ; PT_LOAD
p_off dd elf_head_len
p_vaddr dd 0x08048000+elf_head_len
p_paddr dd 0x08048000+elf_head_len
p_filsz dd elf_head_len+file_len
p_memsz dd elf_head_len+file_len
p_flags dd 7 ; segment flags (RWX)
p_align dd 0x1000 ; page_size==4096bytes
elf_head_len equ $ - elf_head
我成立了p_align場在這裏我把我的代碼的文件在創建後的e_entry場點的權利。但它不起作用!我有點困惑與p_offset領域。我把這個文件的起始位置(0x00)的偏移量直到段代碼的第一個字節。由於段的代碼在p_align字段後面開始,因此我是否正確輸入了值elf_head_len?當我嘗試運行新創建的可執行文件時,bash響應:分段錯誤!
好吧,我知道,我有一個錯誤的程序,給出了分段錯誤。 (對於那個很抱歉)。但問題仍然是關於p_off字段,我還發現如果我設置p_off dd 0和p_vaddr dd 0x08048000和p_paddr dd 0x08048000可執行文件。它也適用,如果我輸入p_off dd elf_head_len和p_vaddr dd 0x08048000 + elf_head_len和p_paddr dd 0x08048000 + elf_head_len。這讓我想起了一些關於p_off和p_vaddr值必須一致的ELF格式說明(這是我認爲它們必須在以頁面大小爲每一個模時得到相同的結果)。所以這就是程序使用這些值的原因。所以現在的問題是:如果上述邏輯出現錯誤,請考慮更正。
從我寫的elf loader代碼中,p_type爲1的p_offset是文件中的絕對偏移量,用於查找可加載數據本身,二進制數據/不管。 – 2011-02-24 15:01:29