1

ここにいくつかのC++テストコードがあります:

__attribute__((visibility("hidden"))) void foo()
{
   int fd = fopen("data1", "rb");
   printf ("%d", fd);
}

そして、他のすべてのコードは関数'foo'と関数'fopen'を呼び出さない

次に、gccオプション-ffunction-sectionsを使用して、コードをsoファイルにコンパイルします。

私が思うに、関数fooシンボルとfooバイナリコードはsoファイルに含まれていません。

しかし問題は、シンボル「fopen」はシンボルテーブルであってはならないと思うことです。ps:関数「foo」のみが「fopen」を使用していることを確認できます。実際にはそうではありません。コマンドnmを使用すると、「fopen」の「U」タイプの記号が見つかりました。

gccはどのように機能しますか?また、gccの他のコンパイルオプションがあり、シンボル'fopen'が使用されていないことを確認し、'fopen'シンボルを削除します。

4

1 に答える 1

0

問題は、シンボルが後で使用されるかどうかをコンパイラが認識しないことです。

コンパイル時に、プログラム全体を彼に渡したことがわかります。そのため、プログラムが関数を呼び出さない場合は、だれも呼び出さないようになります。

コンパイルオプションは-fwhole-programです。

于 2012-05-02T16:43:29.407 に答える