ARM交叉编译工具链

交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到ARM CPU平台上才能运行,虽然两个平台用的都是Linux系统。

交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发环境,交叉编译工具链主要由binutils、gcc和glibc三个部分组成。

免费版目前有三大主流工具商提供,第一是GNU(提供源码,自行编译制作),第二是 CodeSourcery,第三是Linaro。

(以上摘自:http://www.veryarm.com/cross-tools)

常用工具

下面列出的都是开发过程中编译,调试常用的工具。以GNU GCC 工具链为例讲解,其他的交叉编译工具链,一样存在下面的工具,只是名字前应该加上$(CROSS_COMPILE),形如:$(CROSS_COMPILE)gcc, $(CROSS_COMPILE)objdump

[1] 编译

gcc hello.c

[2] 汇编

ar hello.s -o hello.o

[3] 链接

ld hello.o -o hello

[4] 格式转换

objcopy --gap-fill=0xff(填充1) -O binary(目标文件格式) -S hello(ELF格式的可执行文件) hello.bin

[5] 反汇编

objdump -D hello > hello.dis

[6] 查看文件格式

file hello

[7] 读取ELF文件中的符号表

nm hello > hello.map

[8] addr2line根据地址(程序的崩溃点)找到源代码

gcc hello.c -o hello -g                          编译时加调试信息

nm hello | grep main                          找到main函数的地址

addr2line 0x4052d(地址) -e hello(带调试信息的elf文件) -f(显示地址对应源代码在哪个函数中)

[9] 静态库制作

ar -rv libhello.a hello.o ...

[10] 查看依赖的动态库

ldd hello

[11] 阅读elf文件头

readelf -h hello

[12] 查询可执行文件需要的动态库

readelf -d hello

[13] 查看ELF文件大小

size -A hello

size -B hello

[14] 查文件中的字符串(符合C语言标准的字符串)

strings hello

[15] 去掉ELF文件的符号表

strip hello

编译(GCC)

1. 编译过程分析

预处理------------->编译(检查语法错误)----------------->汇编-------------->链接

-E                         -S                                                       -c                       -o

生成.i 文件           生成.s 文件                                         生成.o 文件       生成可执行文件ELF

预处理阶段:在源代码进行编译前,对我们的头文件或者宏定义进行解析。

编译:这个阶段注意是检查代码的规范性,是否有语法错误等。以确定代码的实际要做的工作。在检查无误后,就把代码翻译成汇编代码。

汇编:这个阶段就是把我们的已经生成好了的汇编代码转换成我们的目标文件(二进制)。

链接:生成可执行代码。链接所需要的库文件。普通C程序默认到/usr/lib中寻找链接的库。

实例:

gcc hello.c -o hello.i -E               预处理

gcc hello.i -o hello.s -S               编译

gcc hello.s -o hello.o -c              汇编

gcc hello.o -o hello                     链接

2. 编译参数解析

1)常用编译选项

命令格式

含义

-E

预处理选型,预处理操作的时候使用

-S

编译选项,把预处理过的代码编译成汇编代码

-c

汇编选项,生成我们的目标文件

-o

把编译的内容,指定保存到指定输出的文件

-g

生成gdb调试所需要的符号信息

-L

指定库文件的位置,绝对地址

-l

指定程序要链接的库(第三方提供的库)

-I

指定头文件的位置

-m

指定编译程序的位数,通常是-m32

-static

链接时使用静态库

-Wall

输出警告信息

-D

定义宏,可以传入程序中

-O

指定优化等级

-std=

使用何种标准(c89,c99,gun89)进行编译

-ansi

指定ANSI C 标准特性

-pedantic

严格执行ANSI C标准

2)Yocto poky 1.8 toolchain 编译选项(因为工作原因,经常用到,这里也简单介绍一下)

-Wall

-O2

代码优化等级指定为2

-mcpu=cortex-a9

指定目标CPU的名称

-mfloat-abi=hard

采用硬浮点运算(vfp, neon等)

-DFSL_ARM=1

定义宏参数FSL_ARM=1

-march=armv7-a

指定CPU支持的指令集

-mfpu=neon

采用neon 型硬浮点指令

-mtune=cortex-a9

可以根据这个选项调整代码的性能,但是指令生成还是要基于’-mcpu=’的指定

-fsigned-char

设置char类型为signed char

-mthumb-interwork

允许产生支持Thumb和ARM指令集间调用的代码

-feliminate-unused-debug-types

在编译的源文件中没有使用的类型, 不生成调试符号输出

交叉编译基础知识总结(1)相关推荐

  1. 交叉编译基础知识总结(3)

    交叉编译源码包(tarball) 在我们的i.MX上需要用到第三方提供的tool时,我们需要交叉编译源码包,得到可执行文件,然后放在i.MX上执行.网络上流行的工具源码包,都有固定的编译步骤,按照步骤 ...

  2. 交叉编译基础知识总结(2)

    工程管理器-make make是一个自动编译管理器,能够根据文件时间戳自动发现更新过的文件从而减少编译的工作量,同时,它通过读入Makefile文件的内容来执行大量的编译工作,用户只需要编写一次简单的 ...

  3. 嵌入式linux编程,嵌入式Linux学习笔记 - 嵌入式Linux基础知识和开发环境的构建_Linux编程_Linux公社-Linux系统门户网站...

    注:所有内容基于友善之臂Mini2440开发板 一.嵌入式Linux开发环境的构建 嵌入式开发一般分为三个步骤: 1.编译bootloader,烧到开发板 2.编译嵌入式Linux内核,烧到开发板 3 ...

  4. (零)音视频技术基础知识,现实项目

    前言 耽误了很久,一直想写音视频开发的教程,一方面,音视频的发展正在向各个行业扩展,从教育的远程授课,交通的人脸识别,医疗的远程就医等,音视频方向已经占据一个相当重要的位置,而音视频真正入门的文章又少 ...

  5. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之第一个驱动

    文章目录 前言 1.Hello驱动 1.1.APP打开的文件在内核中如何表示? 1.2.打开字符设备节点时,内核中也有对应的struct file 1.3.如何编写驱动程序? 1.4.驱动程序代码 1 ...

  6. 【嵌入式Linux】嵌入式Linux应用开发基础知识之I2C应用编程和SMBus协议及AP3216C应用编程

    文章目录 前言 1.IIC协议和SMBUS协议 1.1.IIC协议 1.1.1.硬件框架 1.1.2.软件框架 1.1.3.读写数据格式 1.1.4.硬件结构--在硬件上是如何实现双向传输 1.2.S ...

  7. 【嵌入式Linux】嵌入式Linux应用开发基础知识之输入系统应用编程

    文章目录 前言 1.输入系统应用编程 1.1.输入系统框架及调试 1.1.1.框架概述 1.1.2.编写APP需要的基础知识 1.2.调试技巧 1.2.1.查看设备信息 1.2.2.使用命令查看节点数 ...

  8. 【分享】4412开发板-嵌入式Linux开发须要掌握的基础知识和技能

    本文转自迅为电子论坛:http://www.topeetboard.com 1.Linux 基础 安装Linux操作系统 Linux文件系统 Linux经常使用命令 Linux启动过程具体解释 熟悉L ...

  9. 嵌入式Linux开发环境搭建-4-嵌入式编程基础知识

    嵌入式Linux开发环境搭建-4-嵌入式编程基础知识 1.安装代码编辑器 2.交叉编译工作使用 1.安装代码编辑器 参考文档 ubuntu几款好用的代码编辑器_百度经验 安装sublime text ...

最新文章

  1. 文件的文本打开方式和二进制打开方式的区别
  2. NC14250 MMSet2
  3. Objective-C之MRC、ARC模式下,属性修饰关键字strong、retain、assign、weak的区别和联系...
  4. Qt下简单的文件读取
  5. Eclipse之Undefined attribute name 警告解决办法
  6. python qt gui与数据可视化编程 pdf_《Python Qt GUI与数据可视化编程》第13章
  7. Silverlight3 加载其他xap
  8. C#学习笔记(十八):数据结构和泛型
  9. atitit.自适应设计悬浮图片的大小and 位置
  10. 如何去掉word向下箭头(手动换行符)
  11. owncloud server replied : locked 故障处理
  12. 网文版ChatGPT来了:大模型辅助写作,澜舟和中文在线联手出品
  13. 音频技术的下一个“热点”,会出现在哪个领域?丨一期一会 • 音频工程师专场
  14. 方顿教育:让消费者满意的短视频电商服务平台
  15. 111、Flutter 实现动画颜色渐变效果
  16. 如何设置修改网页中滚动条
  17. 调查显示我国4成人每周休闲不足10小时-休闲-带薪休假-上网
  18. 计算机科技协会知识竞赛策划书,科协活动策划书
  19. 温习Android基础知识——《第一行代码(第三版)》读书笔记 Chapter 2 Kotlin语法
  20. Python中的*使用

热门文章

  1. 你准备好了吗,2018末班车即将到站!
  2. AE基础教程第一阶段——08摄像机视图
  3. STM32基础知识点
  4. 年审是当月还是当天_车辆年审有效期是按月算还是按日
  5. 停止词(stop words)
  6. 6个免费PPT模板网站
  7. webpack2--tidying up
  8. wordpress 古腾堡_如何使用古腾堡块编辑器更新旧的WordPress帖子
  9. 计算机网络张新有,张新有 - 西南交通大学 - 信息科学与技术学院
  10. 智能检测与智能制造第0章 传感器与检测技术