3

Cygwinで構築したcrosstoolスクリプトを使用して、Sparcアーキテクチャ用に次のコンパイラgcc-4.1.1および4.2.0 20061024(プレリリース)を作成しました。

$ ./sparc-unknown-linux-gnu-gcc -v
Using built-in specs.
Target: sparc-unknown-linux-gnu
Configured with: /crosstool-0.43/build/sparc-unknown-linux-gnu/gcc-4.1.1-glibc-2.3.6/gcc-4.1.1/configure --target=sparc-unknown-linux-gnu --host=i686-host_pc-cygwin --prefix=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu --with-headers=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-gnu/include --with-local-prefix=/opt/crosstool/gcc-4.1.1-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-gnu --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.1.1

$ ./sparc-unknown-linux-gnu-gcc -v
Using built-in specs.
Target: sparc-unknown-linux-gnu
Configured with: /crosstool-0.43/build/sparc-unknown-linux-gnu/gcc-4.2-20061024-                           glibc-2.3.6/gcc-4.2-20061024/configure --target=sparc-unknown-linux-gnu --host=i                           686-host_pc-cygwin --prefix=/opt/crosstool/gcc-4.2-20061024-glibc-2.3.6/sparc-un                           known-linux-gnu --with-headers=/opt/crosstool/gcc-4.2-20061024-glibc-2.3.6/sparc                           -unknown-linux-gnu/sparc-unknown-linux-gnu/include --with-local-prefix=/opt/cros                           stool/gcc-4.2-20061024-glibc-2.3.6/sparc-unknown-linux-gnu/sparc-unknown-linux-g                           nu --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atex                           it --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.2.0 20061024 (prerelease)

私にとっては、4.1。*バージョンのgccをサポートするAtomic-__sync_val_compare_and_swap Builtinsに関連するプログラム機能で使用できる必要があります。

単純なCコードをコンパイルしようとしています。

long cmpxchg( long* value, long comp_val, long new_val )
{
    return __sync_val_compare_and_swap( value, comp_val, new_val );
}

int main()
{
    return 0;
}

しかし、次のエラーがあります:(両方のコンパイラで)::

$ ./sparc-unknown-linux-gnu-gcc test_cas.c -o test_cas
/tmp/ccREXHsP.o: In function `cmpxchg':
test_cas.c:(.text+0x24): undefined reference to `__sync_val_compare_and_swap_4'
collect2: ld returned 1 exit status

どうしたの?ビルドされたコンパイラが間違っている可能性がありますか?Sparcアーキテクチャ(SPARC v8)がこの機能をサポートしていない可能性がありますか?私は別のプログラムをコンパイルしようとしました-すべて良い(コンパイルされ実行された)。

4

5 に答える 5

6

ここで説明するように:http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html __sync_val_compare_and_swap一部のターゲットでは、関数呼び出しが発生します(直接コード生成が利用できないか、まだ実装されていない場合) )。それはあなたの場合に起こっています。それ自体が問題ではないと仮定すると、次に、定義しているライブラリ__sync_val_compare_and_swap_4とフレンドをリンクする必要があります。これはlibgcc_s-lgcc_sだと思います(リンク行に追加してください)。

于 2012-02-17T13:32:07.403 に答える
2

関連するgccバグがあるようです:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40134

たぶん新しいgccを試してみませんか?

于 2012-02-27T10:56:36.210 に答える
2

ARMv5プラットフォームでNodeJS(V8エンジンに基づく)をコンパイルするときに、同様の問題に遭遇しました。

基本的に、古いバージョンを使用しているか、これらの関数がプラットフォームにまだ実装されていないため、GCCにはこの組み込み関数がないため、「-lgcc_s」は役に立たない場合があります。

Googleを何時間も使った後、このブログページ(http://vincesoft.blogspot.fr/2012/04/how-to-solve-undefined-reference-to.html)を見つけました。このページでは、原因がかなり明確に説明されており、解決策が示されています。 :

GCCコードからこれらの関数を使用してプラットフォームのソースコードを取得し、コードをライブラリにビルドしてインストールし、アプリケーションをこのライブラリにリンクします。

私はこのブログで説明されている正確な手順には従いませんでしたが、考え方は同じであり、機能します。

それが役に立てば幸い。

于 2013-10-06T14:41:34.177 に答える
0

Androidでは、次のフラグを使用して問題を解決できました。LOCAL_CFLAGS + = -O3 -fopenmp LOCAL_LDFLAGS + = -O3 -fopenmp -lgcc -latomic -lgomp

于 2015-04-07T19:06:27.477 に答える
0

私にとって、上記の失敗は「gcc / mingwクロスコンパイラを使用しているため、-march = nativeは機能しない」ことを意味していました(私は推測します)。https://stackoverflow.com/a/24213278/32453を参照してください(基本的には、-march設定を手動で指定することで回避できます)。

于 2016-06-28T20:15:30.677 に答える