2011-02-24 44 views
4

我手動編寫的可執行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格式說明(這是我認爲它們必須在以頁面大小爲每一個模時得到相同的結果)。所以這就是程序使用這些值的原因。所以現在的問題是:如果上述邏輯出現錯誤,請考慮更正。

+0

從我寫的elf loader代碼中,p_type爲1的p_offset是文件中的絕對偏移量,用於查找可加載數據本身,二進制數據/不管。 – 2011-02-24 15:01:29

回答

2

ELF規範要求,對於需求分頁的可執行文件,段的文件偏移量和虛擬地址必須確實匹配較低位。

這些限制與mmap()系統調用在映射上的位置相同 - 它只接受文件中偏移量爲頁面大小倍數的映射。在映射ELF文件時,這些段將擴展到最接近的頁面邊界,因此除了段大小計算之外,低位位將被有效忽略。

其中一個可能的原因是,底層設備可能已經存儲器映射 - 如幀緩衝區或閃存 - 在這種情況下,它會施加大量開銷以創建具有偏移量的映射不是頁面對齊的。