小编典典

禁止从链接库输出到cout

linux

我需要针对其产生太多输出到一对夫妇共享库链接到我的C 程序std::cout,并std::cerr使得它们既没有用我的用途。我可以访问这些库的C
源代码,但无法对其进行修改。

当与我的代码链接时,是否可以将其输出重定向到其他流或取消显示?我希望使用C
++的简洁方式,但是由于担心那是不可能的,我也会对肮脏的链接程序黑客感到满意。libstdc++作为最后的手段,“代理”也可以。

我使用的是GNU工具链(工作g++libtoolldLinux下)。


阅读 305

收藏
2020-06-07

共1个答案

小编典典

好吧,似乎没人受到打击,这是我的链接器建议:

  1. 插入libc,提供自己的内容write(),并将输出过滤到文件描述符12
  2. 将您自己的代码与libc静态链接,然后write()如上所述将共享版本插入静噪。
  3. 插入libc,提供my_write()绕过write()using 的功能dlsym()
  4. write通过链接链接共享库时自动换行-Wl,--wrap=write。然后,将所有输出压缩到文件描述符中,12使用一个称为的函数__wrap_write。其他文件描述符应通过调用__real_write

请注意,对于那些不知道的文件描述符1,它们2对应于stdoutstderr,并且最终写入到cout/
cerr机器中。通常,这是实现的cout调用fwrite,这些调用write在不同级别具有不同级别的缓冲和恶作剧。

最好的选择是选项4,缺点是您必须调整共享库的最终链接。

下一个最好的选择是上面的选项2,缺点是最终的可执行文件要大得多,但是不必在您自己的代码中使用愚蠢的函数。

2020-06-07