【发布时间】:2011-03-18 14:53:59
【问题描述】:
我正在使用 GNU ld 的“-wrap”选项来拦截应用程序中的调用,但遇到了实现包装器的代码间接调用被包装函数的场景,从而创建了循环引用。
示例
目标是包装在 Program Foo 中发生的读取调用。此代码可以重新编译/重新链接,但不能修改。
程序Foo
main() {
...
read(fd, buf, size);
...
}
这里的包装器会在使用“-wrap read”时拦截对程序Foo中libc读取的调用。
包装器
extern int __real_read(...);
int __wrap_read(...) {
bar();
__real_read(...);
}
但是,从 wrapper 调用的 Library Bar 需要使用 libc 的 read() 函数而不经过 wrapper(从而导致循环依赖)。
图书馆栏
void bar(void) {
read(fd, buf, size)
}
将库栏中的所有包装例程更改为使用 __real_read() 不是一种选择,因为在库栏中对外部库的附加调用中存在的间接级别是任意的。
避免标记
解决此问题的一种方法是使用每线程标志来防止来自库栏的包装读取重新进入库。虽然我不想使用这个解决方案,但我也愿意接受有关如何在包装器和 bar 库中以最少的代码更改来实现它的建议。
理想的解决方案
???这就是我问这个问题的原因:)
谢谢... -n
【问题讨论】:
-
您能否指示链接器仅将 -wrap 应用于某些目标文件?也许链接器脚本可以让你到达那里。
-
这不太可能。考虑 bar() 调用另一个对象文件(等等)中的函数的情况,该对象文件又调用 read()。这些间接级别会迅速变大,并且跟踪它很容易出错。
标签: c compiler-construction linker wrapper trace