程序的编译与链接——ARM可执行文件ELF

读书《嵌入式C语言自我修养》笔记

目录

ARM编译工具

使用readelf命令查看ELF Header

使用readelf命令查看ELF section header

程序编译

预处理器

 编译器

(1)词法分析。

(2)语法分析。

(3)语义分析。

(4)中间代码生成。

汇编器

(5)汇编代码生成。

链接器

(6)目标代码生成。


一、ARM编译工具

不同的ARM编译器开发商,会根据ARM指令集规定的标准指令去开发各自的编译器软件。目前市面上比较常见的编译器有ARM公司开发的ARMCC编译器、IAR ARM C/C++编译器、开源的GNU GCC for ARM交叉编译器。不同的IDE一般都会内嵌上面三种编译器中的一种,或者IDE和编译器分别独立发布,甚至有些IDE还可以通过配置,支持多种编译器。

各种厂商的编译器因为遵循同一套ARM指令集标准,因此经过不同编译器编译的程序都可以在同一台ARM处理器上运行。市面上各种ARM编译器之间的唯一的区别就是汇编指令的格式有所差异,造成差异的原因是各家编译器厂商各自扩展的伪操作(伪指令)不同,如图3-8所示:各家编译器厂商虽然都遵循同一套ARM指令集,但是都根据自己的产品需求和定位,各自扩展了不同的伪操作。

这些伪操作主要用来辅助程序员在编程时定义数据,定义不同的代码段和数据段,设计汇编程序的分支跳转结构,以及用来将汇编指令组装成一个可以运行的汇编程序。

gcc-arm-linux-gnueabi交叉编译器

linux安装gcc-arm-linux-gnueabi交叉编译器

apt-get install gcc-arm-linux-gnueabi-gcc   //Ubuntu

yum install gcc-arm-linux-gnueabi gcc  //Fedora

使用ARM交叉编译器将C源程序编译生成ARM格式的二进制可执行文件a.out

arm-linux-gnueabi-gcc -o a.out main.c sub.c

使用readelf命令查看ELF Header

readelf -h a.out

使用readelf命令查看ELF section header

readelf -S a.out

 一个可执行文件通常由不同的段(section)构成:代码段(.text)、数据段(.data)、BSS段、只读数据段等。每个section用一个section header来描述,包括段名、段的类型、段的起始地址、段的偏移和段的大小等。一个可执行文件中的每一个section都有一个section header,将这些section headers集中放到一起,就是section header table

函数翻译成二进制指令放在代码段中

初始化的全局变量和静态局部变量放在数据段中。

BSS段比较特殊,一般来讲,未初始化的全局变量和静态变量会放置在BSS段中,但是因为它们未初始化,默认值全部是0,其实没有必要再单独开辟空间存储,为了节省存储空间,所以在可执行文件中BSS段是不占用空间的。但是BSS段的大小、起始地址和各个变量的地址信息会分别保存在节头表section header table和符号表.symtab里,当程序运行时,加载器会根据这些信息在内存中紧挨着数据段的后面为BSS段开辟一片存储空间,为各个变量分配存储单元。

二、程序编译

编译器到底是什么?在很多人的概念中,编译器可能就是一个gcc命令,用来将C源程序编译成可执行文件。其实编译器不仅仅是一个简单的gcc或arm-linux-gcc命令,而是一套完整的工具集。gcc在程序编译过程中会调用一系列的编译工具,常见的工具有预处理器、编译器、汇编器、链接器。

  • 预处理器:将源文件main.c经过预处理变为main.i
  • 编译器:将预处理后的main.i编译为汇编文件main.s
  • 汇编器:将汇编文件main.s编译为目标文件main.o
  • 链接器:将各个目标文件main.o、sub.o链接成可执行文件a.out。最后生成的可执行文件a.out其实也是目标文件(object file)
  • 二进制转化工具:objdump、objcopy、strip等。
  • 库打包工具:ar。
  • 调试工具:gdb、nm。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值