【发布时间】:2012-05-13 08:35:57
【问题描述】:
我正在尝试编译早期版本的 Linux,您可以从 git://github.com/azru0512/linux-0.12.git 下载源代码。在编译 ''kernel/blk_drv/ramdisk.c'' 时,我收到以下错误消息,
ramdisk.c:36:10: error: can't find a register in class 'CREG' while reloading 'asm'
ramdisk.c:40:10: error: can't find a register in class 'CREG' while reloading 'asm'
ramdisk.c:36:10: error: 'asm' operand has impossible constraints
ramdisk.c:40:10: error: 'asm' operand has impossible constraints
ramdisk.c 中有什么,
if (CURRENT-> cmd == WRITE) {
(void) memcpy(addr,
CURRENT->buffer,
len);
} else if (CURRENT->cmd == READ) {
(void) memcpy(CURRENT->buffer,
addr,
len);
} else
panic("unknown ramdisk-command");
memcpy 是,
extern inline void * memcpy(void * dest,const void * src, int n)
{
__asm__("cld\n\t"
"rep\n\t"
"movsb"
::"c" (n),"S" (src),"D" (dest)
:"cx","si","di");
return dest;
}
我猜这是 memcpy (include/string.h) 内联 asm 问题,所以我从中删除了 clobber 列表,但没有运气。你能帮我找出问题所在吗?谢谢!
【问题讨论】:
-
显示 ramdisk.c 第 36-40 行及周边代码会有所帮助
-
我删除了clobber列表。不确定您的意思是“打开优化”,但我尝试 -O[0..3] 没有运气。如果我删除内联前缀,那么我会收到“'memcpy' 的多重定义”错误。
-
memcpy 已经在标头中,即include/string.h。
-
对不起,我错了:定义属于 *.c 源文件,在标题中只应保留声明
void * memcpy(void * dest,const void * src, int n);
标签: gcc assembly x86 inline-assembly