2011-10-25 24 views
7

ああ、私はGCCとMACとMakefileの初心者です。今日はMAC OS XおよびGCC 4.4.2を使用してlibにダイナミックに構築するものではなく、.oファイルをリンクする際、コンパイラーは次のように文句を言う:"___emutls_get_address"シンボルとは何ですか?

Undefined symbols: 
    "___emutls_get_address", referenced from: 
     _malloc in michael.o 
     _malloc in michael.o 
ld: symbol(s) not found 

私はこの情報をグーグルが、私は理解できません結果はうまく、私はシンボルが何を意味するのだろうか、なぜ多くのプログラムにこのリンクエラーがあるのだろうかと思います。私もこのエラーの原因であるのだろうか、リンクコマンドは次のとおりです。

g++ -Dx86 -D_GNU_SOURCE -D_REENTRANT -Wall -m32 \ 
    -fno-strict-aliasing -fno-pic -O3 -ggdb \ 
    michael.o malloc_new.o -o libmichael.so \ 
    -lpthread -lm -lstdc++ -shared 
+0

'-lstdC++'と明示的にリンクする必要はありません。g ++は、正しいものを選択する必要があります。それを削除してみてください。 – Mat

答えて

5

このシンボルは、TLS(スレッドローカルストレージ)マックOS X用のgccによるエミュレーションの一部であり、GCCでいくつかのバグですこれについてはbugzilla、例えば:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39888

ダーウィン 上のスレッドローカルストレージ(例えばOpenMPのスレッドプライベート変数)を使用するには、-lgcc_s.so.1または

を参照してください-lgcc_ehのいずれかを介して、手動でTLSのemutlsへのリンクが必要ですスレッド: http://gcc.gnu.org/ml/gcc/2008-12/msg00145.html http://gcc.gnu.org/ml/gcc/2008-12/msg00107.html

これは明らかにかなり混乱しています。しかし、私がちょうど ビットだったので、私はそれが問題を追跡するバグを持っていることが有用であることを望んだ。前述したように、私は手動でgcc_s.so.1またはgcc_ehにリンクしている場合

...

TLSが正常に動作します。

したがって、可能な解決策の1つは、リンクステップに-lgcc_s.so.1または-lgcc_ehオプションを追加することです。そして、gccのバグですので、あなたのgccを更新することです。

+0

私はこれら2つのライブラリを試しましたが、最初のものは見つかりませんでした。 2番目のものを使用した後、emutlsのシンボルが見つかりましたが、GCCは "michael.oの_DescRetireで使用されている絶対アドレス指定(おそらく-mdynamic-no-pic)がスライド可能なイメージでは許可されていないと不満を続けています。 「テキストの遺物を可能にするために」、私はまだそれについて考えていない。 – JustQieTry

+1

JustQieTry、これは '-fno-pic'オプションからのものだと思います。このオプションを使用せずにプロジェクトを再コンパイルしてみてください。 .soライブラリと動的ライブラリをビルドしようとすると、-fpicモードでコンパイルする必要があります。 – osgx

+0

-fpicがオンの場合、別の問題があります。「asm」をリロードしているときに「BREG」クラスのレジスタを見つけることができないと訴えています。デフォルトだから、私はそれをオフに切り替える.......それは間違っていますか? – JustQieTry

関連する問題