Linux

在 Beaglebone black/Debian 上編譯 linux 核心模組時 crc8 未定義

  • August 16, 2016

我正在嘗試在我的 beaglebone black (BBB) 上使用 TI 電池監視器 BQ76PL536 的設備驅動程序。驅動程式碼位於:https ://github.com/tommessick/bq76pl536 。

儘管作者已經測試了交叉編譯的 Ubuntu 工具鏈,但我嘗試直接在我的 BBB 上編譯核心模組。

我做了

sudo apt-get install linux-headers-4.4.9-ti-r25

安裝相關的核心標頭檔,然後使用以下Makefile

DRIVER = bq76pl536

ifneq ($(KERNELRELEASE),)
   obj-m += $(DRIVER).o
else
   PWD := $(shell pwd)

default:
ifeq ($(strip $(KERNELDIR)),)
   $(error "KERNELDIR is undefined!")
else
   $(MAKE) -C $(KERNELDIR)  M=$(PWD) modules
endif

我定義了KERNELDIR=/lib/modules/4.4.9-ti-r25/build/. 我按照這裡的說明進行操作:http: //derekmolloy.ie/writing-a-linux-kernel-module-part-1-introduction/

我的輸出make是:

make
make -C /lib/modules/4.4.9-ti-r25/build/      M=/var/lib/cloud9/bq76_driver/bq76pl536 modules
make[1]: Entering directory '/usr/src/linux-headers-4.4.9-ti-r25'
 Building modules, stage 2.
 MODPOST 1 modules
WARNING: "crc8_populate_msb"   [/var/lib/cloud9/bq76_driver/bq76pl536/bq76pl536.ko] undefined!
WARNING: "crc8" [/var/lib/cloud9/bq76_driver/bq76pl536/bq76pl536.ko] undefined!
make[1]: Leaving directory '/usr/src/linux-headers-4.4.9-ti-r25'

在創建 .o、.ko 等文件時。當我嘗試使用載入模組時insmod出現錯誤:

sudo insmod ./bq76pl536.ko 
insmod: ERROR: could not insert module ./bq76pl536.ko: Unknown symbol in module

我的dmesg輸出如下

dmesg | tail
[   21.564768] eqep 48304180.eqep: failed to get clock
[   21.605265] c_can_platform 481cc000.can: c_can_platform device registered (regs=fa1cc000, irq=207)
[   21.661309] c_can_platform 481d0000.can: c_can_platform device registered (regs=fa1d0000, irq=208)
[   21.768584] eqep: probe of 48304180.eqep failed with error -2
[161381.366409] bq76pl536: Unknown symbol crc8 (err 0)
[161381.366768] bq76pl536: Unknown symbol crc8_populate_msb (err 0)
[162501.175612] bq76pl536: Unknown symbol crc8 (err 0)
[162501.175973] bq76pl536: Unknown symbol crc8_populate_msb (err 0)

我無法理解此錯誤的起源 - 編譯器無法找到函式:crc8並且crc8_populate_msb,當它們在 crc8.h 中定義時,可在標頭中訪問:/linux/crc8.h

錯誤不是來自編譯器,而是來自連結器。標頭檔只包含函式的聲明,它們不包含函式的程式碼,因此在標頭檔中聲明函式不足以執行它。建構時連結器警告您它沒有找到定義函式的位置。當您嘗試載入模組時,核心會執行最後的連結步驟。在那個階段,載入的模組使用的所有函式都必須由正在執行的核心定義。在您的情況下,crc8模組需要,但核心未定義,因此無法載入模組。

crc8功能是一個可選功能,必須在建構時使用CONFIG_CRC8(“庫常式”下的“CRC8 功能”)啟用。它可以作為模組載入,也稱為crc8. 嘗試

modprobe crc8

如果這可行,那麼您的安裝具有該crc8模組。編譯bq76pl536安裝後/lib/modules,執行depmod -a;這會生成一個依賴文件,然後bq76pl536正常載入(即 with modprobe bq76pl536,而不是直接 with insmod)也將載入crc8模組。

如果這不起作用,那麼您的安裝沒有該crc8模組,您需要使用它重新編譯核心。使用 Ubuntu 的打包和配置(改變那一項配置項除外)。請參閱Ubuntu wiki了解演練。由於您已經修改了配置,因此請確保debian.master/changelog按照 wiki 中的說明添加版本修飾符。然後在新核心下重新啟動並針對新核心重新編譯bq76pl536模組。

引用自:https://unix.stackexchange.com/questions/303409