【问题标题】:building /lib/modules/$(uname -r)/build while compiling a kernel在编译内核时构建 /lib/modules/$(uname -r)/build
【发布时间】:2013-05-17 06:58:32
【问题描述】:

我正在为嵌入式设备交叉编译 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) 安装内核头文件,但我怀疑这是一个好主意,因为内核源可能并不相同。

【问题讨论】:

    标签: linux linux-kernel kernel cross-compiling


    【解决方案1】:

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

    这应该对你有用。

    编辑一个

    在下面回答您的评论:

    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

    【讨论】:

    • 我是 mkdir newmodules; make modules_install INSTALL_MOD_PATH=newmodules 然后是 make modules KLIB_BUILD=newmodules/lib/modules/3.4.0/build。我在交叉编译内核的机器上看到 .../build 目录下的文件。然后我将内核和模块加载到 microSD 卡(cp -r newmodules/* /mnt/miniSD4/)。当我为嵌入式板供电时,ls -al /lib/modules/3.4.0/build 不输出任何内容
    【解决方案2】:

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

    我花了很多时间来弄清楚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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多