2012-04-04 95 views

回答

1

dyld(3) man page中记录的功能似乎提供了类似的功能。

+0

链接是死 – 2017-05-14 12:37:49

+0

@让MichaëlCelerier:感谢;固定。 – 2017-05-14 16:49:26

1

刚刚完成日期:

输入任何指向一些静态内容(例如函数)和目标是找到库及其部分。

我在ptr_is_in_exe功能实现了这个here

static bool 
ptr_is_in_exe(const void *ptr, const struct mach_header *& header, intptr_t& offset, uintptr_t& vmaddr, std::string& image_name) 
{ 
    uint32_t i, count = _dyld_image_count(); 

    for (i = 0; i < count; i++) { 
     header = _dyld_get_image_header(i); 
     offset = _dyld_get_image_vmaddr_slide(i); 

     uint32_t j = 0; 
     struct load_command* cmd = (struct load_command*)((char *)header + sizeof(struct mach_header)); 
     if(header->magic == MH_MAGIC_64) 
      cmd = (struct load_command*)((char *)header + sizeof(struct mach_header_64)); 

     while (j < header->ncmds) { 
      if (cmd->cmd == LC_SEGMENT) { 
       struct segment_command* seg = (struct segment_command*)cmd; 
       if (((intptr_t)ptr >= (seg->vmaddr + offset)) && ((intptr_t)ptr < (seg->vmaddr + offset + seg->vmsize))) { 
        vmaddr = seg->vmaddr; 
        image_name = _dyld_get_image_name(i); 
        return true; 
       } 
      } 
      if (cmd->cmd == LC_SEGMENT_64) { 
       struct segment_command_64* seg = (struct segment_command_64*)cmd; 
       if (((uintptr_t)ptr >= (seg->vmaddr + offset)) && ((uintptr_t)ptr < (seg->vmaddr + offset + seg->vmsize))) { 
        vmaddr = seg->vmaddr; 
        image_name = _dyld_get_image_name(i); 
        return true; 
       } 
      } 

      j++; 
      cmd = (struct load_command*)((char*)cmd + cmd->cmdsize); 
     } 
    } 

    return false; 
}