0

mongodb をカスタム Linux にクロスコンパイルしようとしています。Linux では正常にコンパイルされますが、クロス コンパイラ ツールチェーンを使用すると、このコードについて問題が発生します。

    static T compareAndSwap(volatile T* dest, T expected, T newValue) {
             T result = expected;
             asm volatile ("push %%eax\n\t"
                           "push %%ebx\n\t"
                           "push %%ecx\n\t"
                           "push %%edx\n\t"
                          "mov (%%edx), %%ebx\n\t"
                           "mov 4(%%edx), %%ecx\n\t"
                           "mov (%%edi), %%eax\n\t"
                           "mov 4(%%edi), %%edx\n\t"
                          "lock cmpxchg8b (%%esi)\n\t"
                           "mov %%eax, (%%edi)\n\t"
                          "mov %%edx, 4(%%edi)\n\t"
                        "pop %%edx\n\t"
                           "pop %%ecx\n\t"
                          "pop %%ebx\n\t"
                          "pop %%eax\n"
                          :
                           : "S" (dest),
                             "D" (&result),
                             "d" (&newValue)
                           : "memory", "cc");
             return result;
        }

コンパイルエラーは以下の通りです。

_party/js-1.7 -Isrc/third_party/js-1.7 src/mongo/bson/oid.cpp
src/mongo/platform/atomic_intrinsics_gcc.h: In member function 'void mongo::OID::initSequential()':
src/mongo/platform/atomic_intrinsics_gcc.h:123:44: error: impossible constraint in 'asm'
src/mongo/platform/atomic_intrinsics_gcc.h:123:44: error: impossible constraint in 'asm'
scons: *** [build/linux2/cc_gcc/cxx_toolchain-c++/mongo/bson/oid.o] Error 1
scons: building terminated because of errors.

問題のある行123:44は前の行の終わりです: "memory", "cc");

また、asm コードをコンパイルしたコードの他の部分も同様に見えました。これで何が起こったのかわかりません。

これのどこが悪いのかアドバイスください。

4

1 に答える 1

1

__sync_val_compare_and_swapここでGCC組み込み関数を使用してみてください。

F00Fバグのため、lock cmpxchg8bは無効です。ツールチェーンのようなものを使用しているi586-linux-gccので、このPentiumの問題にすぐに取り掛かっていると思います。

カスタムLinuxカーネルの正確なハードウェアを教えていただければ、さらに回避策が続く可能性があります。

于 2012-09-24T17:46:45.140 に答える