Ubuntu下ARM交叉编译环境
初次接触ARM开发版,才知道交叉编译这个名词,鉴于自己刚入门,肯定以后要经历数次才记得住,故在这做个记录,方便自己忘记时做个参考。
1.准备编译基础环境
因为ARM是32位,而Ubuntu是64位的,所以先安装一些32位的库。
sudo apt-get install lib32ncurses5 lib32z1 lib32stdc++6
2.安装ARM-Linux-gcc
因为我的是
三星s3c2440的SOC
,所以这里使用的友善之臂提供的交叉编译工具。
友善之臂官网 下载页面:直接下载ARM-Linux GCC 4.4.3
# 下载交叉编译工具
wget http://112.124.9.243/arm9net/mini2440/linux/arm-linux-gcc-4.4.3-20100728.tar.gz
# 解压到当前目录
sudo tar zxvf arm-linux-gcc-4.4.3-20100728.tar.gz -C /
# 添加到环境变量
vi ~/.bashrc
#添加如下内容到末尾
export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin
#立即生效环境变量
source ~/.bashrc
3.查看安装状态
arm-linux-gcc -v
#可以看到如下内容:
Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with: /opt/FriendlyARM/mini2440/build-toolschain/working/src/gcc
-4.4.3/configure --build=i386-build_redhat-linux-gnu --host=i386-build_redh
at-linux-gnu --target=arm-none-linux-gnueabi --prefix=/opt/FriendlyARM/tool
schain/4.4.3
省略...
Thread model: posix
gcc version 4.4.3 (ctng-1.6.1)
在编译项目时,可能会遇到找不到除法函数等问题,这时需要将链接库加上。
链接库目录:/opt/FriendlyARM/toolschain/4.4.3/lib/gcc/arm-none-linux-gnueabi/4.4.3/
示例Makefile文件:
Makefile更多的使用说明请参考:Makefile 配置和使用
CC = arm-linux-gcc
LD = arm-linux-ld
AR = arm-linux-ar
OBJCOPY = arm-linux-objcopy
OBJDUMP = arm-linux-objdump
LIBPATH =-lgcc -L/opt/FriendlyARM/toolschain/4.4.3/lib/gcc/arm-none-linux-gnueabi/4.4.3/
#扫描所有文件,指定所需生成的.o文件
all_o_files:=$(patsubst %.c,%.o,$(wildcard **/*.c)) $(patsubst %.S,%.o,$(wildcard **/*.S))
all_o_files+=$(patsubst %.c,%.o,$(wildcard *.c)) $(patsubst %.S,%.o,$(wildcard *.S))
#test:
#echo $(all_o_files)
#依赖库查找方法:grep "__floatsisf" * -nR
all: $(all_o_files)
${LD} $(LIBPATH) -T all.lds -o $@.elf $^ ${LIBPATH}
${OBJCOPY} -O binary -S $@.elf $@.bin
${OBJDUMP} -D $@.elf > $@.dis
%.o: %.c
${CC} -march=armv4 -c -o $@ $<
%.o: %.S
${CC} -march=armv4 -c -o $@ $<
clean:
rm -rf */*.o */*.elf */*.bin */*.dis
rm -f *.o *.elf *.bin *.dis
#伪目标
.PHONY:clean
#清理依赖
clean-dist:
rm -f *.o.d