64 ビット・コンパイルで、関数をローカル、インポートされるもの、または不明としてマークします。
#pragma optionsも参照してください。
デフォルトでは、定義が現行のコンパイル単位内にある関数はすべてローカル proclocal であり、その他の関数はすべて不明 procunknown であると見なします。ローカルとしてマークされた関数が共用ライブラリー関数に解決される場合は、リンケージ・エディターは、エラーを検出して警告を出します。
このコンパイラー・オプションは 64 ビット・コンパイルにのみ適用されます。
使用できるサブオプションは以下のとおりです。
ローカルな関数 ローカル関数は、それを呼び出す関数と静的にバインドされます。 -qproclocal を指定すると、すべての関数をローカルであると見なすようにデフォルトが変更されます。-qproclocal=names は、指定された関数をローカルとしてマークします。ここで、names は、コロン (:) で区切った関数 ID のリストです。デフォルトは変更されません。
ローカルとしてマークされた関数への呼び出しに対しては、サイズがより小さくて高速なコードが生成されます。
インポートされる関数 インポートされる関数は、ライブラリーの共用部分と動的にバインドされます。 -qprocimported は、すべての関数がインポートされるものであると見なすようにデフォルトを変更します。 -qprocimported=names を指定すると、指定された関数がインポートされるものとしてマークされます。ここで、names は、コロン (:) で区切った関数 ID のリストです。デフォルトは変更されません。
インポートされるものとしてマークされた関数の呼び出しのために生成されるコードは、不明としてマークされた関数のために生成されるデフォルトのコード・シーケンスよりサイズが大きくなる場合がありますが、高速になります。マークされた関数が、静的にバインドされたオブジェクトに解決される場合は、生成されるコードは、不明の関数のために生成されるデフォルトのコード・シーケンスよりサイズが大きく、実行が遅くなる場合があります。
不明の関数 不明の関数は、リンク・エディット中に、静的または動的のいずれかでバインドされたオブジェクトに解決されます。 -qprocunknown を指定すると、すべての関数を不明であると見なすようにデフォルトが変更されます。 -qprocunknown=names は、指定された関数を不明としてマークします。ここで、names は、コロン (:) で区切った関数 ID のリストです。デフォルトは変更されません。
C++ プログラムでは、関数の名前 は、マングルされた名前を使用して指定する必要があります。
プロシージャーをマークするオプションの間の矛盾は、以下の方法で解決されます。
関数名をリストするオプション 特定の関数名に対する最後の明示的指定が使用される。 デフォルトを変更するオプション この形式は、名前リストを指定しません。最後に指定されたオプションが、名前リスト・フォームに明示的にリストされていない関数に対するデフォルトとなります。
xlc++ myprogram.c oldprogs.a -qprolocal=fun(int):sun() -qprocimported=moon():stars(float) -qprocunknown=venus()
int main(void) { printf("Just in function foo1()¥n"); printf("Just in function foo1()¥n"); }
xlc -q64 -qproclocal -O -qlist t.c を指定してこのソース・コードをコンパイルすると、以下のような結果になります。
/opt/cross/bin/powerpc64-linux-ld: 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 /opt/cross/bin/powerpc64-linux-ld: 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