Linux(1)之buildroot构建系统(一)

Author:Onceday Date:2023年11月12日

漫漫长路,才刚刚开始…

参考文档

1. 概述

Buildroot和Yocto是两种用于嵌入式Linux系统开发的工具,可以构建完整的根文件系统(root filesystem),包括内核、引导加载器和用户空间应用程序

Buildroot一个简单、高效的嵌入式Linux系统构建工具,使用Makefile和Kconfig配置系统(与Linux内核相同)。Buildroot是高度配置的,可以为各种目标板构建精简的Linux系统。它使用交叉编译可以快速生成一个小型的、在目标硬件运行的Linux系统。

Buildroot提供了大量的包配置,涵盖了各种库和应用程序,并且配置和构建过程相对直观和简单。它特别适合需要快速迭代并且目标硬件资源有限项目

Yocto Project一个开源协作项目,为嵌入式Linux开发者提供了创建自定义Linux系统的模板、工具和方法。Yocto使用BitBake工具(一个与Gentoo的Portage类似的构建自动化工具)和OpenEmbedded的元数据

Yocto提供了更强大的自定义能力,可以创建高度定制嵌入式Linux系统。它拥有大量的“recipe”(描述如何构建软件包指南),并且支持复杂依赖关系层次结构

Buildroot 和 Yocto 的比较

总的来说,Buildroot和Yocto都是强大的工具,适合于嵌入式Linux开发。你应该根据你的具体需求项目复杂性来选择一个更适合。对于小型项目需要快速原型的场合,Buildroot可能是一个更好选择。对于需要高度定制复杂的大型项目,Yocto可能是更好选择

buildroot介绍:

Buildroot is a simple, efficient and easy-to-use tool to generate embedded Linux systems through crosscompilation.

buildroot的特点如下:

1.1 如Ubuntu等系统如何做到在许多设备启动

Ubuntu和其他许多现代的Linux发行版都能在多种硬件启动,这主要得益于以下几个方面的设计

  1. 通用内核:Ubuntu使用一个“通用”或“通用”内核,这个内核包含了许多不同硬件设备驱动。这意味着,只要硬件设备的驱动包含在内核中,Ubuntu就可以在该硬件运行

  2. 模块化的驱动:Linux内核支持模块化的驱动,这意味着驱动可以在运行动态加载卸载,而不需要重新编译整个内核。这使得Ubuntu能够根据需要加载特定的硬件驱动。

  3. 设备树:对于某些类型的设备(特别是很多嵌入式设备),Ubuntu可以使用设备树来描述硬件。设备树是一个数据结构,它描述了硬件的布局配置。虽然Ubuntu的默认内核可能不包含所有可能的设备树,但用户可以提供自己的设备树以支持特定的硬件配置。

  4. UEFI和BIOS:Ubuntu支持UEFI(统一扩展固件接口)和传统的BIOS启动方式。这意味着Ubuntu可以在各种不同的计算机系统上启动,包括新的基于EFI的系统和老的基于BIOS的系统。

  5. 自动硬件检测和配置:Ubuntu包含了udev(用户设备管理器),它可以在启动自动检测和配置硬件。这意味着Ubuntu可以在启动时动态地适应不同的硬件环境

综上所述,Ubuntu的跨硬件兼容性主要是由于它的通用内核、模块化驱动、设备树支持、UEFI/BIOS兼容性以及自动硬件检测和配置的能力。这些特性使得Ubuntu能够在各种各样的硬件配置上运行

1.2 不同的CPU特性功能代码如何兼容

对于核心的CPU特性内存管理单元(MMU),这些功能通常由内核直接处理,而不是通过驱动程序。这些功能在CPU体系结构的内核代码实现例如在Linux内核源代码中的arch/目录下,你可以找到针对各种CPU体系结构(如x86,ARM,MIPS等)的代码

这些代码包含处理MMU和其他核心CPU特性代码例如,对于ARM架构arch/arm/mm/目录包含内存管理相关的代码,包括MMU的处理。

关于外设,Linux内核包含了大量的设备驱动程序,用于处理各种不同的硬件设备。这些驱动程序通常在内核源代码drivers/目录下。对于一些设备,如网络接口卡或图形卡,驱动程序可能来自设备制造商,并被合并到内核中。

对于基本的CPU特性,如MMU,处理这些特性的代码已经被合并到内核中。对于外设,驱动程序可能也已经被合并到内核中,或者在需要时可以动态加载

在一些情况下,特定的设备可能需要额外驱动程序,这些驱动程序可能需要从设备制造商那里获取,并安装到系统中。然而,大多数常见的硬件设备都已经有在Linux内核中的驱动程序支持。

1.3 嵌入式设备和通用x86兼容机的区别

比如stm32mp157需要厂家的特殊设备树文件才能启动,那为什么通用ubuntu不能启动,就像树莓派一样,ubuntu需要提供特供版本支持。而对于通用x86兼容机,我们很少有这方面的问题,也没有需要厂家提供设备树这一说法。

这是一个很好的问题,它涉及到了嵌入式系统与通用PC硬件之间的一些关键区别

在x86兼容的PCs上,硬件的配置和初始化通常由BIOS或UEFI固件完成,内核不需要知道具体的硬件细节。在这种情况下,Linux内核可以使用抽象的、通用的接口(比如ACPI)来与硬件交互。这些接口隐藏了硬件的具体实现,使得同一个内核可以在各种不同的硬件上运行

然而,在嵌入式系统(如STM32MP157或树莓派)上,情况就完全不同了。这些系统通常没有像BIOS或UEFI这样的固件来进行硬件初始化,也没有像ACPI这样的通用接口。相反,Linux内核需要直接与硬件交互,需要知道硬件的具体布局和配置。这就是设备树在嵌入式Linux中的角色:设备树描述了硬件的布局和配置,使得内核可以正确地初始化和管理础。

所以,对于STM32MP157这样的设备,你需要一个特定的设备树文件,以告诉内核如何与硬件交互。这就是为什么“通用”的Ubuntu不能在这样的设备上启动:通用Ubuntu的内核不知道如何处理这种特定的硬件配置。

对于一些流行的嵌入式硬件(如树莓派),Ubuntu和其他Linux发行版可能提供了特定的版本,这些版本包含了对这些硬件的支持。这通常涉及到使用一个包含了正确设备树和其他硬件特定代码的定制内核。

总的来说,嵌入式硬件的多样性和复杂性,以及缺少像BIOS或UEFI这样的硬件抽象,意味着嵌入式Linux需要更多的硬件特定代码(如设备树),而这在PC硬件上通常是不需要的。

1.4 BIOS和UEFI的介绍

BIOS(基本输入输出系统)UEFI(统一扩展固件接口) 都是存储计算机硬件上的一种软件,它们负责计算机启动时初始化硬件设备,并加载操作系统

BIOS 是早期的一种固件接口,它存在计算机主板上的一个特殊闪存芯片中。BIOS在计算机启动时运行执行以下主要任务

  1. 硬件初始化:BIOS 会检查并初始化计算机的硬件设备,包括 CPU,内存键盘鼠标显示设备等。
  2. 自检:BIOS 进行一系列的自检(POST,Power-On Self Test),以确保硬件设备工作正常。
  3. 引导加载:BIOS 会查找一个可启动设备(如硬盘,USB驱动或网络),并从该设备加载操作系统的引导加载程序

尽管 BIOS 非常可靠并且被广泛使用,但是它有一些限制例如它不能直接引导超过 2TB 的硬盘,不支持预引导环境网络连接等。

UEFI 是一个现代的固件接口,设计用来取代 BIOS。UEFI 提供了更多的功能和更大的灵活性。UEFI 的主要功能包括:

  1. 硬件初始化和自检:就像 BIOS 一样,UEFI 在计算机启动时检查并初始化硬件设备,然后执行自检。
  2. 引导管理:UEFI 有一个更先进的引导管理器,可以支持多个操作系统并从多个设备引导。UEFI 可以直接引导超过 2TB 的硬盘
  3. 预引导环境:UEFI 提供了一个预引导环境,可以在操作系统加载之前运行其他的程序或驱动。这可以用来进行系统恢复,固件更新网络引导等。

UEFI 还支持安全引导(Secure Boot),这是一种技术,可以在引导过程验证操作系统的引导加载程序签名,以防止恶意软件的启动。

总的来说,BIOS 和 UEFI 都是计算机启动过程中的关键部分,它们负责硬件的初始化并加载操作系统。尽管 BIOS 已经被广泛使用了几十年,但是现代的计算机系统越来越多地转向使用 UEFI,由于其提供的更多的功能和灵活性。

1.5 BIOS和UEFI的作用

对于具有BIOS或UEFI的设备,主板的固件(BIOS或UEFI)在引导过程中负责初始化硬件设备,设置内存空间,初始化CPU,检测硬件配置等。在完成这些任务后,固件将控制权交给操作系统的引导加载程序,引导加载程序再将控制权交给操作系统内核。

在这个过程中,固件通过提供一些标准接口(例如,ACPI)来帮助操作系统内核理解硬件配置。ACPI(Advanced Configuration and Power Interface)是一个开放标准,它定义了操作系统如何发现和配置硬件设备,以及如何管理电源和系统事件通过ACPI,操作系统可以在不知道具体硬件实现细节的情况下,与硬件设备进行交互。

此外,固件也会初始化各种硬件接口,如USB和PCIe,并将它们设置为一个已知的、标准化的状态。这就使得操作系统可以使用标准协议和接口与这些设备进行通信,而不需要知道具体的硬件细节。例如,Linux内核包含了通用的USB和PCIe驱动,这些驱动使用标准协议与设备进行通信

总的来说,对于具有BIOS或UEFI的设备,固件在系统启动时进行硬件初始化,然后提供了标准接口(如ACPI)和初始化的硬件设备(如USB和PCIe)供操作系统使用。这就使得操作系统内核可以在不知道具体的硬件细节的情况下,与硬件设备进行交互。这一设计可以增加硬件的兼容性,降低操作系统支持多种硬件的复杂性。

对于传统的BIOS(基本输入/输出系统),它本身并不能直接引导Linux或任何其他操作系统。相反,它会初始化硬件(如CPU、内存硬盘驱动器),然后寻找一个可引导的设备(如硬盘、CD/DVD或USB存储设备)并运行存储在其中的引导加载程序的第一阶段

这个引导加载程序通常是像GRUB(GRand Unified Bootloader)这样的工具,用于Linux系统。引导加载程序然后将内核加载到内存中并开始运行。内核接着会继续初始化系统并启动操作系统。

然而,UEFI(统一扩展固件接口),这是现代的BIOS替代品,可以直接加载和执行Linux内核,前提是内核已构建了EFI引导存根支持。它通过一个名为EFI系统分区(ESP)的机制来实现,ESP是硬盘上的一个特殊分区用来保存EFI兼容的引导加载器和内核映像。这就是UEFI比传统BIOS更灵活、更强大的部分原因

这只是引导过程的高级概述。具体的细节可能会更复杂,并且可能会根据具体的硬件和软件配置而变化。

1.6 设备树的作用

在Linux中,设备树(Device Tree,DT)是一种数据结构,用于描述非自发现硬件的信息。自发现硬件,如USB或PCI设备,可以在运行时被系统自动检测和配置。相反,许多嵌入式系统的硬件设备需要在引导时被明确地配置。

在引导过程中,引导加载器将设备树传递给Linux内核。设备树包含了有关系统硬件的信息,如设备的内存映射中断号和引脚配置。内核使用这些信息正确地配置和初始化硬件设备。

设备树允许单个Linux内核映像在多个硬件配置上运行。例如,两个不同的嵌入式板可能使用相同的处理器,但具有不同的内存大小、I/O引脚配置和连接的外设。通过使用不同的设备树,相同的内核映像可以在这两个板上运行。

设备树是以一种称为设备树源(Device Tree Source,DTS)的格式编写的,然后被编译成设备树二进制(Device Tree Binary,DTB)形式,以便引导加载器和内核使用。设备树源文件通常按照硬件平台或板级规格进行组织,可以通过包含和覆盖技术来共享公共定义,这样可以减少重复工作提高可维护性

总的来说,设备树在Linux系统中起着至关重要的作用,特别是在嵌入式系统中。通过描述硬件配置,它使得单个内核映像能够在多种硬件平台上运行。

2. buildroot编译环境搭建

Buildroot可以在Linux系统上运行。虽然Buildroot自己将构建它进行编译所需的大多数主机包,但某些标准的Linux实用程序预计已经安装主机系统上。下面是强制性包和可选包的概述(请注意,包名可能在不同的发行版中有所不同)。

2.1 必须要安装软件包

以下是必备的各种构建工具的简要介绍

  1. which: which 是一个在Unix和Unix-like操作系统中用于定位可执行文件的实用程序。它会在系统的PATH环境变量定义目录查找文件

  2. sed: sed 是一个流式文本编辑器,用于在命令行中处理和转换文本。它可以非交互地执行文本替换删除和其他操作。

  3. make: make 是一种用于编译和构建项目的工具,它读取名为 Makefile文件,该文件描述了如何构建一个或多个目标。(version 3.81 or any later)

  4. binutils: binutils 是GNU项目的一部分,包含一组进制工具,如 ld (链接器)、as (汇编器)、objdump (显示进制信息)等。

  5. build-essential: build-essential 是Debian和Ubuntu等Linux发行版提供的一个软件包,包含编译和安装软件所必需的一些基本的工具,如 makegcc 等。

  6. diffutils: diffutils 是一个包含 diffdiff3sdiffcmp 等工具的软件包,用于比较文件目录

  7. gcc: gcc 是GNU编译器套装(GNU Compiler Collection)的简写,是一种开源编译器,可以编译C、C++、Java等多种语言。(version 4.8 or any later)

  8. g++: g++ 是GNU C++编译器命令行接口,它是gcc的一部分,用于编译C++代码。(version 4.8 or any later)

  9. bash: bash 是一个Unix shell,由GNU项目开发。它是Bourne shell的替代品,支持命令行编辑shell函数shell变量等。

  10. patch: patch 是一个Unix工具,用于将由diff生成的差异应用到一个或多个原始文件中,从而更新或创建文件。

  11. gzip: gzip 是一个在Unix和Unix-like系统上用于文件压缩的工具。

  12. bzip2: bzip2 是一个开源数据压缩工具,它通常提供比gzip更高的压缩率,但压缩解压速度较慢。

  13. perl: perl 是一种高级、通用、解释型、动态的编程语言。在系统管理网络编程,GUI开发和更多其他领域中被广泛使用。(version 5.8.7 or any later)

  14. tar: tar 是一个在Unix和Unix-like系统上用于文件归档的工具,它可以将多个文件和目录组合成一个归档文件。

  15. cpio: cpio 是一个在Unix和Unix-like系统上用于创建和提取归档文件的工具。

  16. unzip: unzip 是一个在Unix和Unix-like系统上用于解压缩ZIP文件的工具。

  17. rsync: rsync 是一个在Unix和Unix-like系统上用于同步文件和目录的工具,它可以在本地或者两台计算机之间复制同步文件。

  18. file: file 是一个在Unix和Unix-like系统上用于确定文件类型的工具。(must be in /usr/bin/file)

  19. bc: bc 是一种命令行计算器程序,它支持任意精度的算术运算和许多其他数学函数

  20. findutils: findutils 是一个包含 findxargs 等工具的软件包,用于在文件系统搜索和处理文件。

  21. wget: wget 是一个自由的,非交互的网络下载器。它在Unix和类Unix系统(例如 Linux,BSD,macOS)中广泛使用,用于从网络上下载文件。wget 支持通过HTTP,HTTPS和FTP协议下载,并能够递归地下载整个网站或者任何HTTP或FTP服务

2.2 可选的软件包

(1) Python支持,Buildroot中的一些特性或实用程序,如法律信息图形生成工具,有额外依赖关系

(2) 配置接口工具,在许多Linux发行版中,运行时库(runtime libraries)和开发库(development libraries)通常会被分别打包。运行时库包含了程序运行所需的共享库,而开发库包含了额外头文件静态库等,用于编译使用到这些库的新程序。开发包通常以 -dev-devel后缀。包含以下配置接口工具:

(3) 源码拉取工具,一般情况下wget就够用,但是也支持版本控制工具和一些同步工具,如下:

(4) Java相关的包:

(5) 文档生成工具:

(6) 图形生成工具:

2.3 开发环境

可以直接用Vagrant搭建虚拟开发环境。Buildroot源代码树中的support/misc/Vagrantfile提供了一个Vagrantfile,可以快速设置一个带有所需依赖项的虚拟机以便开始使用。

Vagrantfile 是 Vagrant 项目的核心组成部分。Vagrant 是一个用于构建和管理虚拟机环境的工具,特别适用于开发和测试Vagrantfile 是一个描述 Vagrant 环境配置的文本文件,它是由 Ruby 语言编写的。

Vagrantfile 中,你可以设置许多参数,包括:

一个基本Vagrantfile 示例如下

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise64"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.synced_folder "../data", "/vagrant_data"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "1024"
  end
end

上述 Vagrantfile 做了以下配置:

Vagrant 的目标是通过 Vagrantfile 提供一致的,可移植的,易于使用的开发环境。一旦设置Vagrantfile,其他开发人员只需要运行 vagrant up 就可以启动和配置完全相同的虚拟机环境。

如果你想在Linux或Mac Os X上设置一个隔离的Buildroot环境,请在你的终端粘贴这行代码:

curl -O https://buildroot.org/downloads/Vagrantfile; vagrant up

如果你在Windows上,把这个粘贴到你的powershell

(new-object System.Net.WebClient).DownloadFile(
"https://buildroot.org/downloads/Vagrantfile","Vagrantfile");
vagrant up

如果你想跟踪开发,你可以使用每日快照或者克隆Git仓库

Buildroot每三个月发布一次,分别在2月、5月、8月和11月。发布编号格式为 YYYY.MM,发布tar包可以在 http://buildroot.org/downloads/ 获取

2.4 获取源码

一般而言,只需在普通用户权限下编译即可,不需要在root权限,这样也能保护Linux环境不被破坏

首先下载源码,直接从gitlab上面下载源码,然后切换对应分支:

onceday->buildroot:$ git clone https://gitlab.com/buildroot.org/buildroot.git
Cloning into 'buildroot'...
remote: Enumerating objects: 524162, done.
remote: Counting objects: 100% (255/255), done.
remote: Compressing objects: 100% (151/151), done.
remote: Total 524162 (delta 110), reused 229 (delta 103), pack-reused 523907
Receiving objects: 100% (524162/524162), 123.46 MiB | 2.21 MiB/s, done.
Resolving deltas: 100% (372434/372434), done.
onceday->buildroot:$ git checkout 2023.05
Note: switching to '2023.05'.
2.5 生成配置config文件

make menuconfig, make nconfig, make xconfig, 和 make gconfig 是 Linux 内核源代码编译时常用的配置命令,用于配置内核的功能选项。它们都是用来创建 .config 文件的,这个文件定义了要在内核中包含哪些模块和功能。

这些命令的主要区别在于它们的用户界面和依赖库的不同:

make menuconfig: 这个命令提供了一个基于文本的菜单驱动的用户界面,允许用户在不同的配置选项导航选择。它依赖于 ncurses 库。

make nconfig: 这个命令提供了一个改进版的基于文本的用户界面,具有更强的导航搜索功能。它也依赖于 ncurses 库。

make xconfig: 这个命令提供了一个基于图形的用户界面,允许用户在不同的配置选项中使用鼠标导航和选择。它依赖于 Qt 库。

make gconfig: 这个命令也提供了一个基于图形的用户界面,但它依赖于 GTK+ 库。

所以你可以根据你的环境和需求选择适合的命令。例如,如果你在没有图形界面服务器上,你可能会选择 make menuconfig 或 make nconfig。如果你在具有图形界面桌面环境上,你可能会选择 make xconfig 或 make gconfig,以便利用鼠标图形界面提供的更直观的交互。

无论你选择哪个命令,都会生成一个 .config 文件,这个文件将会被用于驱动内核的编译过程。

ubuntu上,可以分别按照对应的支持库:

2.6 编译流程

开始全部编译流程很简单,直接输入make命令即可。也可以使用make help查看帮助信息,如下:

Cleaning:
  clean                  - delete all files created by build
  distclean              - delete all non-source files (including .config)

Build:
  all                    - make world
  toolchain              - build toolchain
  sdk                    - build relocatable SDK

Configuration:
  menuconfig             - interactive curses-based configurator
  nconfig                - interactive ncurses-based configurator
  xconfig                - interactive Qt-based configurator
  gconfig                - interactive GTK-based configurator
  oldconfig              - resolve any unresolved symbols in .config
  syncconfig             - Same as oldconfig, but quietly, additionally update deps
  olddefconfig           - Same as syncconfig but sets new symbols to their default value
  randconfig             - New config with random answer to all options
  defconfig              - New config with default answer to all options;
                             BR2_DEFCONFIG, if set on the command line, is used as input
  savedefconfig          - Save current config to BR2_DEFCONFIG (minimal config)
  update-defconfig       - Same as savedefconfig
  allyesconfig           - New config where all options are accepted with yes
  allnoconfig            - New config where all options are answered with no
  alldefconfig           - New config where all options are set to default
  randpackageconfig      - New config with random answer to package options
  allyespackageconfig    - New config where pkg options are accepted with yes
  allnopackageconfig     - New config where package options are answered with no

Package-specific:
  <pkg>                  - Build and install <pkg> and all its dependencies
  <pkg>-source           - Only download the source files for <pkg>
  <pkg>-extract          - Extract <pkg> sources
  <pkg>-patch            - Apply patches to <pkg>
  <pkg>-depends          - Build <pkg>'s dependencies
  <pkg>-configure        - Build <pkg> up to the configure step
  <pkg>-build            - Build <pkg> up to the build step
  <pkg>-show-info        - generate info about <pkg>, as a JSON blurb
  <pkg>-show-depends     - List packages on which <pkg> depends
  <pkg>-show-rdepends    - List packages which have <pkg> as a dependency
  <pkg>-show-recursive-depends
                         - Recursively list packages on which <pkg> depends
  <pkg>-show-recursive-rdepends
                         - Recursively list packages which have <pkg> as a dependency
  <pkg>-graph-depends    - Generate a graph of <pkg>'s dependencies
  <pkg>-graph-rdepends   - Generate a graph of <pkg>'s reverse dependencies
  <pkg>-dirclean         - Remove <pkg> build directory
  <pkg>-reconfigure      - Restart the build from the configure step
  <pkg>-rebuild          - Restart the build from the build step
  <pkg>-reinstall        - Restart the build from the install step

Documentation:
  manual                 - build manual in all formats
  manual-html            - build manual in HTML
  manual-split-html      - build manual in split HTML
  manual-pdf             - build manual in PDF
  manual-text            - build manual in text
  manual-epub            - build manual in ePub
  graph-build            - generate graphs of the build times
  graph-depends          - generate graph of the dependency tree
  graph-size             - generate stats of the filesystem size
  list-defconfigs        - list all defconfigs (pre-configured minimal systems)

Miscellaneous:
  source                 - download all sources needed for offline-build
  external-deps          - list external packages used
  legal-info             - generate info about license compliance
  show-info              - generate info about packages, as a JSON blurb
  pkg-stats              - generate info about packages as JSON and HTML
  printvars              - dump internal variables selected with VARS=...
  show-vars              - dump all internal variables as a JSON blurb; use VARS=...
                           to limit the list to variables names matching that pattern

  make V=0|1             - 0 => quiet build (default), 1 => verbose build
  make O=dir             - Locate all output files in "dir", including .config

For further details, see README, generate the Buildroot manual, or consult
it on-line at http://buildroot.org/docs.html

默认情况下,buildroot不支持顶层级别的并行编译,make -jN并无必要,不过存在一个实验性质的功能,用于支持并行构建

通常,Make编译流程执行以下步骤:

  1. 下载源代码(如果需要的话),可通过指定不同获取方式wget、git、svnrsync等等。
  2. 配置、编译、安装交叉工具链,或者简单的导入一个外部的工具链。
  3. 配置、编译、安装指定的目标软件包
  4. 可选编译一个内核镜像包。
  5. 可选编译一个bootloader镜像包。
  6. 创建一个指定格式的根文件系统。
2.7 编译输出

Buildroot输出存储在单个目录下面output/,即默认的输出目录,包括数个子目录

  • images/用于存储所有的放在目标系统上面的文件,包括内核镜像bootloader。根文件系统镜像等等。
  • build/用于存储所有编译之后的组件包,包括buildroot用于host的编译输出以及目标设备上的编译输出文件。对于每个组件包,都有一个单独的子目录文件夹一对应。
  • Host/包含为主机构建的工具和目标工具链的根目录sysroot。前者用于安装主机编译的工具,这些工具是正确执行Buildroot所需的,包括交叉编译工具链。后者是一个类似于根文件系统层次结构的目录。它包含所有用户空间包的头文件和库,这些包提供和安装其他包使用的库。然而,这个目录并不打算作为目标的根文件系统:它包含许多开发文件、未剥离的二进制文件和库,这些文件对于嵌入式系统来说太大了。这些开发文件用于为依赖于其他库的目标编译库和应用程序
  • staging/一个链接host/目录里目标工具链根目录sysroot符号链接,用于保持旧版本的兼容性。
  • target/包含编译目标的几乎完整的根文件系统:除了/dev/中的设备文件(Buildroot不能创建它们,因为Buildroot不以root身份运行,也不想以root身份运行)。此外,它没有正确权限(例如,busybox二进制文件的setuid)。因此,不应该在你的编译目标上使用该目录。相反,您应该使用images/目录中构建的映像之一。如果需要根文件系统的提取映像以便通过NFS引导,那么可以使用images/中生成的tarball映像,并将其作为根提取staging/相比,target/只包含运行所选目标应用程序所需的文件和库:开发文件(头文件等)不存在,二进制文件被剥离

原文地址:https://blog.csdn.net/Once_day/article/details/134590694

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_21636.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注