C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了防止“ld -wrap”循环引用大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用GNU ld的“-wrap”选项来拦截应用程序中的@L_673_1@,但是遇到了实现包装器的代码间接@L_673_1@包装函数,创建循环引用的场景.

目标是包装在Program Foo中发生的读取@L_673_1@.此代码可以重新编译/重新链接,但不能修改.

节目Foo

@H_724_13@main() { ... read(fd,buf,sizE); ... }

这里的包装器将在使用“-wrap read”时拦截对程序Foo中libc读取的@L_673_1@.

包装纸

extern int __real_read(...);
int __wrap_read(...) {
    bar();
    __real_read(...);
}

但是,从包装器@L_673_1@的Library Bar需要使用libc的read()函数而不经过包装器(从而导致循环依赖).

图书馆酒吧

void bar(void) {
    read(fd,sizE)
}

更改库栏中的所有包装例程以使用__real_read()不是一个选项,因为库栏中对外部库的附加@L_673_1@中存在的间接级别是任意的.

避免标志

解决此问题的一种方法是使用每线程标志来防止源自Library Bar的包装读取重新进入库.然我不想使用这个解决方案,但我也愿意接受有关如何在包装器和条形库中使用最少的代码更改来实现此解决方案的建议.

理想解决方

???这就是为什么我问这个问题:)

谢谢…
-n

解决方法

正如Nathon所说,应该可以只为特定的目标文件包装read()@L_673_1@.不确定linux,但在Windows中包装DLL中的导入函数不会影响其他模块中的导入函数,因此将Bar放在单独的DLL中并使用unwrapped read()可以解决问题.

大佬总结

以上是大佬教程为你收集整理的防止“ld -wrap”循环引用全部内容,希望文章能够帮你解决防止“ld -wrap”循环引用所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。