0

重複の可能性:
Solaris 10 CC プリプロセッサのバグにより未定義のシンボルが発生する

この質問の投稿がおなじみの場合は、お詫び申し上げます。昨日、この問題を投稿しました: Solaris 10 CC プリプロセッサのバグにより、未定義のシンボルが発生します。ただし、この投稿のみに表示される、いくつかの明確な情報 (昨日から学んだこと) を追加しました。

次のような非常に単純な C++ ファイルがあり、CC コンパイラを使用して Solaris 5-10 でコンパイルしています。私のファイル myTest.C のソース コードは次のとおりです。

#include <map>
std::map<int, bool> myVar2;
int main() { return 0; }

最初にこのファイルに対して CC プリプロセッサを実行し、前処理されたファイルを調べてから、その前処理されたファイルをオブジェクト ファイルにコンパイルしたいと考えています。私はこれを「間接コンパイル」と呼んでいます。これを行うには、次のことを行います。

% CC -P -o myFile_indirect.i myFile.C
% CC -c -o myFile_indirect.o myFile_indirect.i

また、通常行われているように、別の前処理ステップなしでこのファイルをコンパイルしたいと思います。私はこれを「直接コンパイル」と呼んでいます。これを行うには、次のことを行います。

% CC -c -o myFile_direct.o myFile.C

理論的には、myFile_direct.o と myFile_indirect.o は機能的に同等である必要があります。それぞれのシンボルテーブルに同じ数のシンボルが含まれているはずですよね? それでは、それらのシンボルを調べてみましょう:

% gnm myFile_direct.o | c++filt > direct_symbols.txt
% gnm myFile_indirect.o | c++filt > indirect_symbols.txt
% wc -l *direct_symbols.txt
57 direct_symbols.txt
45 indirect_symbols.txt

驚いたことに、直接コンパイルされたオブジェクト ファイルには、間接的にコンパイルされたファイルにはない 12 個のシンボルが含まれています。なんで?これは私にとって深刻なバグのようです。これらのシンボルが間接的にコンパイルされたファイルにないのはなぜですか? 不要な場合、なぜ直接コンパイルされたファイルに含まれているのですか? 直接コンパイルは、最初に同じ前処理を行い、それをユーザーから隠すだけではないでしょうか? ここで何が起こっているのですか?

これらの不足しているシンボルにより、間接的にコンパイルされたオブジェクト ファイルの最終的なリンクが妨げられていることがわかります。しかし、直接コンパイルされたオブジェクト ファイルは問題なくリンクされます。

% CC -o myFile_direct myFile_direct.o
% CC -o myFile_indirect myFile_indirect.o
Undefined                       first referenced
 symbol                             in file
main                                /opt/solstudio12.2/prod/lib/crt1.o
void __rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__deallocate_buffers() myFile_indirect.o
__rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::iterator __rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::erase(__rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::iterator,__rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::iterator) myFile_indirect.o
ld: fatal: Symbol referencing errors. No output written to myFile_indirect

PS。12 個の余分な記号を認識できず、その目的が何であるかもわかりません。

00000010 T __rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__rb_tree_node*__rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__nil()
00000010 T __rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::iterator __rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::erase(__rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::iterator)
00000010 T void __rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__erase(__rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__rb_tree_node*)
00000010 T __rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__rb_tree_node*&__rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__right(__rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__rb_tree_node*)
00000010 T __rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::iterator&__rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::iterator::operator++()
00000010 T __rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__rb_tree_node*__rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__maximum(__rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__rb_tree_node*)
00000010 T __rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__rb_tree_node*__rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__minimum(__rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__rb_tree_node*)
00000010 T __rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__rb_tree_node*&__rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__leftmost()
00000010 T __rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__rb_tree_node*&__rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__rightmost()
00000010 T void __rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__erase_leaf(__rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__rb_tree_node*)
00000010 T void __rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__rotate_left(__rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std::pair<const int,bool>,int>,std::less<int>,std::allocator<std::pair<const int,bool> > >::__rb_tree_node*)
00000010 T void __rwstd::__rb_tree<int,std::pair<const int,bool>,__rwstd::__select1st<std:
4

1 に答える 1

0

これは、Solaris のサポート担当者がこの問題について私に語ったことです。

「この問題の回避策は、提供ソース *.i (C++ コンパイル フラグ -P によって生成される) を使用するのではなく、プライマリ ソース *.cpp を使用してオブジェクト モジュール *.o を生成することです。

C++ コンパイル フラグ -P を使用して提供ソースを生成することは、主にインクルード ファイルの展開の情報と診断のために設計されているため、この領域に隠れた欠陥が存在する可能性があることは驚くべきことではありません。」</p>

うーん。これは本当に恐ろしいことです。

于 2012-10-15T18:29:05.117 に答える