嵌入式-交叉编译链

一、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架构:

导入目标板子运行:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/892935.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

excel如何把年龄转换为日期

总体的思路 我们从一个核心的日期函数出发 我们首先需要年月日 我的数据大概是这样的。 获取年份 第一步&#xff1a;提取岁前面的数字 left(目标单元格&#xff0c;“从左到右获取第几个字符”)第二步:替换掉数字后面的岁 第三步:新增一个单元格 在里面填入年 第四步:用…

pyaudio出现Invalid number of channels的解决方法

最近准备做个录制电脑本身的音频&#xff0c;于是用到了pyaudio。代码如下。 import pyaudiodef get_audio_devices():p pyaudio.PyAudio()device_info p.get_host_api_info_by_index(0)device_count device_info.get(deviceCount)devices []for i in range(device_count)…

【前端】制作一个简单的网页(2)

单标签组成的元素 这类标签不需要内容产生效果&#xff0c;通常表示对网页的某种行为&#xff0c;它们不用标记任何内容&#xff0c;开始即是结束。 比如&#xff0c;<hr>标签的作用是在网页中添加一条分割线&#xff0c;它仅包含开始标签&#xff0c;是一个单标签元素。…

公链技术开发之路:从概念到实现的公链开发全攻略

随着区块链技术的日益成熟&#xff0c;公链&#xff08;Public Chain&#xff09;作为区块链生态的基础设施之一&#xff0c;成为了众多企业和项目方争相探索和开发的重要领域。公链是去中心化的区块链网络&#xff0c;任何人都可以自由加入&#xff0c;进行交易、开发和使用去…

Node.js 中的 WebSocket 底层实现

WebSockets 是一种网络通信协议&#xff0c;可实现双向客户端-服务器通信。 WebSockets 通常用于需要即时更新的应用程序&#xff0c;使用 HTTP 之上的持久双工通道来支持实时交互&#xff0c;而无需持续进行连接协商。服务器推送是 WebSockets 的众多常见用例之一。 本文首先…

pytorch与卷积神经网络实战笔记

课程视频链接 CNN卷积神经网络算法原理 全神经网络的整体结构 输入层&#xff08;x1, x2, x3…&#xff09;->隐藏层&#xff08;全连接&#xff09;->输出层&#xff0c;整体就类似于一个函数&#xff0c;输入x&#xff0c;经过函数module(x)得到输出y的过程&#xf…

QtModel

QModelIndex index1 model->index(row,column,QModelIndex());QModelIndex index2 model->index(row.column,index2); QSqlQuery::size() 仅在使用了 QSqlQuery::exec() 后并且查询结果集的所有行都被读取时才有效。如果结果集很大或在使用游标的情况下&#xff0c;返回…

AVL树的实现

AVL树 1. AVL的概念2. AVL树的实现2.1 AVL树的结构2.2 AVL树的插⼊2.2.1 AVL树插⼊⼀个值的⼤概过程2.2.2 平衡因⼦更新2.2.3 插⼊结点及更新平衡因⼦的代码实现 2.3 旋转2.3.1 旋转的原则2.3.2 右单旋2.3.3 右单旋代码实现2.3.4 左单旋2.3.5 左单旋代码实现2.3.6 左右双旋2.3.…

【排序】——2.快速排序法(含优化)

快速排序法 递归法 霍尔版本(左右指针法) 1.思路 1、选出一个key&#xff0c;一般是最左边或是最右边的。 2、定义一个begin和一个end&#xff0c;begin从左向右走&#xff0c;end从右向左走。&#xff08;需要注意的是&#xff1a;若选择最左边的数据作为key&#xff0c;则…

Arduino配置ESP32环境

Arduino配置ESP32环境 引言一、IDE下载教程操作取巧方法 二、社区安装包三、官方手动安装 引言 最近入手了一款ESP32-C3的开发板&#xff0c;想继续沿用现有Arduino IDE&#xff0c;网上看了很多方法&#xff0c;大致分了三类&#xff1a;IDE下载、社区安装包、github手动配置…

基于SpringBoot+Vue+uniapp的诗词学习系统的详细设计和实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

ROS理论与实践学习笔记——5 ROS机器人系统仿真之URDF(Unified Robot Description Format)语法详解

URDF 文件是一个标准的 XML 文件格式&#xff0c;用于在 ROS 中描述机器人模型的结构。URDF 通过预定义的一系列标签&#xff0c;简洁地表达机器人的组成和运动关系。虽然机器人模型可能非常复杂&#xff0c;但在 URDF 中可以主要简化为两个核心部分&#xff1a; 连杆&#xff…

6.2 遍历重定位表

本节我们将编写一个遍历重定位表的示例程序&#xff0c;打印重定位表。 本节必须掌握的知识点&#xff1a; 遍历重定位表 6.2.1 遍历重定位表 实验四十三&#xff1a;遍历重定位表 以下代码实现打印"c:\\notepad64.exe"进程重定位表的所有信息。 /*--------------…

【详尽-实战篇】使用Springboot生成自带logo或者图片的二维码-扫描二维码可以跳转到指定的页面-Zing-core

先上效果图 项目源码&#xff1a;https://download.csdn.net/download/qq_43055855/89891285 源码地址 手机扫描二维码跳转到指定网页 概述 这个项目是一个基于 Java 的二维码生成与解析工具&#xff0c;主要由 QRCodeUtil 和 QRCodeController 两个类组成。它利用了 Google…

python 爬虫 入门 一、基础工具

目录 一&#xff0c;网页开发者工具的使用 二、通过python发送请求 &#xff08;一&#xff09;、get &#xff08;二&#xff09;、带参数的get &#xff08;三&#xff09;、post 后续&#xff1a;数据解析 一&#xff0c;网页开发者工具的使用 我们可以用 requests 库…

人脸识别-特征算法

文章目录 一、LBPH算法1.基本原理2.实现步骤3.代码实现 二、Eigenfaces算法1.特点2.代码实习 三、FisherFaces算法1.算法原理2.算法特点3.代码实现 四、总结 人脸识别特征识别器是数字信息发展中的一种生物特征识别技术&#xff0c;其核心在于通过特定的算法和技术手段&#xf…

leader必备技能——编写高质量测试计划

前言 作为一个想成为leader(不论是整个测试部门还是小项目组的leader&#xff09;的人&#xff0c;测试计划编写是必备技能。 接下来我们先了解一下测试计划的一些基础知识再进一步了解。 什么是测试计划&#xff1f; 测试计划是对测试过程的整体设计&#xff0c;测试计划确…

Spring Boot知识管理:智能搜索与分析

3系统分析 3.1可行性分析 通过对本知识管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本知识管理系统采用JAVA作为开发语言&#xff0c;Spring Boot框…

c#中多态的实例应用说明

在C#中&#xff0c;多态性是通过继承和实现接口来实现的&#xff0c;允许编写可以使用基类型的代码&#xff0c;然后使用派生类型的特定行为。 一.实例界面显示 二.源码界面显示 //定义的基类abstract class Shape{public abstract int Area();//基类中的抽象方法}//定义矩形的…

【前端】如何制作一个自己的网页(6)

接上文 网络中的图片 我们也可以在百度等网站搜索自己喜欢的图片。 此时对图片点击右键&#xff0c;选择【复制图片地址】&#xff0c;即可获得该图片的网络地址。 其实在HTML中&#xff0c;除了图片以外&#xff0c;我们还可以利用地址找到另一个网页。 如右图所示&#…