歡迎您光臨本站 註冊首頁

FC5(Fedora Core5)下編譯內核總結

←手機掃碼閱讀     火星人 @ 2014-03-26 , reply:0

摘要:

最近因工作需要,需要對linux內核進行重編譯,發現了一些以前沒有遇到過的 問題,些出來於 大家一起分享。
測試環境及目標:
FC5(Fedora Core5)
對FC5(Fedora Core5) kernel及linux kernel 2.4.20即RedHat9進行編譯,來測試framebuffer的一些功能。

序言

記得以前安裝inux kernel 2.4.20即RedHat9完畢后,就可以在/usr/src目錄里找到內核的源碼,但是,最近才發現我的FC5(Fedora Core5)相應目錄下竟然沒有找到源碼,可能是安裝盤的問題或者是安裝時忘記了什麼選項,鬼才知道,反正是我 現在沒有kernel的源碼。

源碼下載

從網上下載需要編譯的內核,推薦如下連接
ftp://ftp.kernel.org/pub/linux/kernel
裡面所有版本的 內核都有,盡情下把:)

編譯過程

為了大家明白我的每一步驟,我把編譯過程詳細的描述如下:
開始我想對linux kernel 2.4.20內核先編譯,因為畢竟linux kernel 2.4.20內核相對來說比較小,結果卻引來來很多問題,具體如下

$ make rmproper
$make menuconfig
$make dep

上面這些步驟都能順利通過
$make bzImage
一會就出現了如下的 錯誤

/usr/linux-2.4.20/include/linux/smp.h:29: error: conflicting types for 'smp_send_reschedule'
/usr/linux-2.4.20/include/asm/smp.h:42: error: previous declaration of 'smp_send_reschedule' was here
In file included from /usr/linux-2.4.20/include/linux/unistd.h:9,
from init/main.c:17:
/usr/linux-2.4.20/include/asm/unistd.h:375: warning: conflicting types for built-in function '_exit'
make: *** [init/main.o] Error 1

到網上查了查,發現是FC5下的GCC版本太新(gcc4.1),無法編譯linux-2.4.20?????????
在一個國外網站上也發現了類似的 問題,他們的建議是使用 gcc 2.95或者gcc3.2進行編譯(Dave Thompson),心想難道要要把gcc的 版本降下去不成?
在網上尋找了一會,發現其實FC5下可以安裝一個pachage,就可以使用gcc3.2,同時不會影響當前的gcc4.1。於是就在ftp://rpmfind.net/linux/fedora/c ... 2.3-55.fc5.i386.rpm里下載了一個,該包的大致描述為:The compatibility GNU Compiler Collection Fedora Core 5 for i386,馬上進行安裝

$rpm -ivh compat-gcc-32-3.2.3-55.fc5.i386.rpm
Preparing... ########################################### [100%]
package compat-gcc-32-3.2.3-55.fc5 is already installed

看到了把,FC5竟然默認已經安裝上該包了~~~~~~~~~~
於是馬上修改Makefile,把裡面的CC修改為 GCC3.2

$make mrprop*;make clean
$make dep
$make bzImage

經過漫長的等待(不長,也就15分鐘左右),結果等來的卻是:

{standard input}: Assembler messages:
{standard input}:936: Error: suffix or operands invalid for `mov'
{standard input}:937: Error: suffix or operands invalid for `mov'
{standard input}:1031: Error: suffix or operands invalid for `mov'
{standard input}:1032: Error: suffix or operands invalid for `mov'
{standard input}:1083: Error: suffix or operands invalid for `mov'
{standard input}:1084: Error: suffix or operands invalid for `mov'
{standard input}:1086: Error: suffix or operands invalid for `mov'
{standard input}:1098: Error: suffix or operands invalid for `mov'

沒辦法 ,把 錯誤信息輸入到google裡面,發現很多人都遇到過類似的麻煩。最後的 結論:是FC5下的binutils的一個bug,於是了相應的補丁http://www.kernel.org/pub/linux/ ... nux-2.6-seg-5.patch,在待編譯的內核源碼(本例為linux-2.4.20/)的根目錄下進行patch操作:

$patch -p0
或者

$patch -p1
詳細請查閱patch的用法。
/*
patch的用法簡介

格式

patch -pnumber
參數p的含義

容易變化的部分是『-p』參數後面的『number』,定義了補丁應用於何種擴展方式的路徑:
『-p0』是應用補丁文件中給出的全路徑,『-p1』則刪掉第一個斜杠(slash:/),依此類推。
沒有指定的『-p』將除去全部路徑,如果這個補丁只是應用於同一個目錄下的文件,這樣做就很好。
通常的做法是,將補丁文件放在源代碼的上一級目錄,然後運行
patch -p1 */

patch完之後,再一次重新編譯,當
$make bzImage
后,一切正常
$make modules
$make modules_install
后,竟然還出現了如下的信息

cd /lib/modules/2.4.20; \
mkdir -p pcmcia; \
find kernel -path '*/pcmcia/*' -name '*.o' | xargs -i -r ln -sf ../{} pcmcia
if [ -r System.map ]; then /sbin/depmod -ae -F System.map 2.4.20; fi
Version requires old depmod, but couldn't run /sbin/depmod.old: No such file or directory

做了如下措施

$ln -s /sbin/depmod /sbin/depmod.old
$make modules_install
$mkinitrd -f -v /boot/initrd-2.4.20.img 2.4.20

一切正常

修改相應的lino或者 grub,重新啟動。

在編譯時,發現如果編譯FC5 kernel,它的grub會自動被修改,不需要手動修改。

編譯C5 kernel和kernel 2.4.20,他們的編譯過程可能有點稍微不同,具體的步驟見各根目錄下的READERME文件,裡面說的很詳細。

關於作者:

聶飛(afreez)北京。中關村
聯繫方式:afreez@sina.com

[火星人 ] FC5(Fedora Core5)下編譯內核總結已經有451次圍觀

http://coctec.com/docs/linux/show-post-189827.html