我正在为嵌入式设备交叉编译3.4.0内核。然后我想安装需要/lib/modules/3.4/build
目录和子文件的compat-wireless驱动程序。任何人都可以解释我如何构建该目录,这样当我INSTALL_MOD_PATH=newmodules make modules_install
时,它还会加载/lib/modules/$(uname -r)/build
目录?我希望得到一个明确的解释。
我正在使用debian发行版。我知道我可以通过apt-get install linux-headers-$(uname -r)
安装内核头文件,但我怀疑它是个好主意,因为内核源代码可能不一样。
答案 0 :(得分:3)
通常/ lib / modules / $(uname -r)/ build是执行构建的目录的软链接。所以这样做的方法就是简单地做一个
make modules_install INSTALL_MOD_PATH=/some/root/
在内核的构建目录中,其中/ some / root是您希望交叉编译片段结束的位置。这将在/ some / root / lib / modules / $(uname -r)中创建指向内核构建路径的链接...验证。
现在,在构建compat_wireless驱动程序时,使用KLIB_BUILD变量将Makefile中的内核构建目录指定为/ some / root(读取Makefile)
make modules KLIB_BUILD=/some/root/lib/modules/$(uname -r)/build
这应该适合你。
编辑A
回答下面的评论:
将“newmodules”保留在内核目录之外,将它放在内核目录中是一个坏主意。所以mkdir newmodules就像/ home / foo或/ tmp之类的东西。这是构建链接搞砸的原因之一
另外...... / build是一个软链接/ / kernel / build / location它只会复制为软链接。您还需要使用相同的相对位置将实际的内核源/内核构建目录复制到microSD。例如,
假设你的内核源代码是:
/usr/src/linux-3.5.0/
您的内核构建目录是:
/usr/src/linux-3.5.0-build/
您的新模块(在以下1之后)位于:
/tmp/newmodules/
因此,在/ tmp / newmodules /下,您会看到安装在树中的模块,如:
lib/modules/$(uname -r)/
当你在这个目录中执行ls -al时,你会看到build是一个软链接:
build -> /usr/src/linux-3.5.0-build/
现在假设您的microSD安装在/ mnt / microSD
下然后你需要做以下
mkdir -p /mnt/microSD/usr/src
cp -a /usr/src/linux-3.5.0 /usr/src/linux-3.5.0-build /mnt/microSD/usr/src
cp -a /tmp/newmodules/lib /mnt/microSD/lib
现在,您拥有了将所有内容带入嵌入式环境。我认为你在目标系统上进行compat_wireless构建而不是交叉编译它?
如果您的内核构建与内核源代码相同,那么只需复制内核源代码并忽略上面复制说明中的linux-3.5.0-build
答案 1 :(得分:0)
这是旧的,但有些人会需要这些信息。
我花了很多时间来确定build
文件夹的来源,以及为什么它只是我编译自己的内核时的链接。终于想通了;
Linux内核通常只将build
和source
文件夹链接到源文件夹。
但是!
Arch linux(也可能是其他一些发行版);有一个手动脚本,用于删除这些链接,并将(已过滤)文件添加到build
文件夹。
https://git.archlinux.org/svntogit/packages.git/tree/trunk/PKGBUILD?h=packages/linux
我已经将这个脚本解压缩到独立工作(在内核源代码树中):https://gist.github.com/furkanmustafa/9e73feb64b0b18942047fd7b7e2fd53e