c - asm 中的不可能约束

标签 c mongodb assembly cross-compiling

我正在尝试将 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代码,看起来也类似。不知道这个发生了什么。

请指出这有什么问题。

最佳答案

尝试在此处使用 __sync_val_compare_and_swap GCC 内在函数。

由于F00F bug 锁定 cmpxchg8b 无效。我猜您正在使用诸如 i58​​6-linux-gcc 工具链之类的东西,因此您会直接陷入奔腾的问题。

如果您告诉我们您的自定义 Linux 内核的确切硬件,可能会出现更多解决方法。

关于c - asm 中的不可能约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12568225/

相关文章:

c - autotools,如果找不到交叉编译器如何失败

C 和 SDL 退出函数

mongodb - mongodb删除的收集在mongodump和mongorestore之后继续返回

java - 如何在spring-boot中使用具有多个数据库的Mongodb单实例

java - 高级语言(例如Java)和汇编语言之间的关系?

assembly - 了解近调用指令编码

c - 如何确定指针是否等于数组的元素?

c - 如何使用 _spawnvp() 避免空间 split 和引用删除

node.js - 使用 Mongoose 将平面数据转换为 mongodb 中的层次结构

macos - 在 x64 ASM 中循环并打印 argv[]