Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 编译linux内核2.4.0时发生内联程序集错误_Gcc_Assembly_Linux Kernel_Inline Assembly - Fatal编程技术网

Gcc 编译linux内核2.4.0时发生内联程序集错误

Gcc 编译linux内核2.4.0时发生内联程序集错误,gcc,assembly,linux-kernel,inline-assembly,Gcc,Assembly,Linux Kernel,Inline Assembly,我试图在Ubuntu 15.10 32位上编译linux内核2.4.0。我在生成时收到以下错误: linux/include/asm/checksum.h:161:2:错误:缺少“终止”字符 linux/include/asm/checksum.h:173:3:错误:缺少“终止”字符 gcc抱怨的是内联程序集中的引用: static __inline__ unsigned short int csum_ipv6_magic(struct in6_addr *saddr,

我试图在Ubuntu 15.10 32位上编译linux内核2.4.0。我在生成时收到以下错误:

linux/include/asm/checksum.h:161:2:错误:缺少“终止”字符 linux/include/asm/checksum.h:173:3:错误:缺少“终止”字符

gcc抱怨的是内联程序集中的引用:

static __inline__ unsigned short int csum_ipv6_magic(struct in6_addr *saddr,
                                                     struct in6_addr *daddr,
                                                     __u32 len,
                                                     unsigned short proto,
                                                     unsigned int sum)
{
        __asm__("
                addl 0(%1), %0 //line 162
                adcl 4(%1), %0
                adcl 8(%1), %0
                adcl 12(%1), %0
                adcl 0(%2), %0
                adcl 4(%2), %0
                adcl 8(%2), %0
                adcl 12(%2), %0
                adcl %3, %0
                adcl %4, %0
                adcl $0, %0
                "                    // line 173
                : "=&r" (sum)
                : "r" (saddr), "r" (daddr),
                  "r"(htonl(len)), "r"(htonl(proto)), "0"(sum));

        return csum_fold(sum);
}
我不知道为什么会这样。是因为gcc版本不兼容吗?我当前的gcc版本是
gcc(Ubuntu 5.2.1-22ubuntu2)5.2.1 20151010。

最近的gcc不支持多行字符串文本。内核的较新版本(2.4.0很古老!)有:

    asm("addl 0(%1), %0     ;\n"
        "adcl 4(%1), %0     ;\n"
等。例如,它曾在中得到支撑,但在中移除了支撑:

预处理器不再接受多行字符串文字。它们在3.0、3.1和3.2中被弃用


最近的gcc不支持多行字符串文字。内核的较新版本(2.4.0很古老!)有:

    asm("addl 0(%1), %0     ;\n"
        "adcl 4(%1), %0     ;\n"
等。例如,它曾在中得到支撑,但在中移除了支撑:

预处理器不再接受多行字符串文字。它们在3.0、3.1和3.2中被弃用


您能指出第161行和第173行吗?为什么在头文件中有代码实现?每个指令周围不应该有开始和结束引号吗?例如,
“添加0(%1),%0\n\t”
,等等@WeatherVane刚刚添加了行号注释。这是linux内核源代码2.4.0,不是我写的。因为它是内联函数,所以我认为在头文件中是正常的。@Michael,我也很困惑。所以我不确定它是否是一些旧的gcc语法。这是生产linux内核代码,所以我不认为这是某种错误。@Marglisse是的,只是尝试学习内核代码,而不是真正使用映像。因为它是较小的代码库。请您指出第161行和第173行是什么?为什么在头文件中有代码实现?每个指令周围不应该有开始和结束引号吗?例如,
“添加0(%1),%0\n\t”
,等等@WeatherVane刚刚添加了行号注释。这是linux内核源代码2.4.0,不是我写的。因为它是内联函数,所以我认为在头文件中是正常的。@Michael,我也很困惑。所以我不确定它是否是一些旧的gcc语法。这是生产linux内核代码,所以我不认为这是某种错误。@Marglisse是的,只是尝试学习内核代码,而不是真正使用映像。因为它是更小的代码库。