前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >S3C2440② | arm-linux-gcc交叉编译工具链

S3C2440② | arm-linux-gcc交叉编译工具链

作者头像
Mculover666
发布2020-07-16 10:56:57
3.8K0
发布2020-07-16 10:56:57
举报
文章被收录于专栏:TencentOS-tinyTencentOS-tiny

1.为什么需要交叉编译工具

宿主机运行的是标准Linux操作系统,编译出的程序却需要在目标处理器(S3C2440@ARM920T)上跑,这就叫交叉编译,编译器叫做交叉编译器。

之前我们已经使用过gcc编译Linux本地主机的程序(Linux C语言编程(上篇) | gcc的使用),而我们现在需要的这个编译器的目标系统是ARM,不运行操作系统,仅运行裸机程序,需要在Linux主机上编译出可以运行在S3C2440@ARM920T芯片上跑的程序,所以不能使用这个编译器,需要使用arm-linux-gcc交叉编译器。

2.arm-linux-gcc的安装

arm-linux-gcc是ARM官方基于Linux平台的arm编译器,其特点有:

  • 开源免费
  • 支持的ARM芯片多
  • 功能强大,稳定

2.1.下载arm-linux-gcc

这里我从友善的网站上下载:

广州友善电子科技有限公司

下载下来将压缩包上传到Linux主机上,如图:

解压:

tar -zxvf arm-linux-gcc-4.4.3-20100728.tar.gz

进入该目录/opt/FriendlyARM/toolschain,重命名:

mv 4.4.3/ arm-linux-toolchains4.4.3

然后将该目录移动到/usr下面:

sudo mv arm-linux-toolchains4.4.3/ /usr

进入目录查看,bin下存放着我们需要的工具:

2.2.设置环境变量

将上一步中工具存放的位置添加到用户环境变量,使用vim ~/.bashrc,然后在最后添加:

export PATH=$PATH:/usr/arm-linux-toolchains4.4.3/bin

然后使用命令source ~/.bashrc更新系统路径,使添加的环境变量立即生效:

然后输入arm-linux-,连按tab,检查是否可以自动补全,如果可以,则安装成功:

执行arm-linux-gcc,查看版本,主要是检查工具链是否可以正常运行:

2.3.添加32位库支持(64位系统)

如果是64位操作系统,这个时候还不能使用,只能自动补全,但不能执行: 解决方案 —— 安装库:

sudo apt-get install libc6-i386

安装完成后再次查看gcc版本,检测是否成功:

3.arm-linux-gcc的使用

arm-none-linux-gnueabi-gcc和之前的gcc使用无太大差异,示例如下。 先编辑文件hello.c

#include <stdio.h>

int main(void)
{
    printf("hello,world.\n");
    return 0;
}

然后使用交叉工具链编译:

编译器提示缺少库libstdc++.so.6,这是缺少32位库的问题:

  • libstdc++6
  • lib32stdc++6

解决方案:

sudo apt-get install libstdc++6 
sudo apt-get install lib32stdc++6

安装完成后再次编译,编译成功:

编译完成后,接下来可将生成的可执行文件从服务器上下载,烧写到目标板上运行,查看一下生成的可执行文件类型:

可以看到这是32位ARM机器上可执行程序。

4.嵌入式开发中目标文件的链接

在使用交叉编译工具链时,最重要的过程是链接过程:

  • 简单的程序链接可以使用一些参数指定;
  • 复杂的程序链接需要使用链接文件.ld指定。

这里仅仅说明最必须的一个参数:-Ttext 0,这个参数表明了链接的时候程序段从0地址开始存放,刚好对应了程序执行时从0地址开始运行。

5.嵌入式开发中常用的两个arm-linux-工具

5.1.格式转换工具arm-linux-objcopy

在Linux主机上编译生成的可执行程序通常为.out或者.elf格式,但是我们烧写到ARM芯片中运行的是.bin格式文件,所以需要使用格式转换工具arm-linux-objcopy,其转换命令如下:

arm-linux-objcopy -O binary -S led.elf led.bin

5.2.反汇编工具arm-linux-objdump

在嵌入式开发中大部分程序是使用C语言编写的,但是在遇到一些问题的时候,需要将由C语言编译生成的可执行程序反汇编,根据汇编程序排查错误,使用工具arm-linux-objdump,格式如下:

arm-linux-objdump -D led.elf > led.dis
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Mculover666 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.为什么需要交叉编译工具
  • 2.arm-linux-gcc的安装
    • 2.1.下载arm-linux-gcc
      • 2.2.设置环境变量
        • 2.3.添加32位库支持(64位系统)
        • 3.arm-linux-gcc的使用
        • 4.嵌入式开发中目标文件的链接
        • 5.嵌入式开发中常用的两个arm-linux-工具
          • 5.1.格式转换工具arm-linux-objcopy
            • 5.2.反汇编工具arm-linux-objdump
            相关产品与服务
            专用宿主机
            专用宿主机(CVM Dedicated Host,CDH)提供用户独享的物理服务器资源,满足您资源独享、资源物理隔离、安全、合规需求。专用宿主机搭载了腾讯云虚拟化系统,购买之后,您可在其上灵活创建、管理多个自定义规格的云服务器实例,自主规划物理资源的使用。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档