0

我正在尝试puts()用我自己的实现覆盖一些 libc 函数(例如:)。

我在 dylib 文件中定义了自己的实现,如下所示。

int puts ( const char * str ); 

当我将我的二进制文件与 Xcode 中的 dylib 文件链接并构建时,我的覆盖版本被调用。

但是,当我将 dylib 注入到我的二进制文件中时,我看到没有调用覆盖的版本。我已经通过在 dylib 的入口点记录一些内容来验证 dylib 正在加载。

这里有人可以指出我需要做什么才能调用我的覆盖版本吗?

4

1 回答 1

2

这是预期的行为,因为当您链接时,您的库优先于 libSystem.B.dylib,这是导出 puts 的位置(作为 libsystem_c 和朋友的重新导出)。

要在运行时获得此功能,您需要显式使用函数插入。这是DYLD的一大特色。在您的库中,创建一个小部分:

static const interpose_t interposing_functions[] \
    __attribute__ ((section("__DATA, __interpose"))) = {
        { (void *)my_puts,  (void *) puts  } 
    };
于 2012-11-13T13:13:32.490 回答