笔记
文章目录
确定目标 (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:
-
aarch64-linux-gnu: 【正常情况选这个】
-
aarch64_be-elf:
-
aarch64_be-linux-gnu:
我的情况就选: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)目标平台的交叉编译。以下是这三个文件的作用:
-
gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
:- 这是包含 GCC 交叉编译器的压缩文件。该工具链是用于在 x86_64 主机上生成运行在 aarch64-linux-gnu 目标平台(ARM64/Linux)上的可执行文件的工具。
-
runtime-gcc-linaro-7.5.0-2019.12-aarch64-linux-gnu.tar.xz
:- 此文件可能包含运行时支持的文件,例如共享库(Shared Libraries)等,这些文件是在目标平台(aarch64-linux-gnu)上执行程序时所需的。它提供了在目标平台上运行二进制文件所需的运行时库和支持。
-
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_used
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
00000000004006d8 T __libc_csu_fini
0000000000400658 T __libc_csu_init
U __libc_start_main@@GLIBC_2.17
000000000040062c T main
U 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")