我需要在运行时将Mac OS进程中的函数引用更改为我自己的自定义dylib中定义的自定义函数。我保持新的功能签名与原始签名相同。 例如,我需要将“打开”功能更改为“myopen”功能。
我尝试处理__LINKEDIT段以获取动态符号表和字符串表。 我使用了以下指针, 1.来自__LINKEDIT段的VMAddrress, 2.来自“_dyld_register_func_for_add_image”回调的mach_header和vmaddr_slide, 3. symtab_command的symoff和stroff。
但是我无法获得__LINKEDIT细分中提到的符号表和字符串表。 有人可以对此有所了解吗? 提前谢谢。
答案 0 :(得分:1)
如果有问题的函数是库函数,而不是静态编译到可执行文件中,则不需要执行任何操作 - 您可以使用函数插入。具体来说,将其添加到您的库中:
// The attribute creates a Mach-O Section in your library - q.v. libgmalloc.dylib for
// a nice example
static const interpose_t interposing_functions[] \
__attribute__ ((section("__DATA, __interpose"))) = {
{ (void *)my_open, (void *)open },
{ (void *)my_close, (void *)close }, // .. etc
};
int my_open(const char *path, int flags, mode_t mode)
{
int rc;
// Prolog - do something before open
rc = open(path, flags, mode); // call real open
// Epilog - record rc, etc..
return rc;
}
有几本关于OS X内部的优秀书籍可以为您提供样本,但显然根据S.O网站政策,我们无法将您链接到他们。也就是说,上面的代码片段应该可行。请记住,这对于其他dylib执行的打开调用不起作用(尽管有更复杂的方法可以实现这一点)