ARM交叉编译

文章目录

  • 1.什么是交叉编译?
  • 2.为何需要交叉编译?
  • 3.交叉编译链如何获取?
  • 4.具体说明编译与编译
    • 4.1.X86编译
    • 4.2.X86平台交叉编译ARM生成可执行文件

1.什么是交叉编译?

编译与执行,编译与执行必须在同一个平台才可以进行正确的执行,我们常见的硬件平台为X86、ARM、MIPS等,
ARM交叉编译_第1张图片

一般我们将嵌入式设备称为目标机,我们自己的电脑称为宿主机,这里就涉及一个问题,目标机(一般为ARM)与宿主机(一般为x86)的硬件平台是不同的,因此涉及到在宿主机上编译目标机上可执行的程序,这就涉及到交叉编译,即在宿主机上编译,在目标机上执行。

2.为何需要交叉编译?

为何需要交叉编译,在目标机上编译执行不可以吗,当然可以,只不过对于嵌入式设备,一般为基于arm的嵌入式设备,但是嵌入式设备的资源较少,ram与flash等资源比较少,因此一般只是将可执行文件放在目标机执行。

3.交叉编译链如何获取?

编译链是如何制作的,编译链主要由三个开源库生成: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 ,加入本机的交叉编译链的路径;
ARM交叉编译_第2张图片

4.具体说明编译与编译

源代码:

//test.c
#include 

int main(int argc,char *argv[])
{
    int a = 0,b = 1;
    int sum;
    sum = a + b;
 
    printf("sum = %d\n",sum);
 
    return 0;
}

4.1.X86编译

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

4.2.X86平台交叉编译ARM生成可执行文件

//使用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平台的可执行文件。

你可能感兴趣的:(Linux应用开发,linux)