自学内容网 自学内容网

嵌入式-交叉编译链

一、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系统通常包括以下几个步骤:

  1. 选择一个defconfig:通过make xxx_defconfig命令选择一个默认的配置文件。这个文件通常位于configs目录下。
  2. 配置Buildroot:使用make menuconfig命令进行配置。在配置界面中,可以选择目标板架构特性、配置编译选项、交叉工具链、系统配置、目标软件包、文件系统镜像以及引导加载程序等。
  3. 编译Buildroot:使用make all命令进行编译。编译过程中,Buildroot会自动下载所需的源代码、配置并构建交叉编译工具链、目标软件包、内核镜像以及引导加载程序等。
  4. 运行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架构:

导入目标板子运行:


原文地址:https://blog.csdn.net/lixiaofeng0/article/details/142975595

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!