-qproclocal、-qprocimported、-qprocunknown

説明

64 ビットのコンパイルで、関数にローカル、インポート、または不明のマークを付ける。

構文

構文図を読む構文図をスキップする   .---------------------------------------------------.
   V                                                   |
>>--- -q--+-proclocal------+--+----------------------+-+-------><
          +-noproclocal----+  |    .-:-------------. |
          +-procimported---+  |    V               | |
          +-noprocimported-+  '-=----function_name-+-'
          +-procunknown----+
          '-noprocunknown--'
 

#pragma optionsも参照してください。

デフォルト

デフォルトでは、定義が現行コンパイル単位内にある関数はすべてローカル proclocal であり、その他の関数はすべて不明 procunknown であると想定されます。ローカルとしてマークされた関数が共用ライブラリー関数に解決される場合は、 リンケージ・エディターは、エラーを検出して警告を出します。

このコンパイラー・オプションは 64 ビット・コンパイルにのみ適用されます。

使用できるサブオプションは以下のとおりです。

ローカル関数 ローカル関数は、それを呼び出す関数と静的にバインドされます。 -qproclocal を指定すると、すべての関数をローカルであると見なすように デフォルトが変更されます。-qproclocal=names は、 指定された関数をローカルとしてマークします。 ここで、names は、 コロン (:) で区切った関数 ID のリストです。 デフォルトは変更されません。

ローカルとしてマークされた関数への呼び出しに対しては、 サイズがより小さくて高速なコードが生成されます。

インポートされる関数 インポートされる関数は、ライブラリーの共用部分と動的にバインドされます。 -qprocimported は、すべての関数がインポートされるものであると見なすように デフォルトを変更します。 -qprocimported=names を指定すると、 指定された関数がインポートされるものとしてマークされます。 ここで、names は、コロン (:) で 区切った関数 ID のリストです。 デフォルトは変更されません。

インポートされるものとしてマークされた関数の呼び出しのために生成されるコードは、 不明としてマークされた関数のために生成されるデフォルトのコード・シーケンスより サイズが大きくなる場合がありますが、高速になります。 マークされた関数が、静的にバインドされたオブジェクトに解決される場合は、 生成されるコードは、不明の関数のために生成されるデフォルトの コード・シーケンスよりサイズが大きく、実行が遅くなる場合があります。

不明の関数 不明の関数は、リンク・エディット中に、 静的または動的のいずれかでバインドされたオブジェクトに解決されます。 -qprocunknown を指定すると、 すべての関数を不明であると見なすようにデフォルトが変更されます。 -qprocunknown=names は、 指定された関数を不明としてマークします。 ここで、names は、 コロン (:) で区切った関数 ID のリストです。 デフォルトは変更されません。

C++ のみ C++ プログラムでは、関数 names はそれらのマングル名を使用して指定する必要があります。

プロシージャーをマークするオプションの間で矛盾がある場合は、以下の方法で解決されます。

関数名をリストするオプション 特定の関数名に対する最後の明示的指定が使用される。
デフォルトを変更するオプション この形式は、名前リストを指定しない。 最後に指定されたオプションが、 名前リスト・フォームに明示的にリストされていない関数に対するデフォルトとなります。

  1. myprogram.c をアーカイブ・ライブラリー oldprogs.a と共にコンパイルして、以下のように指定するには、 以下のように入力します。
    xlc++ myprogram.c oldprogs.a -qprolocal=fun(int):sun()
      -qprocimported=moon():stars(float) -qprocunknown=venus()
  2. 次の例は、ローカルとしてマークされた関数が、ローカルではなく共用ライブラリー関数に 解決されたときに、結果として表示される一般的なエラー・メッセージです。
    int main(void) 
    { 
        printf("Just in function foo1()¥n");
        printf("Just in function foo1()¥n");
    }

    xlc -q64 -qproclocal -O -qlist t.c を指定してこのソース・コードを コンパイルすると、以下のような結果になります。

    /usr/lib64: t.o(.text+0x10): unresolvable relocation ¥
      against symbol `.printf@@GLIBC_2.2.5'
        t.o: In function .main': 
        t.o(.text+0x10): relocation truncated to fit: R_PPC64_REL24 .printf@@GLIBC_2.2.5 
    /usr/lib64: t.o(.text+0x18): unresolvable relocation ¥
      against symbol `.printf@@GLIBC_2.2.5'
        t.o(.text+0x18): relocation truncated to fit: R_PPC64_REL24 .printf@@GLIBC_2.2.5
    

    実行可能ファイルは作成されますが、実行されません。エラー・メッセージには、オブジェクト・ファイル t.o 内の printf の呼び出しで問題が発生したことが示されます。 呼び出されるルーチンが共用オブジェクトからインポートされるものであることを確認したら、 警告の原因となったソース・ファイルを再コンパイルして、インポートされるもの として printf を明示的にマークしてください。例を以下に示します。

    xlc -c -qprocimported=printf t.c

関連情報