如何构建单个树内内核模块?


36

linux-source -...具有一个在config /boot/config-3.4-trunk-686-pae中禁用的模块,因此它不属于linux-image -...(这在Debian上,但是解决方案应该与Ubuntu相同,还是?),例如

# CONFIG_CAN_PEAK_USB is not set

一个人将如何仅编译该内核模块,以便可以与分布式内核一起使用?

各自的linux-source -...软件包已经安装,未压缩并链接到/ usr / src / linux。将/boot/config-3.4-trunk-686-pae复制到/usr/src/linux/.config并使用

CONFIG_CAN_PEAK_USB=m

make
make modules

可以编译内核和所有模块。但是,如何只编译那个特定的单个模块呢?

(注:也内核需要之前进行编译,否则你会得到以下错误:no symbol version for module_layout


请关闭并重复14627。用户“ Radu C”的答案回答了该问题。
2012年

depmod -a以前尝试过modbrobe吗?
纳迪亚

Answers:


37

我有同样的问题。我假设您不仅需要复制.config,还需要复制Module.symvers

我编译模块ft1000的步骤(运行Debian Wheeze 7.1.0;内核3.2.0-4-686-pae):

aptitude install linux-headers-3.2.0-4-686-pae
aptitude install linux-source-3.2
cd /usr/src/
tar xjf linux-source-3.2.tar.bz2
cd /usr/src/linux-source-3.2
cp ../linux-headers-3.2.0-4-686-pae/Module.symvers .
make oldconfig # it copies .config to ./
vi .config # enable ft1000 module: CONFIG_FT1000=m
make prepare # setup FT1000 as module
make modules_prepare
make SUBDIRS=scripts/mod
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
cp drivers/staging/ft1000/ft1000-usb/ft1000.ko /lib/modules/3.2.0-4-686-pae/kernel
/drivers/staging/
depmod
modprobe ft1000

4
我不确定SUBDIRS是否仍然正确。对我来说,它被忽略了。阅读完kernel.org/doc/Documentation/kbuild/modules.txt之后,我尝试使用make M=/path/to/module似乎有效的方法。
harm14 2014年

我在尝试编译其他模块时尝试修改其他模块(只是将USB ID添加到现有模块中),但是没有错误,但是在插入模块时却得到无效的模块格式,为什么?!
Zibri

13

从顶级源目录中,只需给出make到模块名称或模块目录的路径,例如:

make drivers/net/can/usb/peak_usb/

或更简单的示例(英特尔e1000以太网驱动程序):

make drivers/net/ethernet/intel/e1000/e1000.ko

只是在做:make drivers/net/can/usb/peak_usb/pcan_usb.ko只构建了pcan_usb.o。进行make drivers/net/can/usb/peak_usb/ && make drivers/net/can/usb/peak_usb/pcan_usb.ko编译,但是insmod抱怨Error: could not insert module drivers/net/can/usb/peak_usb/peak_usb.ko: Invalid module format。dmesg:peak_usb: no symbol version for module_layout
mab 2012年

您正在运行该特定内核,并且已经编译过一次内核吗?也请尝试modprobe
ish 2012年

我正在运行打包的内核。编译完整的内核。但我尝试不编译完整的内核,仅编译特定的内核模块。是否有一个make目标可以“准备”单个模块的编译?modprobe显示相同的错误。
2012年

6
根据stackoverflow您可以使用make modules SUBDIRS=drivers/net/can/usb/peak_usb或任何其他子目录。它在这里工作正常。
特维诺

0

就像:这样简单(此示例说明了ft1000驱动程序,如果不立即执行,则只需几分钟)

cd /usr/src/kernel-sources
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
# Enable the ft1000 module: CONFIG_FT1000=m  on the config with 
make xconfig # or "make menuconfig" then save
make prepare
make modules_prepare
make SUBDIRS=scripts/mod
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules_install

然后,您可以使用modprobeafterdepmod

注意:根据模块的依赖性,您可能需要完全重建内核

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.