|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
8 e/ C- ~; }% I% N+ P
一些编译器相关知识学习。 ^1 J2 l4 X6 C; c4 e
/ }# S; `, v7 [8 m; ~
GNU GCC简介:
6 [2 g$ B2 P/ y$ d& M6 r
) w+ [6 v' c( y- `4 H# P6 wGNU GCC是一套面向嵌入式领域的交叉编译工具,支持多种编程语言、多种优化选项并且能够支持分步编译、支持多种反汇编方式、支持多种调试信息格式,目前支持X86、ARM7、StrongARM、PPC4XX、MPC8XX、MIPS R3000等多种CPU。! l0 b% R1 \/ A: N. J. |
/ y. M8 r( d' ^
GNU GCC的基本功能包括:输出预处理后的C/C++源程序(展开头文件和替换宏)
1 K/ d6 i4 [) @- r
) t3 Z1 u. S9 M3 D, Z! B- J输出C/C++源程序的汇编代码3 }' q0 {0 x$ t3 Y( | ]3 f
- |3 s7 K5 S; a5 ?3 B# B
输出二进制目标文件
; `3 ^3 k6 L$ ]5 p. [: F( ?5 f
生成静态库% h' I: R9 F, x
: F. M7 n% _; A: y4 |% a' a
生成可执行程序- t& A3 ~# j6 {$ m8 ?' h& Y. ]! m
0 N+ T# s6 F1 R( O' T# G转换文件格式
1 U* z% h+ R2 n! M; C, h: j. r0 p' U' v' i9 g
GCC 组成:
. m+ ^8 i$ t( d, ]6 o5 F- z1 a0 r' _& @
1. C/C++交叉编译器arm-elf-gcc
2 U. {! {/ \! n* K5 b
$ {; Y" X5 k. R6 ^ \ arm-elf-gcc是编译的前端程序,它通过调用其他程序来实现将程序源文件编译成目标文件的功能。+ H9 o8 K; u+ v
( b5 ]# ^+ Z3 \9 R 编译时,它首先调用预处理程序(cpp)对输入的源程序进行处理,然后调用 cc1 将预处理后的程序编译成汇编代码,最后由arm-elf-as将汇编代码编译成目标代码。8 ~6 f0 Y( B' e* F/ J
- j' `7 W l4 t' t8 l arm-elf-gcc具有丰富的命令选项,可以控制编译的各个阶段,满足用户的各种编译需求。
* D( H& O, k" Y- l! x( o* F
* M F% a0 F0 C+ N, Y a2. 汇编器 arm-elf-as8 v+ t( o8 X [. a& G
3 a1 {+ p+ X. ]7 U% @0 f9 z9 d
arm-elf-as将汇编语言程序转换为ELF (Executable and Linking Format,执行时链接文件格式)格式的可重定位目标代码,这些目标代码同其它目标模块或函数库易于定位和链接。# f8 {/ N0 O/ G4 _4 K
4 |6 a( [7 q, x, ~) ?4 `: J arm-elf-as产生一个交叉参考表和一个标准的符号表,产生的代码和数据能够放在多个区 (Section)中。
! ^: G2 K# z3 J' Z6 o2 {4 W& m
/ ]5 O) O# Z2 L, l# L; K6 m7 Z3. 连接器arm-elf-ld
7 B. I$ m4 I* K; }8 A! t! y* L4 `( b$ j
arm-elf-ld根据链接定位文件Linkcmds中的代码区、数据区、BSS区和栈区等定位信息,将可重定位的目标模块链接成一个单一的、绝对定位的目标程序。- s) K" M& J7 Y- O+ n" M! L
9 \: h8 @8 L: n, B
9 N2 n' j5 @ P" V5 d/ W \0 T# G+ B" n, Y! ~ \
, y, b. m! Q& n% Y$ D& E
; J. {9 a0 Y% {- [7 H
8 K( P/ g* F/ I6 Q7 j9 R7 c1 ^! B! X4 C% e/ v. \) ^0 u
|
|