歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> RedHat as4 gcc 3.4編譯2.6.31 內核編譯以及遇到的問題和錯誤

RedHat as4 gcc 3.4編譯2.6.31 內核編譯以及遇到的問題和錯誤

日期:2017/2/28 16:36:37   编辑:Linux教程

gcc4.4.1版本編譯linux 2.6.31版本沒有錯誤,但是gcc3.4編譯會有若干問題,步驟、問題和解決方案,匯總如下:

內核的編譯流程

1.到官方網站下載內核

2、解壓

#tar -jxvf linux-2.6.31.tar.bz2
然後移動解壓後的文件到 /usr/src
#mv linux-2.6.31 /usr/src
#cd /usr/src/linux-2.6.31
如果怕之前已經有人編譯過核心,會產生一些.o的目的檔案,所以先執行:
#make mrproper
會顯示RM去除檔案的訊息
3、如果對同一版本內核編譯,要修改一下:
#cd /lib/modules
#mv 2.4.18 2.4.18.old
4、設定編譯模式:
make config :這種模式需要逐行輸入所需要設定的項目,無法往前修改設定,所以目前很少使用這種方式來設定 Kernel 的項目了;
make xconfig :這種模式則是使用 X-Window 為主要環境的設定模式!除非你有 X-Window 在執行,否則沒有辦法使用這種模式;
make menuconfig :這種模式有點像是文字界面的選單模式,較為簡便,而且可以在純文字界面下面執行編輯動作!是目前最常使用的模式。

#make menuconfig :這裡我默認 就是最下面的保存然後退出 由於本人菜蛋 不知道怎麼設置 希望高手指點。

       

# make clean        <==將舊的資料去除掉!

#make
# make bzImage       <==開始編譯核心!這個核心是經過壓縮的 (30分鐘左右)
# make modules       <==開始編譯模塊!這個動作視您剛剛編譯的模塊數量!(1小時左右)
# make modules_install   <==將資料給他安裝在 /lib/modules/`uname -r` 裡面
# make install       <==將剛剛 bzImage 建立完成的核心給他安裝上來! 別忘了這步第一次我忘了又重新編了一遍浪費了2個多小時

#sudo mkinitramfs -o /boot/initrd.img-2.6.31 /lib/modules/2.6.31 生成initrd.img,關於mkinitramfs的其他參數,請參考man mkinitramfs。
5、修改grub:(兩種方法)

1) #sduo update-grub
2) #vi /boot/grub/menu.lst
如果編譯成功會自動添加 title Fedora (2.6.31)是我新內核 修改default 如果你要用第一個內核就改 default=0 第二個是 1 依次類推。。。
default=0
timeout=0
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Fedora (2.6.31)
root (hd0,0)
kernel /vmlinuz-2.6.31 ro root=UUID=b75809ed-8353-4679-bfe4-e5686f3d6b18 rhgb quiet
initrd /initrd-2.6.31.img

在內核編譯過程中出現了一些錯誤,下面是引用的別人的錯誤處理方法

1. 下載內核後開始編譯,開始按照網絡上的步驟來編譯,編譯問題出現3個錯誤。

錯誤提示 1

drivers/built-in.o(.init.text+0x3bad): In function `con_init':

include/trace/events/kmem.h:47: undefined reference to `.L1452'

解決:

vi /usr/src/linux/drivers/char/vt.c

刪除以下行 ( 第 2875 行 )

vc_cons[currcons].d = vc = kzalloc(sizeof(struct vc_data), GFP_NOWAIT);

在相同位置添加 :

vc_cons[currcons].d = vc = alloc_bootmem(sizeof(struct vc_data));

錯誤提示 2

drivers/char/vt.c: In function `con_init':

drivers/char/vt.c:2875: error: implicit declaration of function `alloc_bootmem'

drivers/char/vt.c:2875: warning: assignment makes pointer from integer without a cast

原因: vt.c 中引用了 alloc_bootmem ,但是找不到相關 .h 定義文件或沒有在相關的頭文件 .h 中定義

解決:

# vi /usr/src/linux/drivers/char/vt.c ,添加以下這行:

#include <linux/bootmem.h>

錯誤提示 3

drivers/message/fusion/mptsas.c: In function `mptsas_port_delete':

drivers/message/fusion/mptsas.c:105: sorry, unimplemented: inlining failed in call to 'mptsas_set_rphy': function body not available

drivers/message/fusion/mptsas.c:467: sorry, unimplemented: called from here

原因:

mptsas_port_delete 中引用了 mptsas_set_rphy ,但 mptsas_set_rphy 的定義卻在 mptsas_port_delete 之後。

解決:

vi /usr/src/linux/drivers/message/fusion/mptsas.c ,將 mptsas_set_rphy 的定義(第 483 行起)移動到mptsas_port_delete 的定義(第 446 行)前面即可。

另外在make modules 時,出現了不能只是serial_usb 的問題,解決辦法是在配置文件中刪除了改選項

編譯好之後出現了不能進入系統的問題,啟動時出現

Enforcing mode requested but no policy loaded 的錯誤

解決辦法:

是/etc/selinux/config的配置有問題,只要把SELINUX的值改成disabled就好了.

啟動成功後發現不能遠程登陸,錯誤提示

Server refused to allocate pty

解決辦法:

# mknod -m 666 /dev/ptmx c 5 2
# mkdir /dev/pts

注:我在RedHat as4上用以上方法編譯2.6.33.3內核編譯是成功了,但是不能進入系統。只得安裝gcc4.5.0,然後再編譯內核,編譯過程很順利,編譯完成後成功進入2.6.33.3內核系統。

Copyright © Linux教程網 All Rights Reserved