ここにいくつかの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'シンボルを削除します。