程序的编译、链接、安装和运行

    在wi n d o w s 开发一个 C 程序 会用到 集成开发环境 比如 VC++ Keil 之类的 IDE 使用方便 IDE 工具 我们封装好了 工程 管理器 编译器 汇编 链接器 调试器 二进制工具

嵌入式开发环境一般不太一样处理器平台和软件生态碎片多样化为了提高性价比不同嵌入式系统往往采取灵活配置不同CPU 平台不同大小存储不同启动方式导致我们编译程序时有时候不仅考虑一个嵌入式平台内存存储器地址空间还要考虑我们程序代码什么地方加载内存什么地方如何执行这就要嵌入式工程师必须了解程序运行背后如何编译链接运行有了这些理论支撑我们才可以灵活根据硬件平台差异完成软件层面编译优化配置

4.1 源程序二进制文件

程序编译过程其实就是将我们编写C程序翻译CPU能够识别运行二进制机器指令过程关于C程序我们已经很熟悉一个C程序主要一行行C语言语句构成不同的语句构成一个代码或者函数每个语句C语言关键字运算符预处理命令用户定义变量名函数名很多token构成一个C语言项目通常多个文件组成

int add(int a, int b)

{

return a + b;

}

int sub(int a, int b)

{

return a - b;

}

sub.h

int add(int a, int b);

int sub(int a, int b);

main.c

#include <stdio.h>

#include "sub.h"

int global_val = 1;

int uninit_val;

int main(void)

{

int a, b;

static int local_val = 2;

static int uninit_local_val;

a = add(2, 3);

b = sub(5, 4);

}

上面程序中我们创建了2C原文件main.csub.c main.c定义项目入口函数main(), main() 函数我们调用add() sub()函数数据进行运算add(), sub函数sub.c 文件中定义sub.h声明main.c调用两个函数我们先包涵头文件

以上就是一个典型C程序项目多文件组织形式可以sub.c看作一个模块定义很多API函数其他模块调用

arm-linux-gnueabi0gcc 0o a.out mian,c sub.c

./a.out

生成二进制文件复制ARM平台就可以直接运行ARM交叉编译成功C源程序翻译可执行文件可以readelf 指令读取a.out 查看文件信息

readelf -h a.out

ELF Header:

Magic 7f 45 4c 46 01 01 00 00 00 00 00 00 00 00 00

Class: ELF32

DATA: 2.s complement, little endian

Version: 1

OS/ABI: unix-System V

ABI Version: 0

Type: exec

Machine: ARM

Version: 0x1

Entry point address: 0x10310

Start of program headers: 52(bytes into file)

Start of section headers: 7360(bytes into file)

Flags: 0x500200,Version EABI, soft-float ABI

size of this heafer: 52 bytes

Size of program headers: 32

Number of program headers: 9

size of section headers: 40

NUmber of section headers: 30

Section header string table index: 27

你可能感兴趣的:(单片机,嵌入式硬件)