linux-2.6.9 kernel 内核成功编译

本文记录了在Fedora系统上编译Linux 2.6.9内核过程中遇到的错误及解决方法。在make menuconfig配置后,遇到了与`mov`指令相关的汇编错误,通过下载并应用特定补丁解决。接着在编译过程中,修复了`i2c.h`和`bttv-driver.c`文件中的数组类型不完整警告和错误。之后,处理了hamradio驱动中的跳转语句错误,并应用相应补丁。在编译acenic.c驱动时,修正了函数声明和指针类型的警告。最后解决了atyfb_base.c中fb.h头文件的错误。经过这些修复,内核编译最终成功。

1——进入fedora
将官网上下载的linux2.6.9kernel压缩包拷贝到 /usr/src下面


2——
解压kernel

3——
命令make menuconfig 进行默认配置


4——
出现如下错误
{standard input}: Assembler messages:
{standard input}:1340: Error: suffix or operands invalid for `mov'
{standard input}:1342: Error: suffix or operands invalid for `mov'
{standard input}:1673: Error: suffix or operands invalid for `mov'
{standard input}:1675: Error: suffix or operands invalid for `mov'
{standard input}:1779: Error: suffix or operands invalid for `mov'
{standard input}:1780: Error: suffix or operands invalid for `mov'
{standard input}:1962: Error: suffix or operands invalid for `mov'
{standard input}:1964: Error: suffix or operands invalid for `mov'
{standard input}:2092: Error: suffix or operands invalid for `mov'
{standard input}:2105: Error: suffix or operands invalid for `mov'
make[1]: *** [arch/i386/kernel/process.o]
错误 1
make: *** [arch/i386/kernel]
错误
2
是一个
bug
可到网址http://www.kernel.org/pub/linux/devel/binutils/下载
linux-2.6-seg-5.patch
安装补丁

[root@localhost linux-2.6.9]# patch -p1 < ../linux-2.6-seg-5.patch
patching file arch/i386/kernel/process.c
Hunk #1 succeeded at 574 (offset -23 lines).
patching file arch/i386/kernel/vm86.c
Hunk #1 succeeded at 300 (offset 6 lines).
patching file arch/x86_64/kernel/process.c
Hunk #1 succeeded at 370 (offset -21 lines).
Hunk #3 succeeded at 451 (offset -21 lines).
patching file include/asm-i386/system.h

5——
继续make出现如下错误
In file included from drivers/i2c/algos/i2c-algo-bit.c:32:
include/linux/i2c.h:58:
错误:数组元素的类型不完全
include/linux/i2c.h:205:
错误:数组元素的类型不完全
drivers/i2c/algos/i2c-algo-bit.c: In function ‘sendbytes’:
drivers/i2c/algos/i2c-algo-bit.c:337:
警告:初始化指针时目标与指针有/无符号不一致
drivers/i2c/algos/i2c-algo-bit.c: In function ‘readbytes’:
drivers/i2c/algos/i2c-algo-bit.c:370:
警告:初始化指针时目标与指针有/无符号不一致
make[3]: *** [drivers/i2c/algos/i2c-algo-bit.o]
错误 1
make[2]: *** [drivers/i2c/algos]
错误
2
make[1]: *** [drivers/i2c]
错误
2
make: *** [drivers]
错误
2

58

extern int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],int num);
改为
extern int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msg,int num);
205
int (*master_xfer)(struct i2c_adapter *adap,struct i2c_msg msgs[],
改为
int (*master_xfer)(struct i2c_adapter *adap,struct i2c_msg *msgs,

6——
继续make出现如下错误
In file included from drivers/media/video/bttv-driver.c:40:
drivers/media/video/bttvp.h:254:
错误:数组元素的类型不完全
drivers/media/video/bttv-driver.c: In function ‘set_pll’:
drivers/media/video/bttv-driver.c:746:
警告:计算出的值未被使用
drivers/media/video/bttv-driver.c: In function ‘bttv_common_ioctls’:
drivers/media/video/bttv-driver.c:1676:
警告:传递参数 1 (属于 ‘sprintf’) 给指针时目标与指针有/无符号不一致
drivers/media/video/bttv-driver.c:1680:
警告:传递参数 1 (属于 ‘sprintf’) 给指针时目标与指针有/无符号不一致
drivers/media/video/bttv-driver.c:1682:
警告:传递参数 1 (属于 ‘sprintf’) 给指针时目标与指针有/无符号不一致
drivers/media/video/bttv-driver.c:1724:
警告:传递参数 1 (属于 ‘strcpy’) 给指针时目标与指针有/无符号不一致
drivers/media/video/bttv-driver.c: In function ‘bttv_do_ioctl’:
drivers/media/video/bttv-driver.c:2530:
警告:传递参数 1 (属于 ‘strcpy’) 给指针时目标与指针有/无符号不一致
drivers/media/video/bttv-driver.c:2531:
警告:传递参数 1 (属于 ‘strlcpy’) 给指针时目标与指针有/无符号不一致
drivers/media/video/bttv-driver.c:2532:
警告:传递参数 1 (属于 ‘sprintf’) 给指针时目标与指针有/无符号不一致
drivers/media/video/bttv-driver.c:2561:
警告:传递参数 1 (属于 ‘strcpy’) 给指针时目标与指针有/无符号不一致
drivers/media/video/bttv-driver.c:2590:
警告:传递参数 1 (属于 ‘strlcpy’) 给指针时目标与指针有/无符号不一致
make[3]: *** [drivers/media/video/bttv-driver.o]
错误 1
make[2]: *** [drivers/media/video]
错误
2
make[1]: *** [drivers/media]
错误
2
make: *** [drivers]
错误
2
用下面这个补丁

diff -u linux-2.6.12-mm1/drivers/media/video/bttvp.h linux/drivers/media/video/bttvp.h
--- linux-2.6.12-mm1/drivers/media/video/bttvp.h 2005-06-21 02:52:57.000000000 -0300
+++ linux/drivers/media/video/bttvp.h 2005-06-22 01:04:06.000000000 -0300
@@ -1,5 +1,5 @@
/*
- $Id: bttvp.h,v 1.17 2005/02/16 12:14:10 kraxel Exp $
+ $Id: bttvp.h,v 1.19 2005/06/16 21:38:45 nsh Exp $

bttv - Bt848 frame grabber driver

@@ -226,11 +226,6 @@
#define dprintk if (bttv_debug >= 1) printk
#define d2printk if (bttv_debug >= 2) printk

-/* our devices */
-#define BTTV_MAX 16
-extern unsigned int bttv_num;
-extern struct bttv bttvs[BTTV_MAX];
-
#define BTTV_MAX_FBUF 0x208000
#define VBIBUF_SIZE (2048*VBI_MAXLINES*2)
#define BTTV_TIMEOUT (HZ/2) /* 0.5 seconds */
@@ -331,6 +326,9 @@
int opt_vcr_hack;
int opt_whitecrush_upper;
int opt_whitecrush_lower;
+ int opt_uv_ratio;
+ int opt_full_luma_range;
+ int opt_coring;

/* radio data/state */
int has_radio;
@@ -377,6 +375,11 @@
struct bttv_fh init;
};

+/* our devices */
+#define BTTV_MAX 16
+extern unsigned int bttv_num;
+extern struct bttv bttvs[BTTV_MAX];
+
/* private ioctls */
#define BTTV_VERSION _IOR('v' , BASE_VIDIOCPRIVATE+6, int)
#define BTTV_VBISIZE _IOR('v' , BASE_VIDIOCPRIVATE+8, int)
diff -u linux-2.6.12-mm1/drivers/media/video/bttv-driver.c linux/drivers/media/video/bttv-driver.c
--- linux-2.6.12-mm1/drivers/media/video/bttv-driver.c 2005-06-21 02:52:57.000000000 -0300
+++ linux/drivers/media/video/bttv-driver.c 2005-06-22 01:04:06.000000000 -0300

7——
继续make出现如下错误
drivers/net/hamradio/baycom_epp.c: In function ‘encode_hdlc’:
drivers/net/hamradio/baycom_epp.c:450:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:459:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:451:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:460:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:452:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:461:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:453:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:462:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:454:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:463:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:455:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:464:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:456:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:465:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:457:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:466:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:466:
警告:标号 ‘encodeend7’ 定义后未使用
drivers/net/hamradio/baycom_epp.c:465:
警告:标号 ‘encodeend6’ 定义后未使用
drivers/net/hamradio/baycom_epp.c:464:
警告:标号 ‘encodeend5’ 定义后未使用
drivers/net/hamradio/baycom_epp.c:463:
警告:标号 ‘encodeend4’ 定义后未使用
drivers/net/hamradio/baycom_epp.c:462:
警告:标号 ‘encodeend3’ 定义后未使用
drivers/net/hamradio/baycom_epp.c:461:
警告:标号 ‘encodeend2’ 定义后未使用
drivers/net/hamradio/baycom_epp.c:460:
警告:标号 ‘encodeend1’ 定义后未使用
drivers/net/hamradio/baycom_epp.c:459:
警告:标号 ‘encodeend0’ 定义后未使用
drivers/net/hamradio/baycom_epp.c: In function ‘receive’:
drivers/net/hamradio/baycom_epp.c:692:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:701:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:701:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:701:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:692:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:701:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:693:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:702:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:702:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:702:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:693:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:702:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:694:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:703:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:703:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:703:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:694:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:703:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:695:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:704:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:704:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:704:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:695:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:704:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:696:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:705:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:705:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:705:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:696:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:705:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:697:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:706:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:706:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:706:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:697:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:706:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:698:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:707:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:707:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:707:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:698:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:707:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:699:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:708:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:708:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:708:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:699:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:708:
错误:跳转至语句表达式中
drivers/net/hamradio/baycom_epp.c:708:
警告:标号 ‘enditer7’ 定义后未使用
drivers/net/hamradio/baycom_epp.c:707:
警告:标号 ‘enditer6’ 定义后未使用
drivers/net/hamradio/baycom_epp.c:706:
警告:标号 ‘enditer5’ 定义后未使用
drivers/net/hamradio/baycom_epp.c:705:
警告:标号 ‘enditer4’ 定义后未使用
drivers/net/hamradio/baycom_epp.c:704:
警告:标号 ‘enditer3’ 定义后未使用
drivers/net/hamradio/baycom_epp.c:703:
警告:标号 ‘enditer2’ 定义后未使用
drivers/net/hamradio/baycom_epp.c:702:
警告:标号 ‘enditer1’ 定义后未使用
drivers/net/hamradio/baycom_epp.c:701:
警告:标号 ‘enditer0’ 定义后未使用
make[3]: *** [drivers/net/hamradio/baycom_epp.o]
错误 1
make[2]: *** [drivers/net/hamradio]
错误
2
make[1]: *** [drivers/net]
错误
2
make: *** [drivers]
错误
2

用下面这个补丁

--- linux-vanilla/drivers/net/hamradio/baycom_epp.c 2005-05-27 12:58:48.000000000 +0400
+++ linux-gcc4/drivers/net/hamradio/baycom_epp.c    2005-05-27 17:54:14.000000000 +0400
@@ -380,22 +380,18 @@ static inline void do_kiss_params(struct
  */
 
 #define ENCODEITERA(j)                         /
-({                                             /
         if (!(notbitstream & (0x1f0 << j)))    /
                 goto stuff##j;                 /
-  encodeend##j:        ;                      /
-})
+  encodeend##j:        ;
 
 #define ENCODEITERB(j)                                          /
-({                                                              /
   stuff##j:                                                     /
         bitstream &= ~(0x100 << j);                             /
         bitbuf = (bitbuf & (((2 << j) << numbit) - 1)) |        /
                 ((bitbuf & ~(((2 << j) << numbit) - 1)) << 1);  /
         numbit++;                                               /
         notbitstream = ~bitstream;                              /
-        goto encodeend##j;                                      /
-})
+        goto encodeend##j;
 
 
 static void encode_hdlc(struct baycom_state *bc)
@@ -611,16 +607,13 @@ static void do_rxpacket(struct net_devic
 }
 
 #define DECODEITERA(j)                                                        /
-({                                                                            /
         if (!(notbitstream & (0x0fc << j)))              /* flag or abort */  /
                 goto flgabrt##j;                                              /
         if ((bitstream & (0x1f8 << j)) == (0xf8 << j))   /* stuffed bit */    /
                 goto stuff##j;                                                /
-  enditer##j:      ;                                                           /
-})
+  enditer##j:      ;
 
 #define DECODEITERB(j)                                                                 /
-({                                                                                     /
   flgabrt##j:                                                                          /
         if (!(notbitstream & (0x1fc << j))) {              /* abort received */        /
                 state = 0;                                                             /
@@ -638,8 +631,7 @@ static void do_rxpacket(struct net_devic
   stuff##j:                                                                            /
         numbits--;                                                                     /
         bitbuf = (bitbuf & ((~0xff) << j)) | ((bitbuf & ~((~0xff) << j)) << 1);        /
-        goto enditer##j;                                                               /
-})
+        goto enditer##j;
        
 static int receive(struct net_device *dev, int cnt)
 {

8——
继续make出现如下错误
drivers/net/acenic.c: In function ‘acenic_probe_one’:
drivers/net/acenic.c:489:
错误:函数 ‘ace_watchdog’ 的存储类无效
drivers/net/acenic.c:490:
错误:‘ace_watchdog’ 未声明 (在此函数内第一次使用)
drivers/net/acenic.c:490:
错误:(即使在一个函数内多次出现,每个未声明的标识符在其

drivers/net/acenic.c:490:
错误:所在的函数内只报告一次。)
drivers/net/acenic.c: In function ‘ace_init’:
drivers/net/acenic.c:1325:
警告:传递参数 2 (属于 ‘writel’)时将整数赋给指针,未作类型转换

drivers/net/acenic.c: In function ‘ace_copy’:
drivers/net/acenic.c:2941:
警告:传递参数 2 (属于 ‘writel’)时将整数赋给指针,未作类型转换
drivers/net/acenic.c: In function ‘ace_clear’:
drivers/net/acenic.c:2968:
警告:传递参数 2 (属于 ‘writel’)时将整数赋给指针,未作类型转换
make[2]: *** [drivers/net/acenic.o]
错误 1
make[1]: *** [drivers/net]
错误
2
make: *** [drivers]
错误
2
用下面这个补丁


--- 25/drivers/net/acenic.c~gcc4-fixes  Fri Dec 10 15:22:35 2004
+++ 25-akpm/drivers/net/acenic.c    Fri Dec 10 15:22:35 2004
@@ -457,6 +457,8 @@ static struct ethtool_ops ace_ethtool_op
    .get_drvinfo = ace_get_drvinfo,
 };
 
+static void ace_watchdog(struct net_device *dev);
+
 static int __devinit acenic_probe_one(struct pci_dev *pdev,
        const struct pci_device_id *id)
 {
@@ -485,7 +487,6 @@ static int __devinit acenic_probe_one(st
    dev->vlan_rx_kill_vid = ace_vlan_rx_kill_vid;
 #endif
    if (1) {
-       static void ace_watchdog(struct net_device *dev);
        dev->tx_timeout = &ace_watchdog;
        dev->watchdog_timeo = 5*HZ;
    }

9——
继续make出现如下错误
In file included from drivers/video/aty/atyfb_base.c:60:
include/linux/fb.h:751:
错误:数组元素的类型不完全
In file included from drivers/video/aty/atyfb_base.c:70:
drivers/video/aty/atyfb.h: In function ‘aty_ld_le32’:
drivers/video/aty/atyfb.h:136:
警告:传递参数 1 (属于 ‘readl’)时将整数赋给指针,未作类型转换
drivers/video/aty/atyfb.h: In function ‘aty_st_le32’:
drivers/video/aty/atyfb.h:150:
警告:传递参数 2 (属于 ‘writel’)时将整数赋给指针,未作类型转换
drivers/video/aty/atyfb.h: In function ‘aty_ld_8’:
drivers/video/aty/atyfb.h:162:
警告:传递参数 1 (属于 ‘readb’)时将整数赋给指针,未作类型转换
drivers/video/aty/atyfb.h: In function ‘aty_st_8’:
drivers/video/aty/atyfb.h:176:
警告:传递参数 2 (属于 ‘writeb’)时将整数赋给指针,未作类型转换
make[3]: *** [drivers/video/aty/atyfb_base.o]
错误 1
make[2]: *** [drivers/video/aty]
错误
2
make[1]: *** [drivers/video]
错误
2
make: *** [drivers]
错误
2


用下面这个补丁

===== include/linux/fb.h 1.94 vs edited =====
--- 1.94/include/linux/fb.h 2005-01-20 23:01:17 -06:00
+++ edited/include/linux/fb.h 2005-02-15 11:38:28 -06:00
@@ -862,7 +862,6 @@
 
 /* drivers/video/modedb.c */
 #define VESA_MODEDB_SIZE 34
-extern const struct fb_videomode vesa_modes[];
 extern void fb_var_to_videomode(struct fb_videomode *mode,
                                 struct fb_var_screeninfo *var);
 extern void fb_videomode_to_var(struct fb_var_screeninfo *var,
@@ -906,6 +905,8 @@
         u32 vmode;
         u32 flag;
 };
+
+extern const struct fb_videomode vesa_modes[];
 
 struct fb_modelist {
         struct list_head list;

-

10——
然后make ok
[root@localhost linux-2.6.9]# make
  CHK     include/linux/version.h
make[1]: “arch/i386/kernel/asm-offsets.s”
是最新的。
  CHK     include/asm-i386/asm_offsets.h
  CHK     include/linux/compile.h
Kernel: arch/i386/boot/bzImage is ready
  Building modules, stage 2.
  MODPOST


11——
然后make modules_install
成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值