1

printfsがオンになっているベンダー提供のライブラリがあります。これは大きな煩わしさであり、何らかの方法でオフにするか、無効にしたいと考えています。

ライブラリのソース コードにアクセスせずに、このライブラリ内のすべての printfs を完全に無効にする方法はありますか? アプリケーションの別の部分に printfs を追加したいと考えています。

組み込み (sh4) プラットフォームに gcc ツールチェーンを使用しています。

ありがとう!

4

2 に答える 2

3

ライブラリをハックして、本物の代わりにダミーのラッパー関数を呼び出すことができますprintf。これを行う方法は次のとおりです(ライブラリが静的ライブラリとして配布されていると仮定します):

  1. wrap_printf.c次の内容のというファイルを作成します。

    int __wrap_printf(const char *fmt, ...) {
        return 0;
    }
    
  2. ラッパーをコンパイルします。

    gcc wrap_printf.c -c -o wrap_printf.o
    
  3. ライブラリを解凍します。

    mkdir libobj; cd libobj; ar x libvendor.a
    
  4. 各ベンダー オブジェクト ファイルを再リンクして、ラッパーを使用します。

    for obj in libobj/*.o; do ld --wrap=printf $obj -r -o $obj
    
  5. ラッパーを含むライブラリを再構築します。

    ar rcs libvendor_noprintf.a wrap_printf.o libobj/*.o
    
  6. 通常どおり、プログラムを新しいライブラリにリンクします

    gcc program.o -lvendor_noprintf -o prog
    
于 2013-09-11T14:11:47.453 に答える
0

ライブラリを使用する場所が 1 つしかない場合は、freopenstdout をリダイレクトするために使用できます。Linux でこのサンプルを試してください。

#include <stdio.h>

int
main(void)
{
  printf("This goes to screen\n");
  freopen("/dev/null", "w", stdout);
  printf("This goes to nowhere");
  freopen("/dev/tty", "w", stdout);
  printf("This goes to screen again\n");
  return 0;
}

この方法の欠点は、プラットフォームに依存することです。Windows では、 andの代わりに"NUL"and "CON"devices を使用する必要があります"/dev/null""/dev/tty"

于 2013-09-13T07:55:48.267 に答える