-2

Python で良い callgraph プログラムを書きたいので、pycparser を使用します。Pycparser は、抽象構文ツリーを正しく作成するために c ファイルを前処理する必要があります。私の最初のアプローチは-E、ファイルで gcc のオプションのみを使用し、それを pycparser に渡すことでした。しかし、別のプロジェクトではNo such file or directory、gcc が特定のヘッダーを見つけられないため、" " エラーが発生します。Linux カーネルを前処理しようとするgcc -E `find | grep "\.c"\`と、そのようなフォルダーがないため、Linux/ プレフィックスが付いたもののようなヘッダー ファイルがいくつか見落とされます。gcc がヘッダー ファイルの場所を渡して正しく前処理するには、いくつかの追加フラグが必要なようです。任意の C プロジェクトを前処理する一般的な方法はありますか?

さらに、正しく前処理すると、同じ関数の複数のコピーが異なるファイルにあると思います。関数の元のファイルを特定する方法はありますか?

4

1 に答える 1

1

少なくとも、コンパイラ コマンド ライン スイッチと検索パスの環境変数を含め、GCC がヘッダー ファイルを見つける方法について読む必要があります。

さまざまなプロジェクトのビルド スクリプトが、GCC が特定のコンパイルのヘッダー ファイルを見つける方法に影響を与える構成変数を設定していると思われます。そのようなスクリプトの多くは、コマンド ラインでマクロ置換を行うことさえあります。つまり、スクリプトが何を行っているかを知る必要があります。

ビルド コンテキストを設定する make スクリプトから C ソース ファイルを分離すると、GCC は正しいヘッダーを見つけられません。そして、それはあなたの問題です。

おそらく、ビルド スクリプトを実行し、必要なコンテキストを取得するために GCC への呼び出しをインターセプトする必要があります。

于 2016-11-19T16:24:09.953 に答える