如果所讨论的函数是库函数,并且没有静态编译到可执行文件中,则您无需执行任何操作 - 您可以使用函数插入来代替。具体来说,将其添加到您的库中:
// 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 内部的优秀书籍可以为您提供示例,但显然根据 SO 网站政策,我们无法将您链接到它们。也就是说,上面的代码片段应该可以工作。请记住,这不适用于其他 dylib 执行的 open 调用(尽管也有更复杂的方法来获得它)