|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
" g' X6 m6 ]! D' X6 {一些编译器相关知识学习。
5 r. b7 A( k. H7 O. [) P. r2 ^- ?
GNU GCC简介:5 u& I2 Y% Z1 S( `
, y, h0 s' _5 `/ V4 n- A
GNU GCC是一套面向嵌入式领域的交叉编译工具,支持多种编程语言、多种优化选项并且能够支持分步编译、支持多种反汇编方式、支持多种调试信息格式,目前支持X86、ARM7、StrongARM、PPC4XX、MPC8XX、MIPS R3000等多种CPU。# K# o0 z) p7 H. l- u1 V" x7 c
! @9 \/ {( j8 w" }
GNU GCC的基本功能包括:输出预处理后的C/C++源程序(展开头文件和替换宏)
/ N" x1 Q) V, ?1 A: [! B
- g1 e! Q+ ~' y5 j* r输出C/C++源程序的汇编代码
; ^- l+ x- [7 h) v
3 y5 q7 h, h6 ^- |& Y输出二进制目标文件7 G; B7 H1 @4 I( p1 Y; U
) k1 V# _. k& M
生成静态库5 R+ A& Q% @( w y' C7 ?! ^" \
( c, k2 u, r! j/ a0 l生成可执行程序' S; ^/ P% ?5 A& }) x" L, T6 o
7 O5 A. k/ \$ A1 t
转换文件格式
6 e |% q# I6 p0 v3 _" G/ n6 C4 Z/ b% W
GCC 组成:4 j& r7 N( @: C6 t# d$ `6 M
' F5 {/ h% I: R# H( J5 @1. C/C++交叉编译器arm-elf-gcc& r# W" i" H8 |- }' u$ b
# [! N* j4 g- ]' S7 [& s
arm-elf-gcc是编译的前端程序,它通过调用其他程序来实现将程序源文件编译成目标文件的功能。! k" n* B- y& I5 x1 t$ e
4 O" z: z; b: J- A1 d1 q 编译时,它首先调用预处理程序(cpp)对输入的源程序进行处理,然后调用 cc1 将预处理后的程序编译成汇编代码,最后由arm-elf-as将汇编代码编译成目标代码。
; K/ O& O+ d- T# m6 e8 @" I0 a. K( A! x2 h5 n1 H2 N, ~
arm-elf-gcc具有丰富的命令选项,可以控制编译的各个阶段,满足用户的各种编译需求。
# u( | z% a" f% t$ K& H5 u) t2 V+ J
2. 汇编器 arm-elf-as
$ @( _6 [& V; ?, `, s# i! _0 d/ u. e- B0 R' y
arm-elf-as将汇编语言程序转换为ELF (Executable and Linking Format,执行时链接文件格式)格式的可重定位目标代码,这些目标代码同其它目标模块或函数库易于定位和链接。
: f0 Q% z8 z: [8 V: r. A
9 O% c. K: c. \5 n arm-elf-as产生一个交叉参考表和一个标准的符号表,产生的代码和数据能够放在多个区 (Section)中。
. D- H' e6 Y9 E2 a$ T1 v% }# \
: p# g1 r z0 e6 b0 V1 h' L3. 连接器arm-elf-ld2 P1 N/ q! M- F' [4 I
$ |6 P1 u8 S8 `+ Z3 T4 b arm-elf-ld根据链接定位文件Linkcmds中的代码区、数据区、BSS区和栈区等定位信息,将可重定位的目标模块链接成一个单一的、绝对定位的目标程序。
' o1 ? l1 C" U. T) m7 e2 j; _% T$ o1 _
: H- B2 z0 G! v4 j8 q/ o
! S) a$ W. |4 _+ g. y
: u! K) j& n I0 z# C1 W, V) i8 M$ R5 U8 U% s0 {
4 x+ B; @) A3 h- f$ B9 }: x
, w% o! G' q, ^- m4 d: I! z
|
|