1、嵌入式开发模型-交叉开发

在嵌入式开发过程中有宿主机和目标机的角色之分,宿主机是执行编译、链接嵌入式软件的计算机,目标机是运行嵌入式软件的硬件平台。在宿主机执行编译的流程如下:

而所谓的交叉编译就是:在一种平台上编译,编译出来的程序,是放到别的平台上运行,即编译的环境和运行的环境不一样,属于交叉编译,主要和嵌入式开发有关。之所以要有交叉编译,主要原因是:嵌入式系统中的资源太少。

2、工具链

和程序编译链接等相关的gcc,binutils等工具按照先编译后链接等相关的编译程序的内在逻辑串起来,就成了我们所说的:工具链。工具链主要包括Binutils(汇编工具)、GCC(编译器)和Glibc(标准C函数库),主要用于把源代码编译连接生成可执行程序。
我们也常把交叉工具链,简称为交叉编译器。严格意义上,交叉编译器只是指的是交叉编译版本的gcc。但是为了方便,我们常说的交叉编译器都是指的交叉编译版本的gcc,比如arm-linux-gcc,包含一系列交叉编译版本的交叉工具链:arm-linux-gcc,arm-linux-ld,arm-linux-as等。

关于更多工具链知识,可以参考http://www.crifan.com/files/doc/docbook/cross_compile/release/html/cross_compile.html#what_is_toolchain

3、 Glibc基本作用

在执行辅助命令make命令时,会调用工具链里的编译器GCC进行编译,使用汇编器Binutils链接到C函数库Glibc,将源代码转换成可执行程序。

Glibc是C函数库是内核与应用程序的中间部分,主要提供C函数库文件。安装Glibc就是在/lib安装一系列的库文件,直接在链接阶段就将库文件链接到可执行文件中,叫静态库。静态库文件是/lib目录下的.a文件;在程序运行时才被载入叫动态库,动态库文件是/lib下的.so文件。Glibc是C函数库,Linux的命令执行过程中都要调用Glibc,其他的函数库也会调用Glibc,Glibc再去调用系统中的内核,内核再进行资源分配。Gcc和Binutils是应用程序,会引用里面的C函数库的库文件,同时使用工具链编译出来的程序软件也会调用Glibc函数库里的库文件。

4、Binutils基本作用

Binutils 是GNU工具之一,它包括连接器、汇编器和其他用于目标文件和档案的工具,它是二进制代码的处理维护工具。安装Binutils工具包含的程序有 addr2line、ar、as、c++filt、gprof、ld、nm、objcopy、objdump、ranlib、readelf、size、 strings、strip、libiberty、libbfd和libopcodes。
● addr2line 把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。
● ar 建立、修改、提取归档文件。归档文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。
● as 主要用来编译GNU C编译器gcc输出的汇编文件,产生的目标文件由连接器ld连接。
● c++filt 连接器使用它来过滤 C++ 和 Java 符号,防止重载函数冲突。
● gprof 显示程序调用段的各种数据。
● ld 是连接器,它把一些目标和归档文件结合在一起,重定位数据,并连接符号引用。通常,建立一个新编译程序的最后一步就是调用ld。
● nm 列出目标文件中的符号。
● objcopy 把一种目标文件中的内容复制到另一种类型的目标文件中。
● objdump 显示一个或者更多目标文件的信息。使用选项来控制其显示的信息,它所显示的信息通常只有编写编译工具的人才感兴趣。
● ranlib 产生归档文件索引,并将其保存到这个归档文件中。在索引中列出了归档文件各成员所定义的可重分配目标文件。
● readelf 显示elf格式可执行文件的信息。
● size 列出目标文件每一段的大小以及总体的大小。默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。
● strings 打印某个文件的可打印字符串,这些字符串最少4个字符长,也可以使用选项-n设置字符串的最小长度。默认情况下,它只打印目标文件初始化和可加载段中的可打印字符;对于其他类型的文件它打印整个文件的可打印字符。这个程序对于了解非文本文件的内容很有帮助。
● strip 丢弃目标文件中的全部或者特定符号。
● libiberty 包含许多GNU程序都会用到的函数,这些程序有getopt、obstack、strerror、strtol和strtoul。
● libbfd 二进制文件描述库。
● libopcode 用来处理opcodes的库,在生成一些应用程序的时候也会用到它。

5、gcc基本用法

作为开端的最简单的一个例子就是将一个C源文件编译成为一个可执行文件。在这个例子中,所需要的整个源码包含在一个文件中,所以我们使用下面的GCC命令

$gcc  test.c -o test

在这里我们编译test.c文件并且生成一个名为test的可执行言论。如果在这里我们仅是希望生成这个源码的目标文件,我们可以使用-c选项,如下:

$gcc -c  test.c

默认情况下将会生成名为test.o的目标文件。但是在这里我们希望生成的目标文件名为newtest.o,我们可以用下面的命令:

$gcc -c test.c -o newtest.o

我们将要开发的大多数程序都会包含不只一个文件。GCC可以很容易的在命令行处理这种情况:

$gcc -o image first.c second.c third.c

在这里我们编译三个源文件并且将他们链接到名为image的可执行文件。

加入讨论

【编译原理】交叉工具链详解相关推荐

  1. ARM 编译工具链详解

    ARM 编译工具链详解 GNU Arm Embedded Toolchain 是用于 C/C++ 和汇编编程的即用型开源工具套件.GNU Arm 嵌入式开发工具链适用于 32 位 Arm Cortex ...

  2. crosstool-ng 编译交叉工具链的常见错误及解决办法

    1.配置crosstool-ng产生的错误 1.1 ncurses headers files were not found Checking for 'ncurses/ncurses.h'... n ...

  3. Linux文本编译工具VIM详解

    Linux文本编译工具VIM详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.VIM概述 1>.vim简介 1>.vi: 全称Visual editor,即文本编 ...

  4. 交叉编译(交叉工具链)

    一.交叉编译(交叉工具链) 在一个环境下编译生成一个可以在另一个环境中执行的可执行文件的工具 本地编译命令 gcc 实现把高级语言的C文件,翻译成二进制文件 是可以在虚拟机中找到的: which gc ...

  5. 交叉工具链的搭建方法(测试成功)

    之前安装了一个rehat6的linux系统,把交叉编译搭建给忽视了,结果在编译uboot的时候出现问题,显示找不到arm-linux-gcc.于是自己来搭建交  叉编译环境.出现好多错.先是解压时没在 ...

  6. Fuzz工具使用详解

    Fuzz工具使用详解 (1)wfuzz 描述:wfuzz 是一款Python开发的Web安全模糊测试工具.简而言之就是wfuzz可以用在做请求参数参数类的模糊测试,也可以用来做Web目录扫描等操作. ...

  7. 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705 参考博客 : [嵌入式开发]嵌入式 开发环境 (远程 ...

  8. 开发环境搭建---交叉工具链、makefile编写、连接器脚本、Eclipse调试

    交叉工具链 安装: 将arm-linux-gcc-4.3.2.tgz文件解压到linux根目录/下,可以发现解压后的文件在/usr/local/arm/4.3.2/文件下. 然后修改环境变量:执行命令 ...

  9. Nginx 反向代理工作原理简介与配置详解

    Nginx 反向代理工作原理简介与配置详解 测试环境 CentOS 6.8-x86_64 nginx-1.10.0 下载地址:http://nginx.org/en/download.html 安装 ...

最新文章

  1. hadoop磁盘空间不均衡的解决办法
  2. (运维)VMware-vCenter-Server-Appliance-5.0安装与部署
  3. 如何使盘ISO图像文件
  4. IPv6的利与弊—Vecloud微云
  5. 图像阈值处理cv2.threshold()函数(python)
  6. 200 道算法面试题集锦!Python 实现,含华为、BAT 等校招真题!
  7. hive 分区_代码 | Spark读取mongoDB数据写入Hive普通表和分区表
  8. 利用等积变换巧解三角形面积问题
  9. 输入一个三位正整数,输出百位数,十位数,个位数
  10. 使用Powershell自动化Linux,macOS和Windows进程
  11. gnuplot画图命令_Gnuplot科学绘图(二十六)——image 绘图
  12. 24K 内存上诞生的操作系统,是如何改变计算机世界的?
  13. 蓝桥杯2020年第十一届C/C++国赛C组第一题-约数个数
  14. MySQL — 创建表,插入数据,更新数据,删除数据
  15. Eclipse3.5的使用配置
  16. mybatis配置指定的数据库连接池、mybatis配置多个数据源
  17. chage 修改用户密码的有效期限
  18. 2013年04月12日 JavaEE+物联云计算就业班-上海
  19. js判断对象上是否含有某个属性
  20. LTE解MIB块,LTE中PBCH过程

热门文章

  1. Python:使用API——使用Pygal可视化仓库
  2. 世界杯来了!谁能夺冠?让我们用数据说话
  3. tipsy - Facebook-style tooltip plugin for jQuery
  4. 简单讲述SMTP 电子邮件标题注入
  5. 考研数据结构复试题目整理
  6. 电脑常用笔记及软件个人存档
  7. 项目使用Spring Cloud做配置管理
  8. 【供参考,博主已经没有实验环境了】【中山大学东校区】【中大】【tp-link wr703n】【openwrt】【校园网inode】【无线路由】新版教程-搭载最小的认证客户端【C版oh3c】
  9. Fintech公开课丨黄嵩:数字化转型本质论
  10. IOS 监听slider滑动