ELF程序头偏移量

5

我手动编写了一个可执行的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

我在创建的文件中将e_entry字段指向了p_align字段之后,然后把我的代码放在了这个位置。但是它不起作用!我对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,则也可以正常工作。这让我想起了我在ELF格式规范中读到的关于p_off和p_vaddr值必须一致的内容(即我认为它们在模每个页面大小时必须给出相同的结果)。所以这就是为什么这些值可以使程序正常工作。因此,现在的问题是:如果上述逻辑有误,请考虑进行更正。

从我编写的 ELF 加载器代码中,当 p_type 为 1 时,p_offset 是在文件中查找可加载数据本身、二进制数据/任何其他内容的绝对偏移量。 - old_timer
1个回答

4
ELF规范要求对于需要按需分页的可执行文件,段的文件偏移量和虚拟地址确实必须匹配其低位的位数。
这些限制与系统调用放置在映射上的限制相同——它仅接受在文件中偏移量为页面大小倍数的映射。当映射ELF文件时,段被扩展到最近的页面边界,因此除了段大小计算外,低阶位被有效地忽略。
可能的原因之一是底层设备可能已经是内存映射的,例如帧缓冲或闪存,在这种情况下,使用未对齐的页偏移量创建映射将造成重大开销。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接