当前位置: 首页 > news >正文

linaro交叉编译工具链下载与使用笔记

笔记

文章目录

  • 笔记
    • 确定目标 (aarch64)
    • 选择版本(7.5)
    • 选择目标(aarch64-linux-gnu)
    • 下载地址工具链(gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz)
    • 解压编译工具链
    • HelloWorld测试
    • CMake中配置交叉编译环境

确定目标 (aarch64)

我的开发环境:Inter的x86_64架构,系统ubuntu20.04
我的目标环境:RK3588的aarch64架构,系统ubuntu20.04,小端(Little Endian)架构

选择版本(7.5)

官方链接:https://releases.linaro.org/components/toolchain/binaries/
在这里插入图片描述
没特殊情况,选择最新版本

选择目标(aarch64-linux-gnu)

在这里插入图片描述

以下是Linaro工具链的下载链接以及代表的版本信息:

  • aarch64-elf:

    • 下载链接:Linaro AArch64 bare-metal ELF
  • aarch64-linux-gnu: 【正常情况选这个】

    • 下载链接:Linaro AArch64 GNU/Linux
  • aarch64_be-elf:

    • 下载链接:Linaro AArch64 big-endian bare-metal ELF
  • aarch64_be-linux-gnu:

    • 下载链接:Linaro AArch64 big-endian GNU/Linux

我的情况就选:aarch64-linux-gnu

下载地址工具链(gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz)

下载地址:
https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/

这三个文件通常用于交叉编译环境,特别是用于在 x86_64 主机上进行 ARM64(aarch64-linux-gnu)目标平台的交叉编译。以下是这三个文件的作用:

  1. gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz

    • 这是包含 GCC 交叉编译器的压缩文件。该工具链是用于在 x86_64 主机上生成运行在 aarch64-linux-gnu 目标平台(ARM64/Linux)上的可执行文件的工具。
  2. runtime-gcc-linaro-7.5.0-2019.12-aarch64-linux-gnu.tar.xz

    • 此文件可能包含运行时支持的文件,例如共享库(Shared Libraries)等,这些文件是在目标平台(aarch64-linux-gnu)上执行程序时所需的。它提供了在目标平台上运行二进制文件所需的运行时库和支持。
  3. sysroot-glibc-linaro-2.25-2019.12-aarch64-linux-gnu.tar.xz

    • 这个文件包含 Glibc 库的 sysroot。Glibc 是 GNU C 库的一部分,它提供了 C 语言标准库的实现,是 Linux 系统中的一个重要组成部分。sysroot 包含在目标平台(aarch64-linux-gnu)上执行程序所需的头文件、库和其他支持文件。

通常,在交叉编译环境中,交叉编译器用于生成二进制可执行文件,而 runtime 和 sysroot 文件则提供了在目标平台上运行这些生成的可执行文件所需的运行时支持和库。确保这些文件版本与您的项目和目标平台的要求相匹配。

在这里插入图片描述
我这里也只需要下载编译工具链:gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz

解压编译工具链

解压gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz

$ tree -L 2
.
├── aarch64-linux-gnu
│   ├── bin
│   ├── include
│   ├── lib
│   ├── lib64
│   └── libc
├── bin
│   ├── aarch64-linux-gnu-addr2line
│   ├── aarch64-linux-gnu-ar
│   ├── aarch64-linux-gnu-as
│   ├── aarch64-linux-gnu-c++
│   ├── aarch64-linux-gnu-c++filt
│   ├── aarch64-linux-gnu-cpp
│   ├── aarch64-linux-gnu-dwp
│   ├── aarch64-linux-gnu-elfedit
│   ├── aarch64-linux-gnu-g++
│   ├── aarch64-linux-gnu-gcc
│   ├── aarch64-linux-gnu-gcc-7.5.0
│   ├── aarch64-linux-gnu-gcc-ar
│   ├── aarch64-linux-gnu-gcc-nm
│   ├── aarch64-linux-gnu-gcc-ranlib
│   ├── aarch64-linux-gnu-gcov
│   ├── aarch64-linux-gnu-gcov-dump
│   ├── aarch64-linux-gnu-gcov-tool
│   ├── aarch64-linux-gnu-gdb
│   ├── aarch64-linux-gnu-gdb-add-index
│   ├── aarch64-linux-gnu-gfortran
│   ├── aarch64-linux-gnu-gprof
│   ├── aarch64-linux-gnu-ld
│   ├── aarch64-linux-gnu-ld.bfd
│   ├── aarch64-linux-gnu-ld.gold
│   ├── aarch64-linux-gnu-nm
│   ├── aarch64-linux-gnu-objcopy
│   ├── aarch64-linux-gnu-objdump
│   ├── aarch64-linux-gnu-ranlib
│   ├── aarch64-linux-gnu-readelf
│   ├── aarch64-linux-gnu-size
│   ├── aarch64-linux-gnu-strings
│   └── aarch64-linux-gnu-strip
├── gcc-linaro-7.5.0-2019.12-linux-manifest.txt
├── include
│   ├── gdb
│   ├── gmp.h
│   ├── gmpxx.h
│   ├── mpc.h
│   ├── mpf2mpfr.h
│   └── mpfr.h
├── lib
│   ├── gcc
│   ├── libcc1.so -> libcc1.so.0.0.0
│   ├── libcc1.so.0 -> libcc1.so.0.0.0
│   ├── libcc1.so.0.0.0
│   ├── libgmp.a
│   ├── libgmpxx.a
│   ├── libmpc.a
│   └── libmpfr.a
├── libexec
│   └── gcc
└── share├── doc├── gcc-7.5.0├── gdb├── info├── locale└── man

主要使用bin目录中的各种工具替换系统的编译工具

HelloWorld测试

创建一个main.cpp,写个HelloWorld,内容此处省略。
在这里插入图片描述
x86平台上无法运行交叉编译后的程序,使用file命令查看,可以看到是一个aarch64的可执行程序。

工具链其他工具也是可以使用,以此类推

$ /root/workspace/cross_test/cross_build/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-nm main        U abort@@GLIBC_2.17
0000000000411038 B __bss_end__
0000000000411038 B _bss_end__
0000000000411030 B __bss_start
0000000000411030 B __bss_start__
0000000000400578 t call_weak_fn
0000000000411030 b completed.7806
0000000000411020 D __data_start
0000000000411020 W data_start
0000000000400590 t deregister_tm_clones
00000000004005f8 t __do_global_dtors_aux
0000000000410dd0 t __do_global_dtors_aux_fini_array_entry
0000000000411028 D __dso_handle
0000000000410dd8 d _DYNAMIC
0000000000411030 D _edata
0000000000411038 B __end__
0000000000411038 B _end
00000000004006dc T _fini
0000000000400628 t frame_dummy
0000000000410dc8 t __frame_dummy_init_array_entry
0000000000400770 r __FRAME_END__
0000000000410fd8 d _GLOBAL_OFFSET_TABLE_w __gmon_start__
0000000000400718 r __GNU_EH_FRAME_HDR
00000000004004b8 T _init
0000000000410dd0 t __init_array_end
0000000000410dc8 t __init_array_start
00000000004006f0 R _IO_stdin_usedw _ITM_deregisterTMCloneTablew _ITM_registerTMCloneTable
00000000004006d8 T __libc_csu_fini
0000000000400658 T __libc_csu_initU __libc_start_main@@GLIBC_2.17
000000000040062c T mainU puts@@GLIBC_2.17
00000000004005c0 t register_tm_clones
0000000000400530 T _start
0000000000411030 D __TMC_END__

CMake中配置交叉编译环境

主要配置

# 设置编译器和链接器的路径
set(CMAKE_C_COMPILER "/path/to/embedded-gcc")
set(CMAKE_CXX_COMPILER "/path/to/embedded-g++")
set(CMAKE_LINKER "/path/to/embedded-ld")# 设置特定的编译和链接标志
set(CMAKE_C_FLAGS "-mcpu=cortex-m3 -mthumb")
set(CMAKE_CXX_FLAGS "-mcpu=cortex-m3 -mthumb")
set(CMAKE_EXE_LINKER_FLAGS "-T/path/to/linker_script.ld")

相关文章:

  • 量子计算的世界:探索叠加态与Python编程
  • C语言——数组转换
  • Zabbix“专家坐诊”第212期问答汇总
  • 外包干了5个月,技术退步明显.......
  • SELinux refpolicy详解(2)
  • RabbitMQ消息的应答
  • SpringBoot——自定义start
  • 【JavaEE初阶】volatile 关键字、wait 和 notify
  • Python与设计模式--命令模式
  • Ubuntu镜像与K8S冲突,容器持续Terminating
  • 大数据项目前三层--学习笔记
  • PHP:js中怎么使用PHP变量,php变量为数组时的处理
  • 鸿蒙系统扫盲(三):鸿蒙开发用什么语言?
  • 【Linux】tar 命令使用
  • RabbitMQ消息模型之Routing-Direct
  • .pyc 想到的一些问题
  • Fundebug计费标准解释:事件数是如何定义的?
  • Hexo+码云+git快速搭建免费的静态Blog
  • JavaScript-Array类型
  • MYSQL 的 IF 函数
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • PHP面试之三:MySQL数据库
  • React+TypeScript入门
  • Redis的resp协议
  • spring-boot List转Page
  • SpringBoot 实战 (三) | 配置文件详解
  • ucore操作系统实验笔记 - 重新理解中断
  • 机器学习 vs. 深度学习
  • 码农张的Bug人生 - 见面之礼
  • 前端性能优化——回流与重绘
  • 三栏布局总结
  • 小程序开发中的那些坑
  • 移动端 h5开发相关内容总结(三)
  • #1014 : Trie树
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #pragma pack(1)
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (python)数据结构---字典
  • (pytorch进阶之路)扩散概率模型
  • (windows2012共享文件夹和防火墙设置
  • (独孤九剑)--文件系统
  • (附源码)计算机毕业设计高校学生选课系统
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)Sql Server 保留几位小数的两种做法
  • (转)VC++中ondraw在什么时候调用的
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET 中什么样的类是可使用 await 异步等待的?
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [2019/05/17]解决springboot测试List接口时JSON传参异常
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [C++]打开新世界的大门之C++入门
  • [CSS]浮动