3

我正在为嵌入式设备交叉编译 3.4.0 内核。然后我想安装需要/lib/modules/3.4/build目录和子文件的兼容无线驱动程序。谁能解释我如何构建该目录,以便在我这样做时INSTALL_MOD_PATH=newmodules make modules_install它也会加载/lib/modules/$(uname -r)/build目录?我将不胜感激。

我正在使用 debian 发行版。我知道我可以通过 安装内核头文件apt-get install linux-headers-$(uname -r),但我怀疑这是一个好主意,因为内核源可能不完全相同。

4

2 回答 2

4

通常 /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

回答您的以下评论:

  1. 将“newmodules”保留在内核目录之外,将其放在内核目录中是个坏主意。所以 mkdir newmodules 在 /home/foo 或 /tmp 之类的地方。这是您的构建链接搞砸的原因之一

  2. ALSO .../build 是一个软链接 /to/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 上面的复制指令

于 2013-05-22T09:33:40.943 回答
0

这是旧的,但有些人会需要这些信息。

我花了很多时间来弄清楚build文件夹的来源,以及为什么当我编译自己的内核时它只是一个链接。终于想通了;

Linux 内核通常只是将buildsource文件夹链接到源文件夹。

但!

Arch linux(可能还有其他一些发行版);有一个用于删除这些链接并将(过滤的)文件添加到build文件夹的手动脚本。

https://git.archlinux.org/svntogit/packages.git/tree/trunk/PKGBUILD?h=packages/linux

我在此处提取了该脚本以独立工作(在内核源代码树中):https ://gist.github.com/furkanmustafa/9e73feb64b0b18942047fd7b7e2fd53e

于 2017-10-10T21:25:54.743 回答