从链接库中抑制输出到cout

Ben*_*ier 7 c++ linux linker

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

有没有办法将其输出重定向到不同的流或在链接到我的代码时抑制它?我更喜欢C++中的一种干净的方式,但是担心这是不可能的,我也会对脏的链接器黑客感到高兴.此外,"代理libstdc++"也可以作为最后的手段.

我使用的是GNU工具链(工作g++,libtool,ld)在Linux下.

Mat*_*ner 3

好吧,似乎没有人注意到它,这是我的链接器建议:

  1. 插入 libc,提供您自己的write(),并过滤输出到文件描述符12.
  2. 将您自己的代码静态链接到 libc,然后将共享版本插入到write()上面的压制中。
  3. 插入 libc,提供my_write()绕过write()使用dlsym().
  4. write通过传递 链接共享库时换行-Wl,--wrap=write。然后压制文件描述符12名为 的函数中的所有输出__wrap_write。其他文件描述符应该调用到__real_write.

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

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

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

链接

介入

包装