簡體   English   中英

編譯linux 0.0.1 =>錯誤:'asm'操作數具有不可能的約束__asm __(“ cld \\ n”

[英]compiling linux 0.0.1 => error: ‘asm’ operand has impossible constraints __asm__(“cld\n”

我正在嘗試從我的64位Intel計算機上的源代碼編譯linux內核0.0.1。 只是為了填寫引導程序和主程序,我不得不修改所有makefile以獲得32位編譯。

因此,這是make的輸出:

In file included from traps.c:7:0:
../include/string.h:128:22: warning: conflicting types for built-in function ‘strchr’
 extern inline char * strchr(const char * s,char c)
                      ^
../include/string.h:145:22: warning: conflicting types for built-in function ‘strrchr’
 extern inline char * strrchr(const char * s,char c)
                      ^
../include/string.h:379:22: warning: conflicting types for built-in function ‘memchr’
 extern inline void * memchr(const void * cs,char c,int count)
                      ^
../include/string.h:395:22: warning: conflicting types for built-in function ‘memset’
 extern inline void * memset(void * s,char c,int count)
                      ^
In file included from traps.c:11:0:
../include/linux/kernel.h:5:1: warning: function return types not compatible due to ‘volatile’
 volatile void panic(const char * str);
 ^
../include/linux/kernel.h:5:1: warning: function return types not compatible due to ‘volatile’
../include/linux/kernel.h:5:1: warning: function return types not compatible due to ‘volatile’
In file included from traps.c:7:0:
../include/string.h: In function ‘strcpy’:
../include/string.h:29:1: error: ‘asm’ operand has impossible constraints
 __asm__("cld\n"
 ^
Makefile:24: set di istruzioni per l'obiettivo "traps.o" non riuscito

string.h的代碼部分如下:

extern inline char * strcpy(char * dest,const char *src)
{
__asm__("cld\n"
    "1:\tlodsb\n\t"
    "stosb\n\t"
    "testb %%al,%%al\n\t"
    "jne 1b"
    ::"S" (src),"D" (dest):"si","di","ax");
return dest;
}

我不知道為什么原始代碼無法編譯。 到目前為止,我已成功編譯:boot和init子目錄。

非常感謝

我認為問題在於寄存器緩沖區列表與輸入重疊。

也就是說, "S"代表寄存器esi"D"代表寄存器edi 但隨后的清單列表包含"si""di" ,它們是這些寄存器的低16位。 也許舊的GCC版本忽略了這一點,但是新版本不允許重疊。

這里文檔

垃圾描述可能不會與輸入或輸出操作數重疊。

解決方案,只需將它們從列表中刪除:

...
::"S" (src),"D" (dest) :"ax", "cc");

順便說一句,我也將“ Cb "cc"添加到了"cc"因為該程序集修改了e標志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM