|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
- w" h0 [2 ~, ?! n# g
一些编译器相关知识学习。# B1 b- I: `( [
* [7 O! D) J/ `2 pGNU GCC简介:8 f% e- f/ B+ z7 [' A; b7 o& y- f
) R: s. {* e# S* p+ j* r# m( x( i7 o
GNU GCC是一套面向嵌入式领域的交叉编译工具,支持多种编程语言、多种优化选项并且能够支持分步编译、支持多种反汇编方式、支持多种调试信息格式,目前支持X86、ARM7、StrongARM、PPC4XX、MPC8XX、MIPS R3000等多种CPU。
8 }8 V1 ]6 B# I
2 r' B8 S7 q% _* `GNU GCC的基本功能包括:输出预处理后的C/C++源程序(展开头文件和替换宏)
4 i, B- b ?; N5 ?5 J( [9 Y4 d1 O# y( N, i0 g/ V4 h
输出C/C++源程序的汇编代码* Z( g6 ?/ o g) J3 u
, g/ z/ A2 e4 j: s4 G4 @输出二进制目标文件
o$ m" @+ e0 v6 c) Q. E' U* b! m8 l
生成静态库2 r z! L# r: C0 K. f" U! s0 J: w
+ {& v; u% @" g
生成可执行程序
7 ?$ T9 h+ O2 I) z0 ` R! z3 u- Y" Q. K* M, J) e }
转换文件格式
$ z3 B/ q5 z$ p4 u* `7 M- d6 V
1 k+ [- X0 i- C- f: dGCC 组成:
, z: y6 s [' Y! h0 E6 j: \- V3 J% g4 y T+ s) y0 a6 }0 M
1. C/C++交叉编译器arm-elf-gcc
! x) J J" B0 X) A7 ^: A" X' b: {6 i* S$ d/ P7 J* e' Y
arm-elf-gcc是编译的前端程序,它通过调用其他程序来实现将程序源文件编译成目标文件的功能。
& E X6 y* g! [" ^, o/ V- v; _7 j' C
7 R' A P5 v+ d7 J: f 编译时,它首先调用预处理程序(cpp)对输入的源程序进行处理,然后调用 cc1 将预处理后的程序编译成汇编代码,最后由arm-elf-as将汇编代码编译成目标代码。) V$ Y0 Z7 c; Y' [+ b/ C# D( X4 J
+ S+ O3 N) ^1 n u arm-elf-gcc具有丰富的命令选项,可以控制编译的各个阶段,满足用户的各种编译需求。
; d5 ?( ^' e9 B# E8 b& }6 {* V0 a& c& n# \2 [8 [0 c# J' l' h; G0 E# N
2. 汇编器 arm-elf-as0 r: n* T6 t r5 ?& a
* B' @9 }' m+ F q. v# w
arm-elf-as将汇编语言程序转换为ELF (Executable and Linking Format,执行时链接文件格式)格式的可重定位目标代码,这些目标代码同其它目标模块或函数库易于定位和链接。
9 K, c/ v* ?* T- p: \# K( P; ?% K1 X7 T" Q
% n* K9 \) y7 _ O arm-elf-as产生一个交叉参考表和一个标准的符号表,产生的代码和数据能够放在多个区 (Section)中。
. i$ o: Y% z* d5 i" f% n \1 a U( w
3. 连接器arm-elf-ld! v- ]1 g: F; [
( k2 A& }+ `" g6 X* I
arm-elf-ld根据链接定位文件Linkcmds中的代码区、数据区、BSS区和栈区等定位信息,将可重定位的目标模块链接成一个单一的、绝对定位的目标程序。
% R3 y6 s3 R% @ {, O* P4 ~9 h
G" U8 J% e7 N$ p8 c# l; e- I k/ t: I I$ i) s9 C3 }1 c7 {1 R
B P x5 I E% L" h' }. S+ @: N, i z( A: l* K
# M) k% A4 B$ M4 N- r' R5 `* q6 } C+ K' P: k H6 s: W
" z( l! E+ E/ y# R2 z
|
|