Gcc 编译linux内核2.4.0时发生内联程序集错误
我试图在Ubuntu 15.10 32位上编译linux内核2.4.0。我在生成时收到以下错误: linux/include/asm/checksum.h:161:2:错误:缺少“终止”字符 linux/include/asm/checksum.h:173:3:错误:缺少“终止”字符 gcc抱怨的是内联程序集中的引用: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,
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是的,只是尝试学习内核代码,而不是真正使用映像。因为它是更小的代码库。