一、Buildroot
Official website:
https://buildroot.org/downloads/manual/manual.html
Buildroot是Linux平台上一个用于构建嵌入式Linux系统的框架,它简化了系统构建过程并实现了工作的自动化。以下是对Buildroot的详细介绍:
一、概述
Buildroot是一个开源的嵌入式Linux系统自动构建框架,由Makefile脚本和Kconfig配置文件构成。它允许用户通过配置和编译,生成一个完整的可以直接烧写到机器上运行的Linux系统软件,包括boot、kernel、rootfs以及rootfs中的各种库和应用程序。
二、目录结构
Buildroot的目录结构清晰,主要包括以下几个部分:
- arch:存放CPU架构相关的配置脚本,如arm、mips、x86等。这些配置在制作工具链、编译uboot和kernel时非常关键。
- board:存放各种开发板特有的配置脚本。
- boot:存放各种boot软件的自动构建脚本,如u-boot、grub等。
- configs:放置开发板的一些全局配置文件。这些配置文件记录着机器平台或方案使用的工具栏、boot、kernel以及各种应用软件包的配置和是否编译选择的状态。
- dl:存放下载的源代码及应用软件的压缩包。
- docs:存放相关的参考文档。
- fs:存放各种文件系统的源代码。
- linux:存放Linux kernel的自动构建脚本。
- Makefile:Buildroot的主Makefile文件。
- output:编译输出的文件夹,包含build、host、images、staging和target等子目录。其中,images目录存放着编译好的可烧写到板子里的镜像文件。
- package:存放各种第三方开源应用软件包的自动编译构建脚本。
- support:存放一些固定的流程脚本,以备构建时调用执行。
- system:存放文件系统目录和设备节点的模板,用于制作根文件系统rootfs。
- toolchain:存放各种制作工具链的脚本。
三、使用方法
使用Buildroot构建嵌入式Linux系统通常包括以下几个步骤:
- 选择一个defconfig:通过
make xxx_defconfig
命令选择一个默认的配置文件。这个文件通常位于configs目录下。 - 配置Buildroot:使用
make menuconfig
命令进行配置。在配置界面中,可以选择目标板架构特性、配置编译选项、交叉工具链、系统配置、目标软件包、文件系统镜像以及引导加载程序等。 - 编译Buildroot:使用
make all
命令进行编译。编译过程中,Buildroot会自动下载所需的源代码、配置并构建交叉编译工具链、目标软件包、内核镜像以及引导加载程序等。 - 运行Buildroot构建的系统:编译完成后,可以在qemu或者目标板上运行Buildroot构建的系统。生成的镜像文件通常位于output/images/目录下。
四、实际使用
找到实际项目中使用的目录文件:
arm-buildroot-linux-gnueabi-addr2line arm-buildroot-linux-gnueabi-gdb arm-linux-c++ arm-linux-ld.bfd infocmp
arm-buildroot-linux-gnueabi-ar arm-buildroot-linux-gnueabi-gprof arm-linux-cc arm-linux-nm infotocap
arm-buildroot-linux-gnueabi-as arm-buildroot-linux-gnueabi-ld arm-linux-c++filt arm-linux-objcopy m4
arm-buildroot-linux-gnueabi-c++ arm-buildroot-linux-gnueabi-ld.bfd arm-linux-cpp arm-linux-objdump makedevs
arm-buildroot-linux-gnueabi-cc arm-buildroot-linux-gnueabi-nm arm-linux-elfedit arm-linux-ranlib ncurses5-config
arm-buildroot-linux-gnueabi-c++filt arm-buildroot-linux-gnueabi-objcopy arm-linux-g++ arm-linux-readelf pkgconf
arm-buildroot-linux-gnueabi-cpp arm-buildroot-linux-gnueabi-objdump arm-linux-gcc arm-linux-size pkg-config
arm-buildroot-linux-gnueabi-elfedit arm-buildroot-linux-gnueabi-ranlib arm-linux-gcc-4.9.3 arm-linux-strings reset
arm-buildroot-linux-gnueabi-g++ arm-buildroot-linux-gnueabi-readelf arm-linux-gcc-ar arm-linux-strip tabs
arm-buildroot-linux-gnueabi-gcc arm-buildroot-linux-gnueabi-size arm-linux-gcc-nm captoinfo tic
arm-buildroot-linux-gnueabi-gcc-4.9.3 arm-buildroot-linux-gnueabi-strings arm-linux-gcc-ranlib clear toe
arm-buildroot-linux-gnueabi-gcc-ar arm-buildroot-linux-gnueabi-strip arm-linux-gcov faked tput
arm-buildroot-linux-gnueabi-gcc-nm arm-linux-addr2line arm-linux-gdb fakeroot tset
arm-buildroot-linux-gnueabi-gcc-ranlib arm-linux-ar arm-linux-gprof gawk xmlwf
arm-buildroot-linux-gnueabi-gcov arm-linux-as arm-linux-ld igawk
其中的工具类:
addr2line、ar、c++filt、gold、gprof、nm、objcopy、objdump、ranlib、
readelf、size、strings、strip
创建代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("---ARM Kernel---!\n");
return (0);
}
创建好make 导入参数的文件MakeMain:
找到项目工程中的需要导入的编译链和参数
export TOOLCHAIN_BASE=/opt/trendchip/buildroot-gcc493_glibc222_arm32_32bServer/usr
export TOOLCHAIN_LIB=$(TOOLCHAIN_BASE)/arm-buildroot-linux-gnueabi/sysroot/lib
export HOST=arm-linux
export CROSS=arm-buildroot-linux-gnueabi-
export PATH :=$(TOOLCHAIN_BASE)/bin/:$(PATH)
export CROSS_COMPILE=$(CROSS)
export CC=$(CROSS)gcc -mfloat-abi=soft
export CCC=$(CROSS)g++ -mfloat-abi=soft
export LD=$(CROSS)ld
export LD = $(CROSS)ld
export AR=$(CROSS)ar
export STRIP=$(CROSS)strip
export RANLIB = $(CROSS)ranlib
export SYSROOT=$(TOOLCHAIN_BASE)/arm-buildroot-linux-gnueabi/sysroot
export LD_LIBRARY_PATH:=$(TOOLCHAIN_BASE)/lib:$(LD_LIBRARY_PATH)
export ARCH_CFLAGS =
#command
# export TOOLCHAIN_BASE=/opt/trendchip/buildroot-gcc493_glibc222_arm32_32bServer/usr
# export TOOLCHAIN_LIB=/opt/trendchip/buildroot-gcc493_glibc222_arm32_32bServer/usr/arm-buildroot-linux-gnueabi/sysroot/lib
# export PATH=/opt/trendchip/buildroot-gcc493_glibc222_arm32_32bServer/usr/bin/:/new_home/liyong/bin:/new_home/liyong/.local/bin:/usr/lib/jvm/java-8-openjdk-amd64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/repo:/snap/bin
# export CROSS_COMPILE=arm-buildroot-linux-gnueabi-
# export CC=arm-buildroot-linux-gnueabi-gcc-mfloat-abi=soft
# export CCC=arm-buildroot-linux-gnueabi-g++-mfloat-abi=soft
# export LD=arm-buildroot-linux-gnueabi-ld
# export AR=arm-buildroot-linux-gnueabi-ar
# export STRIP=arm-buildroot-linux-gnueabi-strip
# export RANLIB=arm-buildroot-linux-gnueabi-ranlib
# export SYSROOT=/opt/trendchip/buildroot-gcc493_glibc222_arm32_32bServer/usr/arm-buildroot-linux-gnueabi/sysroot
# export LD_LIBRARY_PATH=/opt/trendchip/buildroot-gcc493_glibc222_arm32_32bServer/usr/lib:/usr/lib/x86_64-linux-gnu/libfakeroot:/usr/lib64/libfakeroot:/usr/lib32/libfakeroot
# export ARCH_CFLAGS=
cpu:
echo "Build cpu"
ifeq ($(strip $(COMPILE_TOOLCHAIN)),mips-linux)
echo "mips"
export TEMPCC=$(CC)
export CC="$(CC)$(TC3162_CFLAG)"
endif
$(MAKE) -C apps/public/cpu
if test -e apps/public/cpu/cpu; \
then echo "Compile cpu success"; \
else echo "Compile cpu error!"; exit 1; \
fi
# rm apps/public/cpu/cpu
软件编译:makefile
#CROSS_COMPILE=mips-linux-
#CC=$(CROSS_COMPILE)gcc
AR=$(CROSS_COMPILE)ar
LD=$(CROSS_COMPILE)ld
STRIP=$(CROSS_COMPILE)strip
RANLIB=$(CROSS_COMPILE)ranlib
SIZE=$(CROSS_COMPILE)size
#CFLAGS = -mips1 -msoft-float -O2 -fomit-frame-pointer
CFLAGS = -fomit-frame-pointer
ifneq ($(strip $(TCSUPPORT_CODE_SHRINK)),)
CFLAGS += -Os
else
CFLAGS += -O2
endif
EXEC = cpu
OBJS = cpu.o
all: $(EXEC)
.c.o:
$(CC) -c $(CFLAGS) $<
$(EXEC): $(OBJS)
$(CC) $(OBJS) -o $@
$(STRIP) -s $@
clean:
-rm -f $(EXEC) *.elf *.o
使用指令:
fakeroot make -f MakeMain cpu 或者直接进入fakeroot模式
查看文件属性属于ARM架构:
导入目标板子运行: