これらの文字列は、ライブラリが実行時にロードされるときに使用される ダイナミック シンボル テーブルにあります。readelf -p .dynstr mylib.so
これらのエントリが表示されます。
strip -g
はデバッグ シンボルを削除しますが、実行時に必要になる可能性があるため、動的シンボル テーブルからエントリを削除することはできません。あなたの問題は、ライブラリの外部から呼び出されることのない関数の動的シンボル テーブルにエントリがあることです。あなたがそれを言わない限り、コンパイラ/リンカーは、どの関数が外部 API の一部を形成しているか (したがって、動的シンボル テーブルにエントリが必要)、どの関数がライブラリ専用であるか (したがって、エントリは不要) を知る方法がありません。動的シンボル テーブル)、すべての非静的関数の動的シンボル テーブル エントリを作成するだけです。
どの関数がプライベートであるかをコンパイラに通知するには、主に 2 つの方法があります。
プライベート関数をマークしますstatic
。明らかに、これは単一のコンパイル単位内でのみ必要な関数に対してのみ機能しますが、一部のライブラリではこの手法で十分な場合があります。
gcc の「visibility」属性を使用して、関数を可視または非表示としてマークします。2 つのオプションがあります。すべてのプライベート関数を非表示としてマークするか、-fvisibility=hidden
コンパイラ オプションを使用してデフォルトの可視性を非表示に変更し、すべてのパブリック関数を可視としてマークします。後者は、誤って関数を追加したり、非表示としてマークするのを忘れたりすることを心配する必要がないことを意味するため、おそらく最良のオプションです。
関数がある場合:
int foo(int a, int b);
非表示にするための構文は次のとおりです。
int foo(int a, int b) __attribute__((visibility("hidden")));
可視としてマークするための構文は次のとおりです。
int foo(int a, int b) __attribute__((visibility("default")));
詳細については、この件に関する優れた情報源であるこのドキュメントを参照してください。