Operating system 在OS X上使用注入的动态库重写libc函数

Operating system 在OS X上使用注入的动态库重写libc函数,operating-system,dylib,libc,mach-o,Operating System,Dylib,Libc,Mach O,我试图用自己的实现覆盖一些libc函数(例如:put()) 我在动态库文件中定义了自己的实现,如下所示 int puts ( const char * str ); 当我将二进制文件链接到Xcode和build中的dylib文件时,就会调用我的重写版本 但是,当我将动态库注入到二进制文件中时,我看到没有调用重写的版本。我已经通过在动态库的入口点记录一些东西来验证动态库是否被加载 这里有人能告诉我需要做什么才能调用我的重写版本吗?这是预期的行为,因为当您链接进来时,您的库优先于libSyste

我试图用自己的实现覆盖一些libc函数(例如:
put()

我在动态库文件中定义了自己的实现,如下所示

int puts ( const char * str ); 
当我将二进制文件链接到Xcode和build中的dylib文件时,就会调用我的重写版本

但是,当我将动态库注入到二进制文件中时,我看到没有调用重写的版本。我已经通过在动态库的入口点记录一些东西来验证动态库是否被加载


这里有人能告诉我需要做什么才能调用我的重写版本吗?

这是预期的行为,因为当您链接进来时,您的库优先于libSystem.B.dylib,而libSystem.B.dylib是put的导出位置(作为libSystem_c和friends的重新导出)

要在运行时实现这一点,您需要显式地使用函数插入。这是DYLD的一大特色。在库中,创建一个小部分:

static const interpose_t interposing_functions[] \
    __attribute__ ((section("__DATA, __interpose"))) = {
        { (void *)my_puts,  (void *) puts  } 
    };