gpt4 book ai didi

ios - 如何在 iOS 中查找文本段范围

转载 作者:行者123 更新时间:2023-11-29 02:44:44 25 4
gpt4 key购买 nike

如何在 iOS 中找到文本段(也称为代码段)范围?意思是,文本段的起始地址和结束地址是什么?

我找到了 this interesting post但它适用于 Android 但不适用于 iOS。

最佳答案

经过一些挖掘和专家帮助(感谢 Moshe Kravchik),我找到了所需的解决方案 - 通过解析 mach header 并检索加载命令、段和节来获取文本段范围。

#include <mach-o/dyld.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
#import <Foundation/Foundation.h>

#define PRINT_STR "Found __text Section of %s, addr 0x%x, size %u, offset 0x%x, calc address 0x%x"
#define LC_SEGMENT_NATIVE LC_SEGMENT
#define segment_command_native segment_command
#define section_native section

struct libRange
{
uint32_t start;
uint32_t end;
};

void getTextSegmentAddr(struct libRange *txtSegRange)
{
if (txtSegRange==NULL)
return;

txtSegRange->start=0;

const struct mach_header *mach_hdr;
mach_hdr = _dyld_get_image_header(0);

const struct load_command *cmds = (const struct load_command *)(mach_hdr + 1);
uint32_t cmdsleft;
const struct load_command *lc;

for(lc = cmds, cmdsleft = mach_hdr->ncmds; cmdsleft-- && (0 == txtSegRange->start);) {
if(lc->cmd == LC_SEGMENT_NATIVE) {
const struct segment_command_native *sc = (void *) lc;
const struct section_native *sect = (void *) (sc + 1);
for(uint32_t sect_idx = 0; sect_idx < sc->nsects; sect_idx++) {
if(!strcmp("__TEXT", sect->segname) && !strcmp("__text", sect->sectname)) {
uint32_t memAddr = (sc->vmaddr + _dyld_get_image_vmaddr_slide(0) + sect->offset - sc->fileoff);
NSLog(@PRINT_STR,_dyld_get_image_name(0), sect->addr, sect->size, sect->offset, memAddr);
txtSegRange->start = memAddr;
txtSegRange->end = memAddr + sect->size;
break;
}
sect++;
}
}
lc = (void *) ((char *) lc + lc->cmdsize);
}
}

int main()
{
struct libRange txtSegRange;
getTextSegmentAddr(&txtSegRange);
return 0;
}

关于ios - 如何在 iOS 中查找文本段范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25286221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com