ref :http://www.360doc.com/content/14/0509/09/17268421_376009916.shtml

一、编译器相关知识学习

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

arm-elf-gcc是编译的前端程序,它通过调用其他程序来实现将程序源文件编译成目标文件的功能。
  编译时,它首先调用预处理程序(cpp)对输入的源程序进行处理,然后调用 cc1 将预处理后的程序编译成汇编代码,最后由arm-elf-as将汇编代码编译成目标代码。
  arm-elf-gcc具有丰富的命令选项,可以控制编译的各个阶段,满足用户的各种编译需求。

 

2. 汇编器 arm-elf-as

arm-elf-as将汇编语言程序转换为ELF (Executable and Linking Format,执行时链接文件格式)格式的可重定位目标代码,这些目标代码同其它目标模块或函数库易于定位和链接。
      arm-elf-as产生一个交叉参考表和一个标准的符号表,产生的代码和数据能够放在多个区 (Section)中。

 

3. 连接器arm-elf-ld

arm-elf-ld根据链接定位文件Linkcmds中的代码区、数据区、BSS区和栈区等定位信息,将可重定位的目标模块链接成一个单一的、绝对定位的目标程序。
该目标程序是ELF格式,并且可以包含调试信息。
       arm-elf-ld会产生一个内存映象文件Map.txt,该文件显示所有目标模块、区和符号的绝对定位地址。它也产生交叉参考列表,显示参考每个全局符号的目标模块。
       arm-elf-ld支持将多个目标模块链接成一个单一的、绝对定位的目标程序,也能够依此对目标模块进行链接,这个特性称为增量链接(Incremental Linking)。
     
 假如输入文件是一个函数库,arm-elf-ld会自动从函数库装载被其它目标模块参考的函数模块。arm-elf-ld与其它链接程序相比,能提供更有帮助的诊断信息。许多链接器遇到第一个错误即放弃链接,而arm-elf-ld只要有可能都继续执行,帮助用户识别其它错误,有时甚至能获得输出代码。

 

4. 库管理器arm-elf-ar

arm-elf-ar将多个可重定位的目标模块归档为一个函数库文件。采用函数库文件,应用程序能够从该文件中自动装载要参考的函数模块,同时将应用程序中频繁调用的函数放入函数库文件中,易于应用程序的开发管理。arm-elf-ar支持ELF格式的函数库文件.

 

5. 工程管理器MAKE

Make是用于自动编译、链接程序的实用工具,使用make后就不需要手工的编译每个程序文件。要使用make,首先要编写makefile。
     
 Makefile描述程序文件之间的依赖关系,并提供更新文件的命令。在一个程序中,可执行文件依赖于目标文件,而目标文件依赖于源文件。如果makefile文件存在,每次修改完源程序后,用户通常所需要做的事情就是在命令行敲入“make”,然后所有的事情都由make来完成。

 

6. 其他实用程序

目标文件格式转换工具arm-elf-objcopy支持的文件格式有H-record、S-record、ABS、BIN、COFF、ELF。例如,它能够将ELF格式文件转换为其它格式的文件,如intel
H-record格式、Motorola S-record等。arm-elf-nm程序用于显示文件中的符号信息。

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       将C/C++文件生成汇编文件
-o file   将输出内容存于文件file
-pipe    在编译的不同阶段之间采用管道通讯方式
-v      打印出编译过程中执行的命令
-x language  说明文件的输入类型为language
C语言选项:
-ansi          支持所有ANSI C程序
警告选项:
-w              关闭所有警告
-Wall          打开所有警告
-Wimplicit  如果有隐含申明,显示警告信息
-Wno-implicit  不显示对隐含申明的警告
调试选项:
-g    在文件中产生调试信息(调试信息的文件格式有stabs、COFF、XCOFF、DWARF)
优化选项:
-O0            不优化
-O1            一级优化
-O2            二级优化
-O3            三级优化
预处理选项:
-E       运行C的预处理器
-C       在运用-E进行预处理时不去掉注释
-D macro       定义宏macro为1
-D macro=defn  定义宏macro为defn
汇编选项:
-Wa,option    将选项option传递          给汇编器
搜索路径选项:
-I dir         设置搜索路径为dir
-I-       指定只对 #include  "file",有效的头文件搜索目录

3. 源文件类型的识别

arm-elf-gcc能够自动根据文件名后缀识别文件类型.
文件名后缀和文件类型的对应关系如下:
*.c   ——C源文件
*.i   ——经过预处理后的C源文件
*.h   ——C头文件
*.ii   ——经过预处理后的C++源文件
*.cc   ——C++源文件
*.cxx   ——C++源文件
*.cpp   ——C++源文件
*.C  ——C++源文件
*.s   ——不需要预处理的汇编文件
*.S  ——需要预处理的汇编文件
此外,用户可通过-x language说明文件的输入类型,此时可以不用以上的后缀规则。
-x language
其中的language可为:
c       ——C源文件
c++        ——C++源文件
c-header      ——C头文件
cpp-output   ——经过预处理后的C源文件
c++-cpp-output   ——经过预处理后的C++源文件
assembler   ——不需要预处理的汇编文件
assembler-with-cpp  ——需要预处理的汇编文件
例如,编译一个不需要预处理的C程序:
arm-elf-gcc –c –g –x  cpp-output test.c
arm-linux-objcopy

一.   arm-linux-objcopy被用来复制一个目标文件的内容到另一个文件中,可用于不同源文件的之间的格式转换
二.   示例:
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 不从源文件中复制调试符号到目标文件中

arm-linux-系列工具,ld,ar,as,objcopy的更多相关文章

  1. ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现

    ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现 承接 http://www.wowotech.net/pm_subsystem/suspend_and_re ...

  2. Linux下获取arm的交叉编译工具链

    转载请注明文章:Linux下获取arm的交叉编译工具链 出处:多客博图 这里介绍,Linux下获取arm的交叉编译工具链,比如arm-linux-gnueabihf-gcc.arm-linux-gne ...

  3. arm linux串口蓝牙工具移植及使用【转】

    本文转载自:http://blog.csdn.net/hclydao/article/details/51451725 p6212中串口蓝牙在linux下的使用记录 一.linux蓝牙工具移植 主要使 ...

  4. HK32F030MF4P6的Linux GCC工具链和VSCode开发环境

    HK32F030MF4P6简介 航顺的 HK32F030MF4P6, TSSOP20封装, Arm Cortex M0 内核, 内建32MHz时钟, 16K Flash, 2K RAM(实际上可用的有 ...

  5. 构建 ARM Linux 4.7.3 嵌入式开发环境 —— BusyBox 构建 RootFS

    上一篇我们已经成功将 ARM Linux 4.7.3 的内核利用 U-BOOT 引导了起来.但是细心的你会发现,引导到后面,系统无法启动,出现内核恐慌 (Kernel Panic). 原因是找不到文件 ...

  6. ARM Linux从Bootloader、kernel到filesystem启动流程

    转自:http://www.veryarm.com/1491.html ARM Linux启动流程大致为:bootloader ---->kernel---->root filesyste ...

  7. 009-2010网络最热的 嵌入式学习|ARM|Linux|wince|ucos|经典资料与实例分析

    前段时间做了一个关于ARM9 2440资料的汇总帖,很高兴看到21ic和CSDN等论坛朋友们的支持和鼓励.当年学单片机的时候datasheet和学习资料基本都是在论坛上找到的,也遇到很多好心的高手朋友 ...

  8. 【Qt开发】【VS开发】【Linux开发】OpenCV、Qt-MinGw、Qt-msvc、VS2010、VS2015、Ubuntu Linux、ARM Linux中几个特别容易混淆的内容

    [Qt开发][VS开发][Linux开发]OpenCV.Qt-MinGw.Qt-msvc.VS2010.VS2015.Ubuntu Linux.ARM Linux中几个特别容易混淆的内容 标签:[Qt ...

  9. 跟着鸟哥学Linux系列笔记2-第10章VIM学习

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 常用的文本编辑器:Emacs, pico, nano, joe, vim VI ...

随机推荐

  1. 第03组 Alpha事后诸葛亮

    组长博客 项目Postmortem模板 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们软件要解决的的问题是福州大学校园二手书的处理问题.应该定 ...

  2. npm link 的用法

    npm link 的用法 先到对应的自定义包下执行 npm link 会读取对应的 packagejson 中的名称 然后到对应的目录下执行 npm link your/own/npm/name 就会 ...

  3. GoCN每日新闻(2019-10-29)

    GoCN每日新闻(2019-10-29) GoCN每日新闻(2019-10-29)   1. Go 的发展传奇 https://spf13.com/presentation/the-legacy-of ...

  4. Flutter之网络请求

    Flutter之网络请求 一,介绍与需求 1.1,介绍 1,http一个可组合的,基于Future的库,用于发出HTTP请求.包含一组高级功能和类,可轻松使用HTTP资源.它与平台无关,可以在命令行和 ...

  5. win10中通过Anaconda安装tensorflow时报错Traceback (most recent call last): File “E:\Anaconda3\lib\site-packages\pip_vendor\urllib3\response.py”, line 360, in _error_catcher yield

    问题:通过默认镜像安装,下载过程中可能会报错,下载安装失败 Traceback (most recent call last): File “E:\Anaconda3\lib\site-package ...

  6. linux zip命令 tar命令 【压缩、解压缩】参数列表:

    linux zip命令参数列表:   -a 将文件转成ASCII模式 -F 尝试修复损坏的压缩文件 -h 显示帮助界面 -m 将文件压缩之后,删除源文件   -n 特定字符串 不压缩具有特定字尾字符串 ...

  7. IfcEdge

    /* Generated By: IFC Tools Project EXPRESS TO JAVA COMPILER: Do not edit this file!! */ package ifc2 ...

  8. 【GMT43智能液晶模块】例程二十二:USB_HID实验——双向数据传输

    源代码下载链接: 链接:https://pan.baidu.com/s/1iSAUQnHoLI3WRPm-DimeSA 提取码:69vp 复制这段内容后打开百度网盘手机App,操作更方便哦 GMT43 ...

  9. git rebase使用场景

    1. 当前分支落后拉取后,整理commit,使得提交历史为直线 git pull = git fetch + git merge git pull --rebase = git fetch + git ...

  10. 【Git】Gitlab添加SSH key可以pull不能push的问题

    背景:使用webhook 钩子进行代码的自动更新 完整过程: https://zhuanlan.zhihu.com/p/93223263 问题: 在进行git pull 时候.报错了 这是gitlab ...