2012-09-24 95 views
0

我想交叉編譯mongodb到自定義的linux。它使用linux編譯好,但是當使用交叉編譯器工具鏈時,它會抱怨這個代碼。asm中的不可約束

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");

之前也看了看代碼,編譯彙編代碼的其他部分,也類似於。不知道這件事發生了什麼。

請指教這是怎麼回事。

回答

1

嘗試使用__sync_val_compare_and_swap GCC內在這裏。

由於F00F buglock cmpxchg8b是無效的。我猜你正在使用類似i586-linux-gcc工具鏈的東西,因此你正在進入這個奔騰的問題。如果您告訴我們確切的硬件爲您定製的Linux內核

更多的解決方法可以遵循。

+0

'Intel(R)Core(TM)2 Quad Q9300 @ 2.50GHz'64位處理器。 Linux版本3.5.3-1.fc17.i686.PAE(mockbuild @)(gcc版本4.7.0 20120507(Red Hat 4.7.0-5)(GCC)。這是我能得到的唯一信息。不知道如何爲我在這裏一個新手使用__sync_val_compare_and_swap。 –

+0

嘗試使用__sync_val_compare_and_swap編制,已編譯的一段代碼。但最後它抱怨「未定義參考__sync_val_compare_and_swap_8」。不明白爲什麼它在結尾處添加_8有沒有什麼辦法來解決這個提前 –

+0

感謝有對SO答案:http://stackoverflow.com/questions/9329020/undefined-reference-to-sync-val-compare-and-swap-4-error -at編譯-USI –