我正在使用 GNU ld 的“-wrap”选项来拦截应用程序中的调用,但遇到了这样一种情况:实现包装器的代码间接调用被包装的函数,从而创建循环引用。
目标是包装 Program Foo 中发生的读取调用。该代码可以重新编译/重新链接,但不能修改。
当使用“-wrap read”时,这里的包装器将拦截对 Program Foo 中 libc 的读取的调用。
但是,从包装器调用的 Library Bar 需要使用 libc 的 read() 函数,而不经过包装器(从而导致循环依赖)。
将 Library Bar 中的所有包装例程更改为使用 __real_read() 不是一个选项,因为对 Library Bar 中的外部库的附加调用中存在的间接级别是任意的。
解决此问题的一种方法是使用每线程标志来防止来自 Library Bar 的包装读取重新进入库。尽管我不想使用此解决方案,但我也愿意接受有关如何在包装器和栏库中以最少的代码更改来实现此解决方案的建议。
正如 Nathon 所说,应该可以仅对特定对象文件包装 read() 调用。不确定 Linux 的情况,但在 Windows 中,将导入的函数包装在 DLL 中不会影响其他模块中的导入函数,因此将 Bar 放在单独的 DLL 中,并使用未包装的 read() 可以解决问题。