0

私はグーグルでしばらく見回してきましたが、実りある結果はありません。私は実際にエクスポートする方法、またはすべての文字列リテラルのリストを取得する方法を探しています。

int main(){
    const char *p = "Hello";
    const char x[] = "World";
}

このコードをコンパイルするために、「Hello」と「World」を知る方法はありますか? それらが逆アセンブラで利用できることは知っています(Windowsでいくつか使用されています)。しかし、これらの文字列を実際にダンプしたり、何らかの方法でエクスポートしたりするための適切なツールはありますか?

4

4 に答える 4

2

質問がまったくわかりません。ソース ファイルがあり、それをコンパイルするときに、使用した文字列定数の数を GCC に通知する必要があります。これを解釈するのは正しいですか?

はいの場合は、gcc に "gcc -S source_file" でコンパイルするように指示できます。これにより、 ".string" に対して定義した文字列定数を含む .s ファイルが得られます。このファイルの「.string」の出現を解析して、カウントを取得できます (手動で、または「wc -l」にパイプされた「grep」を使用)。

于 2012-07-28T06:25:33.713 に答える
1

デバッグ情報がなければ、読み取り専用データ領域 (おそらく IIRC セクション) に単純に配置されることしかわかりません.rdata

Linuxstringsユーティリティは、バイナリ ファイルを調べて、指定された長さとエンコードの制約内で認識された文字列をダンプします。

于 2012-07-28T05:45:00.960 に答える
0

Cコードですべての文字列リテラル定数が正確に必要なのはなぜですか? (stringsバイナリでユーティリティを使用するだけで十分な場合があります)。

その目的のために、たとえばMELTを使用して GCC コンパイラをカスタマイズできますが、それには数日かかる可能性があり、やり過ぎだと感じています。

また、GCC からアセンブリ コードを生成し、そのアセンブリ コードを解析して文字列定数を取得することもできます。

もちろん、前処理されたフォームをトークン化して解析することもできます。

于 2012-07-28T06:10:48.027 に答える
-1

文字列とコメントを認識し、それ以外はすべて無視する単純なトークナイザーを作成します。

于 2012-07-28T06:04:34.410 に答える