编译器工具链(二)——交叉编译

编译器工具链

编译器工具链包含各种其他的二进制文件,以帮助整个编译过程。在某些情况下,编译器本身也是工具链的一部分。以下列表被打包在工具链中:

  • binutils(汇编器、链接器等)
  • 各种编译器(gcc、g++等)
  • C-Library(glibc、uClibc等)
  • 运行时库(crtbegin.o、crtend.o等)
  • 标准库(libstdc++、libm、libgcc、libunwind等)
  • 编译器特定的头文件(stdint.h、stdc-predef.h)
  • Sanitizer的运行时支持库(libasan、libubsan等)
    注意:根据不同的工具链提供商,并不是所有以上都会出现在工具链中。

交叉编译的概念

为了更好的理解 交叉编译的概念,让我们重新看以下编译器的定义。编译器这个词是指一个通过将源程序翻译成机器语言从而生成一个可执行文件并且可以在机器上运行的程序。通常,编译器被用来为编译器本身运行的机器(也包括相同架构的机器)生成可执行文件。例如,运行在linux-64机器上的编译器编译一个c++程序并生成一个可以在linux-64机器上运行的可执行文件。只要相似的环境被提供,该可执行文件可以在所有linux-64机器上运行。
然而,在某些情况下,我们希望为除编译器运行的机器以外的机器生成二进制文件。例如,目标机器本身不够强大。这类情况会经常出现在为嵌入式设备、移动应用程序等生成二进制文件时。交叉编译器生成的二进制文件会在其他机器(目标机器)上运行,而不是编译器本身所运行的机器(主机)上运行。这是一个稍微有些复杂的过程,因为它要求目标机器的所有依赖都出现在主机上。
例如,当为主机编译一个简单的hello-world程序时,会使用像/usr/include/stdio.h这样的头文件。为了生成交叉编译的hello-world程序,stdio.h会在不同的sysroot中找到。因此,编译器调用可能如下:

gcc --sysroot=/path/to/aarch64/sysroot -march=armv8-a hello.

这里简单说一下sysroot:
任何编译器都需要知道标准头文件、标准库和c运行时库的位置。对于任何架构(例如 arm64、x86等),所有的这些都被打包在一个名为sysroot的目录下。当我们编译一个程序时,需要将对应的路径传给sysroot,从而帮助编译器知道在编译期间去哪里查找标准头文件、以及在链接期间去哪里查找公共库(libc、libstdc++等)。
通常来说,我们为当前运行机器编译程序时,编译器会使用/usr/include中的标准头文件和/usr/lib中的库文件这些路径是在编译器本身中硬编码的,所以我们不需要考虑它。然而,当构建自定义编译器或交叉编译程序时,我们通过传递参数来告诉编译器sysroot的位置。例如:

gcc --sysroot="/path/to/arm64/sysroot/usr" hello.cpp

通常,交叉编译器工具链内会附带一个脚本/二进制文件,里面嵌入了一个sysroot路径(例如aarch64-linux-gnu-gcc) g+±10-aarch64-linux-gnu (10.3.0-8ubuntu1cross1)。

References:

https://learning.edx.org/course/course-v1:LinuxFoundationX+LFD113x+3T2021/block-v1:LinuxFoundationX+LFD113x+3T2021+type@sequential+block@5118c32dc04a485db2938fcc8ccb69de/block-v1:LinuxFoundationX+LFD113x+3T2021+type@vertical+block@3bdf89de70e24dac9e5f6d766845bacf

若文章中有出错或者不清楚的地方欢迎大家讨论指教!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值