我正在使用GNU ld的“-wrap”选项来拦截应用程序中的调用,但是遇到了实现包装器的代码间接调用包装函数,创建循环引用的场景。
目标是包装在Program Foo中发生的读取调用。此代码可以重新编译/重新链接,但不能修改。
main() {
...
read(fd, buf, size);
...
}
这里的包装器将在使用“-wrap read”时拦截对程序Foo中libc读取的调用。
extern int __real_read(...);
int __wrap_read(...) {
bar();
__real_read(...);
}
但是,从包装器调用的Library Bar需要使用libc的read()函数而不经过包装器(从而导致循环依赖)。
void bar(void) {
read(fd, buf, size)
}
更改库栏中的所有包装例程以使用__real_read()不是一个选项,因为库栏中对外部库的附加调用中存在的间接级别是任意的。
解决此问题的一种方法是使用每线程标志来防止源自Library Bar的包装读取重新进入库。虽然我不想使用这个解决方案,但我也愿意接受有关如何在包装器和条形库中进行最少代码更改来实现这一点的建议。
???这就是为什么我问这个问题:)
...谢谢 -n
答案 0 :(得分:1)
正如Nathon所说,应该可以只为特定的目标文件包装read()调用。不确定linux,但是在windows中包装DLL中的导入函数不会影响其他模块中的导入函数,因此将Bar放在单独的DLL中并使用unwrapped read()可以解决问题。