我正在尝试构建一个类似 xv6 的系统,并且我正在复制下面的 xv6 代码:
if (ph.p_vaddr % PGSIZE) {
cprintf("exec: addr not page aligned.\n");
goto bad;
}
这是ELF被加载到内存的部分。
它检查每个 PT_LOAD 段的 vaddr 并确保在将其加载到内存之前其页面对齐。
但代码很混乱,因为当我使用readelf
检查要加载的 ELF 文件:
Elf file type is EXEC (Executable file)
Entry point 0x400260
There are 4 program headers, starting at offset 64
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x0021f0 0x0021f0 R E 0x1000
LOAD 0x002eb8 0x0000000000403eb8 0x0000000000403eb8 0x000268 0x0008e8 RW 0x1000
GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x10
GNU_RELRO 0x002eb8 0x0000000000403eb8 0x0000000000403eb8 0x000148 0x000148 R 0x1
Section to Segment mapping:
Segment Sections...
00 .init .text .fini .rodata .eh_frame
01 .init_array .fini_array .data.rel.ro .got .got.plt .data .bss
02
03 .init_array .fini_array .data.rel.ro .got .got.plt
vaddr并不总是页面对齐的,所以我想问一下是我的编译方式有问题还是代码本身有问题?
是我的编译方式有问题还是代码本身有问题?
代码错误。.p_vaddr - .p_offset
必须页面对齐;.p_vaddr
单独不一定是。
这是因为该段需要mmap
ed, and mmap
需要页面对齐偏移。为了mmap
第二段at .p_vaddr
,装载机将两者向下取整.p_vaddr
and .p_offset
, and mmap
在该段的开头有一些额外的内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)