S5PV210开发 -- 交叉编译器
来源:互联网 发布:阿里云香港b区速度 编辑:程序博客网 时间:2024/05/16 06:45
交叉编译器我们讲了不少,Hi3516A开发--安装交叉编译器 DM368开发 -- 环境搭建 但都未系统的总结一下。
接下来,先讲一下S5PV210的交叉编译器的安装,然后再总结。
一、安装交叉编译器
(1)下载
下载:arm-none-linux-gnueabi-gcc下载
(2)安装
交叉编译所需软件包为 arm-2009q3.tar.bz2
《1》解压
在 /usr/local/ 目录下建立目录 arm,将软件解压至该目录。
#tar -xvf arm-2009q3.tar.bz2 -C /usr/local/arm/
PS:按理说是可以解压在任意目录下的,但提供的kernel源码编译器默认设置的位置是 /usr/local/arm/
《2》增加环境变量
环境变量之前讲过,参看:UNIX再学习 -- 环境变量
修改 /etc/profile 文件
#gedit /etc/profile
在最末尾添加:
export PATH=/usr/local/arm/arm-2009q3/bin/:$PATH
执行如下指令让环境变量生效:
#source /etc/profile
检验:
which arm-none-linux-gnueabi-gcc 查看所在位置
echo $PATH 查看环境变量
二、交叉编译器详解
参看:交叉编译详解
参看:交叉编译详解 一 概念篇
(1)什么是交叉编译
在讲交叉编译之前,可以先回顾一下之前讲的 gcc 编译,参看:C语言再学习 -- GCC编译过程
这个 gcc 编译,可以理解为“本地编译”,直接将源文件编译出来的程序,编译出来的程序可以在当前平台下进行运行。
而所谓的交叉编译器正好与本地编译相对应,在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序。
举个栗子:
参看:MQTT再学习 -- 交叉编译与移植
然后我门再看一下,gcc 和 arm-none-linux-gnueabi-gcc 编译生成的文件到底有啥不同。
gcc编译:
看出来了么? 是类型啦,主要是在 Intel 执行还是在 ARM 执行的。
(2)为什么会有交叉编译器
速度: 目标平台的运行速度往往比主机慢得多,许多专用的嵌入式硬件被设计为低成本和低功耗,没有太高的性能
能力: 整个编译过程是非常消耗资源的,嵌入式系统往往没有足够的内存或磁盘空间
可用性: 即使目标平台资源很充足,可以本地编译,但是第一个在目标平台上运行的本地编译器总需要通过交叉编译获得
灵活性: 一个完整的Linux编译环境需要很多支持包,交叉编译使我们不需要花时间将各种支持包移植到目标板上
(3)交叉编译链
(4)交叉编译器的名字的命名规则
参看:arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别
《1》命名规则
表示交叉编译器,是用于哪个目标系统架构中,用于那个平台中的。即,用此交叉编译器编译出来的程序,是运行在哪种CPU上面的。arch的值,常见的有很多种,比如arm,x86,mips等等。
表示谁提供的,即谁制作出来这个交叉编译器的。但是这一组命名好像比较灵活,在其它厂家提供的交叉编译链中,有以厂家名称命名的,也有以开发板命名的,或者直接是none或cross的。
其实指的是,你用此交叉编译器,编译出来的程序,所运行的目标系统。即,此交叉编译器,编译出来的程序,在什么系统中,什么环境中,运行。见过的有 Linux,uclinux,bare(无OS)。
其实主要表示的,交叉编译器所选择的库函数和目标系统。最常见的一些值有,gnu,gnueabi,uclibcgnueabi等等。
EABI:嵌入式ABI。嵌入式应用二进制接口指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。开发者使用自己的汇编语言也可以使用 EABI 作为与兼容的编译器生成的汇编语言的接口。
两者主要区别是,ABI是计算机上的,EABI是嵌入式平台上(如ARM,MIPS等)。
《2》分类和说明
免费版目前有三大主流工具商提供,第一是GNU(提供源码,自行编译制作),第二是 Codesourcery,第三是Linora。
(5)包含的工具
《1》GNU Binutils 简介
ld - GNU链接器。
as - GNU汇编程序。
ar - 用于创建,修改和从档案中提取的实用程序。
c++ filt - 过滤到demangle编码的 C++ 符号。
dlltool - 创建用于构建和使用DLL的文件。
gold - 一个新的,更快的ELF链接器,仍在测试中。
gprof - 显示分析信息。
nlmconv - 将目标代码转换为 NLM。
nm - 列出来自目标文件的符号。
objcopy - 复制和翻译目标文件。
objdump - 显示来自对象文件的信息。
ranlib - 生成一个档案内容的索引。
readelf - 显示来自任何 ELF 格式对象文件的信息。
size - 列出对象或归档文件的节大小。
strings - 列出文件中可打印的字符串。
strip - 丢弃符号。
windmc - Windows兼容的消息编译器。
windres - Windows资源文件的编译器。
《2》使用示例
arm-linux-as led.o -o led.s -g
arm-linux-ld -o led led.o
文件格式转换
arm-linux-objcopy binary -O led led.bin
反汇编
arm-linux-objdump -S led.o>led.asm
elf格式文件查看
arm-linux-readelf -a led.elf
符号表生成指令
arm-linux-nm led.elf
去掉elf文件中不需要的信息和代码
arm-linux-strip led.elf arm-linux-strip led.o
三、会遇到的问题
1. 编译器的问题
用arm-linux-gcc编译,可能原来是用gcc编译的。假如是脚本,#!/bin/sh 改 #!/bin/bash试试2. 文件完整性
3. 编译命令问题
比如我的一个测试程序 test.c编译:arm-none-linux-gnueabi-gcc -c i2c_test.c -o i2c_test //i2c_test 为目标文件
# file i2c_testi2c_test: ELF 32-bit LSB relocatable, ARM, version 1 (SYSV), not stripped使用 readelf 查看:
# readelf -h i2c_testELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: REL (Relocatable file) Machine: ARM Version: 0x1 Entry point address: 0x0 Start of program headers: 0 (bytes into file) Start of section headers: 1008 (bytes into file) Flags: 0x5000000, Version5 EABI Size of this header: 52 (bytes) Size of program headers: 0 (bytes) Number of program headers: 0 Size of section headers: 40 (bytes) Number of section headers: 15 Section header string table index: 12
编译:arm-none-linux-gnueabi-gcc i2c_test.c -o i2c_test //i2c_test 为可执行文件
# file i2c_testi2c_test: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped使用 readelf 查看:
# readelf -h i2c_testELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: ARM Version: 0x1 Entry point address: 0x84a0 Start of program headers: 52 (bytes into file) Start of section headers: 3132 (bytes into file) Flags: 0x5000002, has entry point, Version5 EABI Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 8 Size of section headers: 40 (bytes) Number of section headers: 31 Section header string table index: 28
file指令,参看:file 指令
主要查看是目标文件(Relocatable)还是可执行文件(Executable)
还有查看是GCC编译(Intel)还是交叉编译(ARM)
- S5PV210开发 -- 交叉编译器
- Hi3516A开发--安装交叉编译器
- Hi3516A开发--安装交叉编译器
- 为嵌入式开发指定交叉编译器
- linux嵌入式开发切换交叉编译器
- 交叉编译器
- 交叉编译器
- 交叉编译器
- 交叉编译器
- 交叉编译器
- 交叉编译器
- 交叉编译器
- 交叉编译器
- 交叉编译器
- 交叉编译器
- 交叉编译器
- 交叉编译器
- 交叉编译器
- POJ1163—三角形矩阵最大路径
- 整合spring cloud云服务架构
- UBIFS文件系统使用
- Unity 游戏框架搭建 (五) 简易消息机制
- html从入门到放弃(2)-入门标签:带输入格式的段落、文字方向和块引用(2)
- S5PV210开发 -- 交叉编译器
- for语句的3道面试题
- 三级联动省市区城市选择器v2.1.0新版本发布
- 127.0.0.1和普通IP区别
- 树莓派时钟
- Unity 游戏框架搭建 (六) 关于框架的一些好文和一些思考
- ELK实时日志分析平台环境部署
- 数位和
- 解决ubuntu16.04系统各种紫屏黑屏