【发布时间】:2014-04-20 22:37:27
【问题描述】:
const struct mach_header *mach = _dyld_get_image_header(0);
struct load_command *lc;
struct segment_command_64 *sc64;
struct segment_command *sc;
if (mach->magic == MH_MAGIC_64) {
lc = (struct load_command *)((unsigned char *)mach + sizeof(struct mach_header_64));
printf("[+] detected 64bit ARM binary in memory.\n");
} else {
lc = (struct load_command *)((unsigned char *)mach + sizeof(struct mach_header));
printf("[+] detected 32bit ARM binary in memory.\n");
}
for (int i = 0; i < mach->ncmds; i++) {
if (lc->cmd == LC_SEGMENT) {
sc = (struct segment_command *)lc;
NSLog(@"32Bit: %s (%x - 0x%x)",sc->segname,sc->vmaddr,sc->vmsize);
} else if (lc->cmd == LC_SEGMENT_64) {
sc64 = (struct segment_command_64 *)lc;
NSLog(@"64Bit: %s (%llx - 0x%llx)",sc64->segname,sc64->vmaddr,sc64->vmsize);
}
lc = (struct load_command *)((unsigned char *)lc+lc->cmdsize);
}
当我以 32 位运行此代码时,我得到正常输出:
__PAGEZERO (0 - 0x1000)
But on 64Bit: __PAGEZERO (0 - 0x100000000)
__PAGEZERO goes from 0x1000 to over 0x100000000 的大小,是否有任何解决方法或解决方案为什么会发生这种情况?
【问题讨论】:
-
为什么这是一个需要解决的问题?
-
well 0x100000000 大约是 4.29 GB。我运行它的文件大约是 107kb,这意味着某处一定有错误的计数。
-
还是对虚拟内存地址的理解有误
-
正好是 4GB。但是考虑到总内存是 64 位的(实际上,它可能不是完整的 64 位,但无论如何),即使是现在的大型机器也没有超过 1TB 的 RAM,浪费了第一个4GB 的地址空间(我相信不是物理内存)作为“捕获 NULL 指针访问”)就可以了。
标签: c++ ios objective-c c