【问题标题】:ELF program header offsetELF 程序头偏移
【发布时间】:2011-02-24 11:33:43
【问题描述】:

我像这样手动编写一个可执行的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,它也可以工作。这让我想起了我在 ELF 格式规范中读到的关于 p_off 和 p_vaddr 值必须一致的内容(也就是说,我认为当将每个与页面大小取模时,它们必须给出相同的结果)。所以这就是程序使用这些值的原因。所以现在的问题是:如果上述逻辑有错误请考虑改正。

【问题讨论】:

  • 从我编写的精灵加载器代码中,p_type 为 1 的 p_offset 是文件中的绝对偏移量,用于查找可加载数据本身,二进制数据/其他。

标签: assembly elf


【解决方案1】:

ELF 规范要求对于按需分页可执行文件,段的文件偏移量和虚拟地址必须在低位中确实匹​​配。

这些限制与mmap() 系统调用对映射的限制相同——它只接受文件中偏移量为页面大小倍数的映射。映射 ELF 文件时,段被扩展到最近的页面边界,因此除了段大小计算之外,低位有效地被忽略了。

这样做的一个可能原因是,底层设备可能已经进行了内存映射(例如帧缓冲区或闪存),在这种情况下,创建偏移量为页面未对齐。

【讨论】:

    猜你喜欢
    • 2014-03-21
    • 1970-01-01
    • 2021-07-08
    • 2014-06-16
    • 1970-01-01
    • 2020-11-28
    • 2013-04-06
    • 2019-12-30
    • 2013-02-11
    相关资源
    最近更新 更多