交叉编译工具链(详解)

摘要:
交叉编译工具链1.嵌入式开发模型-交叉开发在嵌入式开发过程中具有主机和目标机器的角色:主机是编译和链接嵌入式软件的计算机;目标机器是运行嵌入式软件的硬件平台。如下图所示,编译后的程序只能在小型端处理器上运行,其运行平台Machine是ARM。
交叉编译工具链
 
1、嵌入式开发模型-交叉开发

    在嵌入式开发过程中有宿主机目标机的角色之分:宿主机是执行编译链接嵌入式软件的计算机;目标机是运行嵌入式软件的硬件平台。

              clip_image002

在宿主机执行编译的流程如下:

                 clip_image004

2、交叉编译工具链详解

参考:

http://www.crifan.com/files/doc/docbook/cross_compile/release/html/cross_compile.html

3、制作交叉编译工具

参考:

http://www.crifan.com/files/doc/docbook/crosstool_ng/release/html/crosstool_ng.html

4、交叉编译工具

arm-linux-gcc

arm-linux-addr2line

arm-linux-objcopy

arm-linux-readelf

arm-linux-ar

arm-linux-ld

arm-linux-objdump

arm-linux-size

arm-linux-nm

arm-linux-strip

arm-linux-cc

arm-linux-gprof

arm-linux-c++filt

arm-linux-as

arm-linux-cpp

arm-linux-gccbug

arm-linux-ldd

arm-linux-populate

arm-linux-strings

arm-linux-c++

arm-linux-g++

arm-linux-gcov

arm-linux-ranlib

如何查看各交叉编译工具的帮助信息:

例如查看arm-linux-gcc的帮助信息:

    $ arm-linux-gcc --help

常用的交叉编译工具:

4.1 交叉编译器 arm-linux-gcc

    和X86平台下的gcc的基本用法用法是完全一样的;不同之处:标准的gcc所引用的头文件路径为 /usr/include/stdio.h,arm-linux-gcc所引用的头文件路径为其安装路径下,如 /usr/local/armtools/4.5.1/bin/..

4.2 交叉链接器 arm-linux-ld

    arm-linux-ld命令是ARM平台下的交叉链接器,把程序链接成可以在ARM平台下运行。

    用法: arm-linux-ld -Tled.lds led.o -o led.elf

               把led.o链接成led.elf文件;led.lds是链接器脚本,

4.3 交叉elf文件工具 arm-linux-readelf

查看.elf格式文件: arm-linux-readelf -a led.elf

                          -a 参数是查看.elf文件的所有内容

注意:编译的程序运行不了有两个原因:一个是要看运行平台对不对,第二个是要看处理器的大小端跟编译的程序的大小端是否对应,可以使用arm-linux-readelf -a xxx.elf 命令查看编译出来的程序大小端情况和程序运行平台。

    如下图所示,编译后的程序只能运行在小端(little endian)的处理器上,其运行平台Machine是ARM。绝大多数ARM处理器都是小端的。

   clip_image006

    查看程序运行平台还可以使用file xxx (xxx为编译后可执行文件) 命令查看。

    如一个应用程序不能执行,排除了运行平台和大小端的情况后,还有可能是库不对。

使用arm-linux-readelf -d xxx (xxx为编译后可执行文件)查看运行库;如hello程序运行库为libc.so.6,如果开发板上没有这个库,程序是运行不了的。

    clip_image008

4.4 交叉反汇编器 arm-linux-objdump

把hello.c文件编译成hello可执行文件:arm-linux-gcc hello.c -o hello

用法arm-linux -objdump -D -S hello >dump

         把hello可执行文件反汇编后输入保存到dump文件中。

         -D -S 是反汇编参数,>dump 把hello反汇编后的内容保存到dump文件中

      clip_image010

注意: 在编译hello时没有使用-g参数,反汇编后的代码和原来C代码对应不起来。我们可以在编译hello时使用-g参数:

    先把hello.c文件编译成hello可执行文件:arm-linux-gcc -g hello.c -o hello;运行arm-linux -objdump -D -S hello >dump命令,打开dump文件可以看到

       clip_image012

4.5文件格式转换器 arm-linux-objcopy

    使用arm-linux-objcopy命令可以把ELF格式的文件转换成二进制文件。

    文件格式转换的原因:elf格式的文件不能直接在ARM上运行(ARM只能运行二进制格式的文件);

    用法:arm-linux-objcopy -O binary led.elf led.bin

            把led.elf格式的文件转换成led.bin二进制文件。

4.6库管理器arm-linux-ar

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

转自:https://www.cnblogs.com/AP0904225/p/5904950.html

免责声明:文章转载自《交叉编译工具链(详解)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇太赞了!墙裂推荐这款网页版 Nginx 配置生成器,好用到爆!(笔记)Linux下C语言实现静态IP地址,掩码,网关的设置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux 常用命令:解压缩

Linux 常用命令:解压缩 目录 Linux 常用命令:解压缩 说明 tar 涉及参数说明: 压缩 归档tar包,不压缩 这种方式打包对文件进行了压缩: 查看压缩包中的文件 打包后删除源文件 打包除指定目录或文件以外的文件 向压缩包中更新文件 向tar包中增加文件 删除压缩包中的文件 解压 解压tar.gz和tar包到当前目录 解压到指定目...

hadoop集群的搭建与配置(1)

前言             首先hadoop是在linux系统上进行搭建的,我们首先要在自己电脑上装上虚拟机然后装linux系统,因为我们是测试:在本地虚拟机上装两个linux分别搭建好hadoop环境能实现简单的数据处理就可以了,最终的效果类似于我们c#中的hello world!能做到这里我们的搭建测试环境就算基本上完成了。虚拟机以及linux系统...

zabbix监控mysql报警

zabbix监控mysql性能 在Zabbix的监控系统中通常是由Zabbix Server与Zabbix Agent一起配合实现监控,在Zabbix Agent内置了很多监控基础的监控项。 这些监控项都是CPU, 文件系统, 网络,磁盘等基础的监控项,对于自己开发服务的监控,Zabbix提供了良好框架为用户实现监控和报警,下面将以为MySQL添加监控为例...

Linux下rsync的用法

一、rsync的概述 rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync。rsync是Linux系统下的文件同步和数据传输工具,它采用“rsync”算法,可以将一个客户机和远程文件服务器之间的文件同步,也可以在本地系统中将数据从一个分区备份到另一个分区上。如果rsync在备份过程中出现了数据传输中断,恢复...

QT5 编译程序运行,报错丢失libgcc_s_sjlj1.dll。尝试重新安装该程序以解决此问题。

之前一直正常使用,最近在QT Creator中运行程序,直接程序异常结束,单独启动EXE程序时,报以上错误。 最后把问题锁定在libstdc++-6.dll库上,尝试把QT环境bin目录下的libstdc++-6.dll拿到程序运行目录下,临时解决此问题。 原因是最近安装过一个程序,这个程序在C:\Windows\System32下放了一个libstd...

【问题解决记录】无法识别的标志“-sdlMode”,在“p2”中

本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/这是本人第一次使用MarkDown编辑器,试试看效果—w—,下面是正文: ## 一、报错原因 昨天用SIMD指令编写了几个矩阵计算函数,想要替换掉DX的函数达到优化性能的目的。 因为公司项目使用的编译器是VS2008,而VS2013编译出来的SI...