编译器工具链(二)——交叉编译
编译器工具链
编译器工具链包含各种其他的二进制文件,以帮助整个编译过程。在某些情况下,编译器本身也是工具链的一部分。以下列表被打包在工具链中:
- 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
若文章中有出错或者不清楚的地方欢迎大家讨论指教!!!
编译器工具链(二)——交叉编译相关推荐
- Arm Compiler for Embedded 6 编译器工具链常用选项
目录 1,标准的 armclang 编译选项 1.1 --target选项:指定执行状态 aarch64-arm-none-eabi arm-arm-none-eabi 1.2 -march选项:指定 ...
- 编译器工具链初步解析
GNU 一般编译器分为三个stage: cc1,as,ld. 预处理器:cc1 编译器:cc1 →输出汇编代码 (* .s) 汇编程序:as → 输出目标文件 (* .o) 链接器:ld (colle ...
- 交叉编译器工具链的使用
在hi3536中使用的是arm-hisiv400-linux- ,使用的是glibc 在hi3516中使用的是arm-hisiv300-linux-,使用的是ulibc
- 各种交叉编译工具链的区别
目录 1 命名规则 2 实例 2.1 arm-none-eabi-gcc 2.2 arm-none-linux-gnueabi-gcc 2.3 arm-eabi-gcc 2.4 armcc 2.5 a ...
- Linux在Ubuntu虚拟机安装交叉编译工具链
1.进入Linaro官网下载ARM交叉编译器工具链. 官网连接如下: https://releases.linaro.org/components/toolchain/binaries/4.9-201 ...
- 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705 参考博客 : [嵌入式开发]嵌入式 开发环境 (远程 ...
- 如何选取 android 系统上的编译工具链
https://mdgsf.github.io/2020/07/23/miscellanea-cpu/ 先介绍一些基础背景知识. Intel. 我们一般买的电脑都是 Intel 的 CPU. AMD. ...
- gcc for arm 工具链使用(一)
文章目录 前言 一.编译链接过程 二.编译器驱动程序arm-none-eabi-gcc的使用 1. 处理器架构选项 2. C 标准库的选择 3. 语言标准类常用选项 4. Overall 类选项(控制 ...
- java中fido_使用YOCTO fido分支创建的工具链问题
repo sync checkout这些特定的提交 cd / arm / fsl-community-bsp-fido / sources / meta-fsl-arm / git checkout ...
最新文章
- jquery DataTable默认显示指定页
- HDU2604 Queuing
- linux 用journalctl --vacuum-size=10M命令清理/var/log/journal目录下的日志文件
- 如何搭建一个数据库服务器平台 .
- JavaScript的基本语法
- Google的Project Stream准备在Chrome中播放AAA控制台游戏
- 博客主题正在修改....
- 新增5大运维特性!华为云DAS服务高效运维有妙招
- 大数据_Spark框架_快速上手_word count 案例-功能实现---Spark工作笔记0007
- easyui源码翻译1.32--Window(窗口)
- matlab中rgb转hsv,matlab实现RGB与HSV(HSB)、HSL和HSI的色彩空间互转
- 遥感计算机解释技术PPT,梅安新 遥感导论.ppt
- 打开excel很慢的解决方法
- php汽车租赁网站_ThinkPHP实战开发汽车租赁网站项目教程
- java导出excel 乱码_java导出excel时出现文件名乱码解决方法
- 蓝牙音箱电路板原理图_一文看懂音响电路图及工作原理
- 密码学的安全性浅析4
- 源发行版17需要目标发行版17
- matlab算sma,[转载]通达信公式SMA函数计算方式的问题
- 搜狗拼音输入法 打不了中文