一些编译器相关知识学习。
GNU GCC简介:
GNU GCC是一套面向嵌入式领域的交叉编译工具,支持多种编程语言、多种优化选项并且能够支持分步编译、支持多种反汇编方式、支持多种调试信息格式,目前支持X86、ARM7、StrongARM、PPC4XX、MPC8XX、MIPS R3000等多种CPU。
GNU GCC的基本功能包括:输出预处理后的C/C++源程序(展开头文件和替换宏)
输出C/C++源程序的汇编代码
输出二进制目标文件
生成静态库
生成可执行程序
转换文件格式
GCC 组成:
1. C/C++交叉编译器arm-elf-gcc
2. 汇编器 arm-elf-as
3. 连接器arm-elf-ld
该目标程序是ELF格式,并且可以包含调试信息。
4. 库管理器arm-elf-ar
5. 工程管理器MAKE
6. 其他实用程序
GCC编译程序的基本过程:
arm-elf-gcc根据输入文件的后缀来确定文件的类型,然后根据用户的编译选项(包括优化选项、调试信息选项等)将其编译成相应的汇编临时文件(后缀为.s);
arm-elf-as将该汇编文件编译成目标文件(后缀为.o);
arm-elf-ld 根据用户的链接选项(包括指定链接命令文件等)将目标文件和各种库链接起来生成可执行文件。
C/C++交叉编译器arm-elf-gcc
arm-elf-gcc是编译的前端程序,它通过调用其他程序来实现将程序源文件编译成目标文件。
编译时它首先调用预处理程序(cpp)对输入的源程序进行处理;然后调用cc1将预处理后的程序编译成汇编代码;最后由arm-elf-as将汇编代码编译成目标代码。
1.命令格式
arm-elf-gcc [options] file…
在命令arm-elf-gcc后面跟一个或多个选项,选项间用空格隔开,然后跟一个或多个目标文件。
例如,将test.c 编译成目标文件test.o 并且生成调试信息:
arm-elf-gcc –g –c –o test.o test.c
2.命令选项列表
输出控制选项:
-c
-S
-o file
-pipe
-v
-x language
C语言选项:
-ansi
警告选项:
-w
-Wall
-Wimplicit
-Wno-implicit
调试选项:
-g
优化选项:
-O0
-O1
-O2
-O3
预处理选项:
-E
-C
-D macro
-D macro=defn
汇编选项:
-Wa,option
搜索路径选项:
-I dir
-I-
3. 源文件类型的识别
arm-elf-gcc能够自动根据文件名后缀识别文件类型.
文件名后缀和文件类型的对应关系如下:
*.c
*.i
*.h
*.ii
*.cc
*.cxx
*.cpp
*.C
*.s
*.S
此外,用户可通过-x language说明文件的输入类型,此时可以不用以上的后缀规则。
-x language
其中的language可为:
c
c++
c-header
cpp-output
c++-cpp-output
assembler
assembler-with-cpp
例如,编译一个不需要预处理的C程序:
arm-elf-gcc –c –g –x
arm-linux-objcopy
2010-03-17 13:30:33|
一.
二.
Arm-linux-objcopy –o binary –S elf_file bin_file
三.
input-file , outflie
输入和输出文件,如果没有outfile,则输出文件名为输入文件名
2.-l bfdname或—input-target=bfdname
用来指明源文件的格式,bfdname是BFD库中描述的标准格式名,如果没指明,则arm-linux-objcopy自己分析
3.-O bfdname 输出的格式
4.-F bfdname 同时指明源文件,目的文件的格式
5.-R sectionname 从输出文件中删除掉所有名为sectionname的段
6.-S 不从源文件中复制重定位信息和符号信息到目标文件中
7.-g 不从源文件中复制调试符号到目标文件中
原文:http://blog.sina.com.cn/s/blog_875c12ae0100ukzx.html