我正在编写一个插件子系统,其中一个想法是遍历 dylib(或至少当前全局范围)导出的函数。我知道还有其他方法,只是真的想尝试一下。
我想知道的是,有没有办法获取由 dylib 导出的函数列表或通过 OS X 和 iOS API 在全局范围内可用的函数列表?
提前致谢!
您可以使用命令“nm”从动态库中获取信息。另请参阅 Mac 上此命令的系统手册。
如果您希望从代码中执行此操作,则可以使用此方法。
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 字符串部分,然后解析每个字符串并将其存储在包含所有公开函数的向量中。
此致。