赞
踩
编译与执行,编译与执行必须在同一个平台才可以进行正确的执行,我们常见的硬件平台为X86、ARM、MIPS等,
一般我们将嵌入式设备称为目标机,我们自己的电脑称为宿主机,这里就涉及一个问题,目标机(一般为ARM)与宿主机(一般为x86)的硬件平台是不同的,因此涉及到在宿主机上编译目标机上可执行的程序,这就涉及到交叉编译,即在宿主机上编译,在目标机上执行。
为何需要交叉编译,在目标机上编译执行不可以吗,当然可以,只不过对于嵌入式设备,一般为基于arm的嵌入式设备,但是嵌入式设备的资源较少,ram与flash等资源比较少,因此一般只是将可执行文件放在目标机执行。
编译链是如何制作的,编译链主要由三个开源库生成:gcc库、binutils库、Glibc库;
gcc库:主要负责编译的第一阶段预编译与第二阶段编译生成汇编代码;gcc官网可以进行gcc源码下载https://gcc.gnu.org/
binutils库:主要负责编译的阶段三汇编与阶段四链接最终生成可执行文件,主要包括as、ld、objdump、readelf等工具,binutils主要实现汇编、链接等过程https://ftp.gnu.org/gnu/binutils/
Glibc库:Glibc为C标准库,生成C的标准静态库与动态库,供C语言进行调用;如printf、read、open等;glibc为linux下c的标准库,源码下载地址: http://www.gnu.org/software/libc/
交叉编译链获取方式:
1.通过以上工具进行共同编译生成,难度较大,主要涉及编译、各个库的对齐等;
2.通过ARM官网获取编译好的交叉编译链: https://developer.arm.com/downloads/-/gnu-rm
//使用gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
aarch64-none-linux-gnu bin include lib lib64 libexec share
编译链解压后便可以直接使用,主要如果需要在全局使用,需要将目录加入到全局环境变量中:
vim ~/.bashrc ,加入本机的交叉编译链的路径;
源代码:
//test.c
#include <stdio.h>
int main(int argc,char *argv[])
{
int a = 0,b = 1;
int sum;
sum = a + b;
printf("sum = %d\n",sum);
return 0;
}
gcc test.c
//执行file a.out
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked,
interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32,
BuildID[sha1]=506004a453489535b56dc188a684aedf65a4a462, not stripped
//使用ARM64编译链
aarch64-none-linux-gnu-gcc test.c
//file a.out
a.out: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically
linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, not stripped
使用file指令可以查看可执行文件的属性,使用交叉编译链可以生成ARM平台的可执行文件。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。