加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

防止“ld -wrap”循环引用

发布时间:2020-12-16 06:54:25 所属栏目:百科 来源:网络整理
导读:我使用GNU ld的“-wrap”选项来拦截应用程序中的调用,但是遇到了实现包装器的代码间接调用包装函数,创建循环引用的场景. 例 目标是包装在Program Foo中发生的读取调用.此代码可以重新编译/重新链接,但不能修改. 节目Foo main() { ... read(fd,buf,size); ...
我使用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(...);
}

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

图书馆酒吧

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

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

避免标志

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

理想解决方案

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

谢谢…
-n

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读