1

我正在编写一个插件子系统,其中一个想法是遍历 dylib(或至少当前全局范围)导出的函数。我知道还有其他方法,只是真的想尝试一下。

我想知道的是,有没有办法获取由 dylib 导出的函数列表或通过 OS X 和 iOS API 在全局范围内可用的函数列表?

提前致谢!

4

2 回答 2

2

您可以使用命令“nm”从动态库中获取信息。另请参阅 Mac 上此命令的系统手册。

于 2013-02-18T13:56:06.957 回答
0

如果您希望从代码中执行此操作,则可以使用此方法。

std::vector<std::string> load_mach_o(std::string file_name)
{
  /*
  Parse the Mach-O structure to find all the exported symbols
  Mach-O structure:
   mach_header_64
   cmd
   ...
   cmd
   data
   ...
   data
  */
  std::vector<std::string> methods; 
  off_t offset = sizeof(struct mach_header_64);
  BYTE * bytes = load_bytes(file_name.c_str());
  if (bytes == NULL)
  {
    return methods;
  }

  struct mach_header_64 *header = (struct mach_header_64 *)bytes;
  //Get the load commands
  struct load_command *cmd = (struct load_command *)(bytes + offset);

  for (uint32_t i = 0U; i < header->ncmds; i++)
  {
    if (cmd->cmd == LC_SYMTAB)
    {
      struct symtab_command * symtab = (struct symtab_command *)cmd;
      off_t string_start = 0;
      const char* strings = (const char *)(bytes + symtab->stroff + 1);
      for (uint32_t i = 0 ; i < symtab->strsize ; i++)
      {
        if (strings[i] == '\0')
        {
        i++;
        size_t size = sizeof(char) * (i - string_start);
        if (size == 1)
        {
          string_start = i+1;
          continue;
        }
        methods.push_back(std::string((const char *)(strings + string_start)));
        string_start = i+1;
        }
      }
    }
    offset += cmd->cmdsize;
    //load next command
    cmd = (struct load_command *)(bytes + offset);
  }
  free(bytes);
  return methods;
}

此函数读取文件并解析结构直到 mach-O 字符串部分,然后解析每个字符串并将其存储在包含所有公开函数的向量中。

此致。

于 2021-10-15T19:33:29.237 回答