《Linux Device Drivers, 3rd Edition》(LDD3)範例程式編譯是初學者常遇到的第一道坎。本文記錄作者從直接用 gcc 編譯失敗、到修正核心標頭路徑、編譯核心、安裝 kernel-devel 套件、成功建置 scull.ko 並驗證載入的完整踩坑過程,提供實用解決方案。
$ gcc -O2 -DMODULE -D__KERNEL__ -c test.c
錯誤大量:缺少核心標頭、巨集定義、結構體宣告。核心模組必須在核心建置系統中編譯,不能單獨用 gcc。
make -C /lib/modules/2.6.15-1.2054_FC5/build M=/myfile/examples/scull LDDINC=... modules
make: *** /lib/modules/2.6.15-1.2054_FC5/build: No such file or directory. Stop.
/lib/modules/$(uname -r)/build 應指向核心原始碼樹,但此處是斷開的符號連結。
kernel-devel-$(uname -r).rpm 提供 /usr/src/kernels/$(uname -r)/ 完整標頭與建置腳本/lib/modules/$(uname -r)/build 應連結至該目錄
# 下載對應版本 rpm
wget https://download.fedora.redhat.com/pub/fedora/linux/core/5/i386/os/Fedora/RPMS/kernel-devel-2.6.15-1.2054_FC5.i686.rpm
rpm -ivh kernel-devel-2.6.15-1.2054_FC5.i686.rpm
# 或安裝光碟內同版本套件
# 下載核心原始碼
wget https://cdn.kernel.org/pub/linux/kernel/v2.6/linux-2.6.20.tar.gz
tar xzf linux-2.6.20.tar.gz -C /usr/src
cd /usr/src/linux-2.6.20
make menuconfig # 載入現有 .config 或預設配置
make -j$(nproc) # 編譯核心(耗時較久)
make modules_install
make install
編譯完成後 /lib/modules/2.6.15-1.2054_FC5/build 連結自動修復。
$ cd /myfile/examples/scull
$ make
# 輸出顯示產生 scull.ko 等模組檔案
$ insmod scull.ko
# 文字終端機可直接看到 printk 輸出
# X Window 終端機需查看 /var/log/messages
$ dmesg | tail
$ cat /var/log/messages | grep scull
LDD3 提供的 Makefile 通用性極高,只需修改:
obj-m := your_module.o # 將 scull 改為你的模組名稱
kernel-devel 或完整核心原始碼)insmod 載入後無輸出不代表失敗,需看 dmesg 或 /var/log/messagesobj-m 即可複用/lib/modules/$(uname -r)/build 連結有效性