2

我需要在运行时将 Mac OS 进程中的函数引用更改为我自己的自定义 dylib 中定义的自定义函数。我保持新的函数签名与原来的相同。例如,我需要将“open”函数更改为“myopen”函数。

我尝试处理 __LINKEDIT 段以获取动态符号表和字符串表。我使用了以下指针,1.来自 __LINKEDIT 段的 VMAddrress,2.来自“_dyld_register_func_for_add_image”回调的 mach_header 和 vmaddr_slide,3.来自 symtab_command 的 symoff 和 stroff。

但是我无法获取 __LINKEDIT 段中提到的符号表和字符串表。有人可以对此有所了解吗?提前致谢。

4

1 回答 1

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 内部的优秀书籍可以为您提供示例,但显然根据 SO 网站政策,我们无法将您链接到它们。也就是说,上面的代码片段应该可以工作。请记住,这不适用于其他 dylib 执行的 open 调用(尽管也有更复杂的方法来获得它)

于 2012-11-15T04:31:29.620 回答