Debian linux编译失败:asm不可能约束

时间:2012-07-24 04:11:41

标签: gcc linux-kernel inline-assembly

这是一个我不知道从哪里开始的区域。 我正在尝试编译使用G3Dlite的二进制文件。 我已经遇到过一个未定义的“__decl”我必须定义,因为platform.h中没有定义。 之后,编译器停止了此错误:

./dep/include/g3dlite/G3D/AtomicInt32.h:124:44: error: impossible constraint in ‘asm’

第124行在此功能中:

 /** Returns zero if the result is zero after decrement, non-zero otherwise.*/
int32 decrement() {
    #if defined(G3D_WIN32)
        // Note: returns the newly decremented value
        return InterlockedDecrement(&m_value);
        #elif defined(G3D_LINUX)  || defined(G3D_FREEBSD)
        unsigned char nz;

        asm volatile ("lock; decl %1;\n\t"
                      "setnz %%al"
                      : "=a" (nz)
                      : "m" (m_value)
                      : "memory", "cc");
        return nz;
   #elif defined(G3D_OSX)
        // Note: returns the newly decremented value
        return OSAtomicDecrement32(&m_value);
   #endif
}

我不确定linux上的问题是什么。这个代码在其他平台上检查并编译得很好,所以我想知道这是g3d代码还是本地操作系统的问题。

arcemu@raspberrypi ~ $ uname -a && gcc --version && cmake --version
Linux raspberrypi 3.1.9+ #168 PREEMPT Sat Jul 14 18:56:31 BST 2012 armv6l GNU/Linux
gcc (Debian 4.6.3-8+rpi1) 4.6.3
cmake version 2.8.9-rc1

我已经阅读了一些相关的帖子,这些帖子似乎表明“修改”的内容不再受支持了。

有人能指出一个开始排除故障的好地方吗?

感谢。

1 个答案:

答案 0 :(得分:4)

输出约束指定x86寄存器(EAX),这在arm cpu上是不可能的。此外,锁定前缀是特定于x86的平台,并且arm上也不支持decl和setnz指令。

这是输出约束:

    : "=a" (nz)

告诉gcc使用寄存器eax来保存结果,然后将其复制到变量 nz

相关问题