arm-linux-gcc工具链:汇编文件如何include c的头文件呢???
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arm-linux-gcc工具链:汇编文件如何include c的头文件呢???相关的知识,希望对你有一定的参考价值。
例如,创建头文件regs.h:#define SRCPND 0X4A000000那么在汇编文件中如何引用这个宏呢?在汇编文件中直接用.include “regs.h”貌似不行呢,我试了下用arm-linux-as直接编译不行,提示SRCPND为未定义#define是C语言的宏,是不是要预编译一下头文件呢?搞的有点晕那
参考技术A 按照楼上的帖子试了一下不行我是这样写的:a.h:#definea
1a.S:.include
"a.h"mov
r0,#a然后用arm-linux-gcc
a.S
进行编译,报错:a.S:
Assembler
messages.S:3:
Error:
undefined
symbol
a
used
as
an
immediate
value问题出在哪里呢???
查看原帖>>
S3C2440-裸机篇-02 | 安装和使用arm-linux-gcc交叉编译工具链
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 <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
安装完成后再次编译,编译成功:
编译器提示缺少库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
以上是关于arm-linux-gcc工具链:汇编文件如何include c的头文件呢???的主要内容,如果未能解决你的问题,请参考以下文章
Ubuntu 编译 ARM-Linux-Gcc 工具链 -- 通过crosstool-NG制作工具链
Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程图解
Ubuntu配置交叉编译环境(配置交叉编译工具链)配置arm-linux-gcc交叉编译工具链(添加交叉编译工具链(toolchain)到环境变量)
Ubuntu配置交叉编译环境(配置交叉编译工具链)配置arm-linux-gcc交叉编译工具链(添加交叉编译工具链(toolchain)到环境变量)