历史上的今天
返回首页

历史上的今天

今天是:2025年07月30日(星期三)

正在发生

2021年07月30日 | S3C2440-裸机篇-02 | 安装和使用arm-linux-gcc交叉编译工具链

2021-07-30 来源:eefocus

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

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


之前我们已经使用过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


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


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

编译器提示缺少库libstdz.so.1,解决方案:


sudo apt-get install lib32z1


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

可以看到这是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


注:以上所有操作编写了一个脚本,使用sudo运行:


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

cd ./opt/FriendlyARM/toolschain

mv 4.4.3/ arm-linux-toolchains4.4.3

mv arm-linux-toolchains4.4.3/ /usr

sudo apt-get install libc6-i386

sudo apt-get install libstdc++6

sudo apt-get install lib32stdc++6

sudo apt-get install lib32z1



推荐阅读

史海拾趣

Alliance Fiber Optics Products Inc公司的发展小趣事

随着产品质量的不断提升和市场需求的扩大,AFOP开始积极拓展国内外市场。公司通过与各大电信运营商、设备制造商等建立合作关系,将产品应用于长途通信、大都会网络以及最后一里接入等领域。同时,AFOP还积极参与国际光纤通信展览会等活动,加强与国际同行的交流与合作,提升了公司在国际市场的知名度。

Fedco_Batteries公司的发展小趣事

面对日新月异的市场需求和技术变革,Fedco_Batteries始终保持创新的步伐。公司加大了研发投入,不断推出新型电池产品,满足客户的多样化需求。同时,公司还积极探索新的应用领域,将电池技术应用于更多领域,如新能源汽车、智能家居等。这种创新驱动的发展战略,让Fedco_Batteries在行业中始终保持领先地位。

Allied Electronic & Semiconductor Technology Inc公司的发展小趣事

AE&ST公司自创立之初,就深知技术创新是电子行业的核心竞争力。公司投入大量资源进行研发,不断探索新的半导体材料和生产工艺。在一次偶然的实验中,AE&ST的研发团队发现了一种新型半导体材料,这种材料在能效和稳定性方面表现出色。公司迅速将这一发现转化为产品,并推向市场。新产品一经推出,便因其卓越的性能获得了市场的广泛认可,AE&ST公司因此获得了巨大的商业成功。

Electronicon Kondensatoren GmbH公司的发展小趣事

1992年,ELECTRONICON成立了卷绕电容器部门,并专注于该领域的研发与生产。该部门拥有238名员工,致力于为客户提供高品质的照明、电机和电力电容器产品。随着部门的不断发展壮大,ELECTRONICON在电容器领域的市场份额也得到了进一步提升。

港源(GANGYUAN)公司的发展小趣事

ELECTRONICON一直注重技术创新和品质保证。公司不断投入研发资金,引进先进技术和设备,以确保产品的质量和性能始终处于行业领先地位。同时,ELECTRONICON还建立了完善的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格的质量控制。

Freeport Resources Enterprises Corp公司的发展小趣事

在21世纪初,Freeport Resources作为一家历史悠久的矿业公司,开始意识到电子材料市场的巨大潜力。公司决定利用其丰富的矿产资源和勘探经验,转向对电子级金属材料的探索与开发。通过深入研究和市场调研,Freeport Resources成功定位了高纯度铜、钴等金属在半导体、电路板等电子领域的应用,并逐步建立了从矿产开采到电子材料加工的完整产业链。这一转型不仅为公司带来了新的增长点,也使其在电子行业中崭露头角。

问答坊 | AI 解惑

看看人家做的调频发射机

用双面板做的,采用单片机+锁相环控制+C2053功率管输出,频率非常稳定。 可以用按键调节发射频率,电子音量等 频率设置步进0.1MHZ 或1MHZ可以工作在88-108MHZ 调频段,升级软件可以在70-120MHZ工作 输出能驱动小灯泡发光,功率最大1W 该 ...…

查看全部问答>

时序约束的问题

输入时钟为ddr_ck/ddr_ckn,经过dcm产生270度的相移,输出为clk1X。clk1X作为整个系统的工作时钟。要求ddr_ck/ddr_ckn在400~667MHz之间。在不做时序约束的条件下,系统的最高工作频率为365.658MHz,不满足要求。下面是综合报告的相关结果:======== ...…

查看全部问答>

Quartus2的FPGACPLD设计

为什么不能正常下载?…

查看全部问答>

关于USB总线与PCI总线

在网上看到关于USB总线的资料: USB是“Universal Serial Bus”的缩写,意思是“通用串行总线”。 但请注意,这不是一种新的总线标准,而是电脑系统接驳外围设备(如键盘、鼠标、打印机等)的输入/输出接口标准。现在电脑系统接驳外围设备的接口并 ...…

查看全部问答>

CL6017S收音机芯片的跳台问题

-------------------------------------------------------------------------------- 我用的收音机芯片是CL6017S,它的01h制度寄存器的低10位显示的是频率,它的值和04h低10位的值相等,频率单元是10KHz,初始化后的电台频道是0x15E;我的家台程 ...…

查看全部问答>

Windows Mobile 安装包用VS.NET2005 C#怎么制作?

Windows Mobile 安装包用VS.NET2005 C#怎么制作? 我试了好多次了。还是有些问题。各位帮一下忙。多谢了。…

查看全部问答>

protel dxp指导教程pdf

 protel dxp指导教程pdf…

查看全部问答>

C语言轻松入门---------献给初学者

  献给那些没学过或是刚接触C语言的好学同志。   要是看不懂的,可以提出来,大家一起讨论进步!!!    …

查看全部问答>

关于stm32的TIM

这两天在捣鼓stm32的TIMx,不是TIM1,看了很多的文章,自己也尝试了很多程序,貌似还是没有看到效果,比如led灯被点亮,或者输出波形,感觉市面上的材料大多都有问题,或者只适合作者自己,没有通用性,求懂TIM的人留言,可以直接贴代码,加些注释 ...…

查看全部问答>