嵌入式开发之Linux系统移植5-交叉编译工具链

举报
神龙居市 发表于 2022/03/30 16:40:23 2022/03/30
【摘要】 1.交叉编译 1.1.编译原理机器码(二进制)是处理器能直接识别的语言,不同的机器码代表不同的运算指令,处理器能够识别哪些机器码是由处理器的硬件设计所决定的,不同的处理器机器码不同,所以机器码不可移植汇编语言是机器码的符号化,即汇编就是用一个符号来代替一条机器码,所以不同的处理器汇编也不一样,即汇编语言也不可移植C语言在编译时我们可以使用不同的编译器将C源码编译成不同架构处理器的汇编,所以...

1.交叉编译

1.1.编译原理

  • 机器码(二进制)是处理器能直接识别的语言,不同的机器码代表不同的运算指令,处理器能够识别哪些机器码是由处理器的硬件设计所决定的,不同的处理器机器码不同,所以机器码不可移植

  • 汇编语言是机器码的符号化,即汇编就是用一个符号来代替一条机器码,所以不同的处理器汇编也不一样,即汇编语言也不可移植

  • C语言在编译时我们可以使用不同的编译器将C源码编译成不同架构处理器的汇编,所以C语言可以移植

image.png

1.2.GCC编译过程

image.png

  • 程序的编译和运行不在同一台机器上
    Ubuntu上进行编辑和编译,开发板上运行。

1.3.交叉编译工具链

  • 交叉编译工具链的获取:
    1. 官网获取(不推荐,需要自己进行复杂配置与编译)
      http://ftp.gnu.org/gnu/gcc/
    2. BSP板级开发支持包(推荐)
      samsung、全志…
  • 交叉编译工具链的内容
    1. 交叉编译工具
      gcc/readelf/size/nm/strip/objcopy/objdump/addr2line

    2. ARM架构的库

2.ELF文件格式

2.1.ELF文件格式

  • ELF
    ELF格式是Linux平台上应用最广泛的二进制工业标准之一
    ELF格式的文件内包含了很多个段不同的段存储了不同的信息;因为ELF格式的文件要通过Linux系统的加载和管理才能运行,所以除了最基本的代码段和数据段之外,其中还存储了很多其它的信息,如符号表、调试信息等
    image.png

2.2.ELF文件相关命令

  • file
    file + 文件名 查看文件的详细信息

  • readelf
    readelf -h + 文件名 列出elf文件的头部信息
    readelf -a + 文件名 列出elf文件的所有信息

2.3.BIN文件格式

  • BIN
    BIN文件一般是直接运行在CPU之上
    的可执行文件,文件内只包含了CPU能够直接识别和运行的指令和数据,不包含其它系统相关的信息

3.交叉编译工具链常用工具

  • size 列出目标文件每一段的大小以及总体的大小
    size + 文件名

  • nm 列出目标文件中的符号表(标示符)
    nm + 文件名

  • strip 丢弃目标文件中的符号
    strip + 文件名
    注:对于嵌入式开发,这个命令很重要

  • objdump 从目标文件中显示信息
    eg:
    objdump -d + 文件名 将目标文件反汇编(机器码->汇编)

  • objcopy 对目标文件进行复制和转换
    eg:
    objcopy --gap-fill=0xff -O binary a.out a.bin
    将目标文件转换为bin格式

4.解交叉编译工具链的安装方法与使用

4.1.安装交叉编译工具链

  • 在 ubuntu 下打开一个终端并进入到家目录 cd ~
  • 在家目录下创建“Linux_4412/toolchain”目录用于存放交叉编译工具链
$ mkdir -p Linux_4412/toolchain
$ cd Linux_4412/toolchain/
  • 将资料中“1.交叉编译工具链”下的 gcc-4.6.4.tar 拷贝到该目录下,并解压
    image.png
$ tar xvf gcc-4.6.4.tar.xz

4.2.将交叉编译工具链添加到全局环境变量使其全局可用

  • 打开家目录下的配置文件“.bashrc” 重启配置文件使配置生效
$ cd ~
$ vi .bashrc
$ source ~/.bashrc

如图在配置文件的最后一行添加如下内容,将交叉编译工具链的安装路径添加到了全 局环境变量中,然后保存退出 注:每个人 ubuntu 所使用的用户名可能不同,所以家目录的路径可能有差异,这里根 据自己的实际情况进行设置
image.png

  • 执行以下命令
$ arm-none-linux-gnueabi-gcc -v

image.png

  • 注:若使用的是 ubuntu 16.04 或更高的版本(64 位 ubuntu),需要安装 32 位库
$ sudo apt-get install lib32z1 lib32ncurses5
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。