シンボルの可視属性の明示的な指定

データまたは関数宣言で visibility 属性を使用して個々のシンボルの可視属性を明示的に設定することができます。次に例を示します。

int i __attribute__ ((visibility("default")));

void __attribute__ ((visibility("hidden"))) x () {...}

extern void y() __attribute__ ((visibilty("protected");

visibility 宣言属性には、次の 5 つのキーワードを使用することができます。

visibility 宣言属性の値は、-fvisibility-fpic、または -fno-common 属性のデフォルト設定よりも優先されます。

複数のシンボルで同じ visibility 属性を指定する場合、次の 5 つのコマンドライン・オプションのうち 1 つを使用して可視属性を設定することができます。

file は、可視属性を設定するシンボル名のリストを含むファイルのパス名です。ファイル中のシンボル名は、余白 (ブランク、TAB 文字、または改行) で区切ります。次に例を示します。

-fvisibility-protected=prot.txt

prot.txt ファイルの内容:

a

    b c d

  e

この場合、シンボル a、b、c、d、および e の可視属性が protected に設定されます。これは、各シンボルで次のように宣言した場合と同じです。

__attribute__ ((visibility=("protected")))

可視属性を明示的に設定するこれらの 2 つの方法 (宣言で __attribute((visibilty())) を使用する方法とファイルでシンボル名を指定する方法) は互いに排他的であり、同時に両方を行うことはできません。

次のコマンドライン・オプションの 1 つを使用して、シンボルのデフォルトの可視属性を設定することができます。

このオプションは、可視属性リストファイルで指定がなく、宣言に __attribute__((visibilty())) がないシンボルの可視属性を設定します。次に例を示します。

-fvisibility=protected -fvisibility-default=prot.txt

ファイル prot.txt の内容が前の例と同じ場合、a、b、c、d、および e を除くグローバルシンボルの可視属性が protected に設定されます。しかし、これらの 5 つのシンボルの可視属性は default に設定されプリエンプト可能になります。