历史上的今天
今天是: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
史海拾趣
|
用双面板做的,采用单片机+锁相环控制+C2053功率管输出,频率非常稳定。 可以用按键调节发射频率,电子音量等 频率设置步进0.1MHZ 或1MHZ可以工作在88-108MHZ 调频段,升级软件可以在70-120MHZ工作 输出能驱动小灯泡发光,功率最大1W 该 ...… 查看全部问答> |
|
在网上看到关于USB总线的资料: USB是“Universal Serial Bus”的缩写,意思是“通用串行总线”。 但请注意,这不是一种新的总线标准,而是电脑系统接驳外围设备(如键盘、鼠标、打印机等)的输入/输出接口标准。现在电脑系统接驳外围设备的接口并 ...… 查看全部问答> |
|
-------------------------------------------------------------------------------- 我用的收音机芯片是CL6017S,它的01h制度寄存器的低10位显示的是频率,它的值和04h低10位的值相等,频率单元是10KHz,初始化后的电台频道是0x15E;我的家台程 ...… 查看全部问答> |
|
Windows Mobile 安装包用VS.NET2005 C#怎么制作? Windows Mobile 安装包用VS.NET2005 C#怎么制作? 我试了好多次了。还是有些问题。各位帮一下忙。多谢了。… 查看全部问答> |
|
这两天在捣鼓stm32的TIMx,不是TIM1,看了很多的文章,自己也尝试了很多程序,貌似还是没有看到效果,比如led灯被点亮,或者输出波形,感觉市面上的材料大多都有问题,或者只适合作者自己,没有通用性,求懂TIM的人留言,可以直接贴代码,加些注释 ...… 查看全部问答> |




