我试图用我自己的实现覆盖一些libc函数(例如:puts()
)。
我在dylib文件中定义了我自己的实现,如下所示。
int puts ( const char * str );
当我将我的二进制文件与Xcode中的dylib文件链接并构建时,我的被覆盖版本被调用。
但是,当我将dylib注入到我的二进制文件中时,我发现未调用被覆盖的版本。我已经验证了dylib是通过在dylib的入口点记录内容来加载的。
有人可以指出我需要做些什么来获取被覆盖的版本吗?
答案 0 :(得分:2)
这是预期的行为,因为当您链接时,您的库优先于libSystem.B.dylib,这是导出puts的位置(作为libsystem_c和朋友的重新导出)。
要在运行时获取此信息,您需要明确使用函数插入。这是DYLD的一大特色。在您的库中,创建一个小部分:
static const interpose_t interposing_functions[] \
__attribute__ ((section("__DATA, __interpose"))) = {
{ (void *)my_puts, (void *) puts }
};