arm-linux-gcc 4.3.3 Illegal inst…
2013-12-19 20:43
344 查看
4.3.3这个编译器是带EABI的,也就是说具有突出的浮点预算性能,就是Float Point
Performance,它使用Vector Float Point(矢量浮点),因此可以极大提高涉及到浮点运算的程序
。而现在手头既有6410又有2410,这个EABI对这两个处理器编译出来的程序有什么不同么?
一、预先了解它会做什么首先我们就先弄清楚它是什么:
arm-linux-gcc --help 提示中有一个值得注意:
-print-libgcc-file-name Display the name
of the compiler's companion library
这个告诉我们编译器使用的是哪个库,执行结果如下:从中我们可以知道其使用的是mv4t版本的库,其实在/usr/local/arm/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/目录还有一套其它版本的库,
arm-linux-gcc
-print-libgcc-file-name
/usr/local/arm/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/armv4t/libgcc.a
arm-none-linux-gnueabi-gcc
-print-libgcc-file-name
/usr/local/arm/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/libgcc.a
执行下面命令可以看到编译器会搜索的目录,从结果可以看到既会搜索mv4t版本也会搜索更高版本的库。
arm-linux-gcc -print-search-dirs
注意:到编译器目录/usr/local/arm/4.3.3/bin/ 我们看一下,发现有如下文件,它们是什么关系?
a.
arm-none-linux-gnueabi-gcc-4.3.3
arm-none-linux-gnueabi-gcc-4.3.3 与 arm-none-linux-gnueabi-gcc
的内容完全相同
b. arm-none-linux-gnueabi-gcc
c.
arm-none-linux-gnueabi-g++
A.
arm-linux-g++
#!/bin/sh
arm-none-linux-gnueabi-g++ -march=armv4t
$*
B.
arm-linux-gcc 是一个脚本:
#!/bin/sh
arm-none-linux-gnueabi-gcc -march=armv4t
$*
C.
arm-linux-gcc-4.3.3
#!/bin/sh
arm-none-linux-gnueabi-gcc-4.3.3
-march=armv4t $*
二、有了基本了解,再了解一下我们的处理器,两个处理器的架构区别:
S3C2410/S3C2440,是ARM920T的核心,架构指令是armv4t
S3C6410 ARM1176JZF-S核心,是armv6架构
:ARM11系列微处理器内核(ARM1156T2-S内核、ARM1156T2F-S内核ARM1176JZ-S内核和ARM11JZF-S内核)
所以如果要编译给6410使用可以改为: -march=armv6
-mcpu=arm1176jzf-s 或者
-march=armv6
-mcpu=arm1176jzf-s -mfloat-abi=softfp -mfpu=vfp
$* (使用VFP)
我们可以用arm-linux-gcc
--target-help命令查看编译器支持的处理器及架构
三、问题和程序编译:
如果应用程序出现 Illegal instruction
错误不能执行等类似问题,一种原因是我们文件系统的库选错了(或者是mv4t或者是更高版本库),另一种原因就是编译的时候编译成了另外版本的应用程序。也许有其他版本的编译器默认库是高版本库,那么我们需要-march=armv4t
之类参数来指定。或者直接做个arm-linux-gcc脚本:
exec arm-none-linux-gnueabi-gcc -march=armv4t $*
同样可以解决问题,至于将应用程序编译成静态库去解决这个问题,好像是没有这个必要了。
网上有解决编译busybox问题的方法:
-----------------http://www.arm9home.net/simple/index.php?t2986.html
在busybox的Makefile里面
将ARCH ?= $(SUBARCH)
修改为ARCH ?= armv4t
我看好多资料是将其修改为
ARCH ?= arm
这样是不行的
2440内核使用的是arm920t的内核
就是armv4t体系
修改了效果是一样的
-----------------
四、遗留问题,通过执行 arm-linux-gcc
–dumpspecs
命令可以看到很多有用的信息,如指定软硬浮点,指定处理器。以及怎么样来制作一个优化的编译器都是值得进一步研究的
Performance,它使用Vector Float Point(矢量浮点),因此可以极大提高涉及到浮点运算的程序
。而现在手头既有6410又有2410,这个EABI对这两个处理器编译出来的程序有什么不同么?
一、预先了解它会做什么首先我们就先弄清楚它是什么:
arm-linux-gcc --help 提示中有一个值得注意:
-print-libgcc-file-name Display the name
of the compiler's companion library
这个告诉我们编译器使用的是哪个库,执行结果如下:从中我们可以知道其使用的是mv4t版本的库,其实在/usr/local/arm/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/目录还有一套其它版本的库,
arm-linux-gcc
-print-libgcc-file-name
/usr/local/arm/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/armv4t/libgcc.a
arm-none-linux-gnueabi-gcc
-print-libgcc-file-name
/usr/local/arm/4.3.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.3/libgcc.a
执行下面命令可以看到编译器会搜索的目录,从结果可以看到既会搜索mv4t版本也会搜索更高版本的库。
arm-linux-gcc -print-search-dirs
注意:到编译器目录/usr/local/arm/4.3.3/bin/ 我们看一下,发现有如下文件,它们是什么关系?
a.
arm-none-linux-gnueabi-gcc-4.3.3
arm-none-linux-gnueabi-gcc-4.3.3 与 arm-none-linux-gnueabi-gcc
的内容完全相同
b. arm-none-linux-gnueabi-gcc
c.
arm-none-linux-gnueabi-g++
A.
arm-linux-g++
#!/bin/sh
arm-none-linux-gnueabi-g++ -march=armv4t
$*
B.
arm-linux-gcc 是一个脚本:
#!/bin/sh
arm-none-linux-gnueabi-gcc -march=armv4t
$*
C.
arm-linux-gcc-4.3.3
#!/bin/sh
arm-none-linux-gnueabi-gcc-4.3.3
-march=armv4t $*
二、有了基本了解,再了解一下我们的处理器,两个处理器的架构区别:
S3C2410/S3C2440,是ARM920T的核心,架构指令是armv4t
S3C6410 ARM1176JZF-S核心,是armv6架构
:ARM11系列微处理器内核(ARM1156T2-S内核、ARM1156T2F-S内核ARM1176JZ-S内核和ARM11JZF-S内核)
所以如果要编译给6410使用可以改为: -march=armv6
-mcpu=arm1176jzf-s 或者
-march=armv6
-mcpu=arm1176jzf-s -mfloat-abi=softfp -mfpu=vfp
$* (使用VFP)
我们可以用arm-linux-gcc
--target-help命令查看编译器支持的处理器及架构
三、问题和程序编译:
如果应用程序出现 Illegal instruction
错误不能执行等类似问题,一种原因是我们文件系统的库选错了(或者是mv4t或者是更高版本库),另一种原因就是编译的时候编译成了另外版本的应用程序。也许有其他版本的编译器默认库是高版本库,那么我们需要-march=armv4t
之类参数来指定。或者直接做个arm-linux-gcc脚本:
exec arm-none-linux-gnueabi-gcc -march=armv4t $*
同样可以解决问题,至于将应用程序编译成静态库去解决这个问题,好像是没有这个必要了。
网上有解决编译busybox问题的方法:
-----------------http://www.arm9home.net/simple/index.php?t2986.html
在busybox的Makefile里面
将ARCH ?= $(SUBARCH)
修改为ARCH ?= armv4t
我看好多资料是将其修改为
ARCH ?= arm
这样是不行的
2440内核使用的是arm920t的内核
就是armv4t体系
修改了效果是一样的
-----------------
四、遗留问题,通过执行 arm-linux-gcc
–dumpspecs
命令可以看到很多有用的信息,如指定软硬浮点,指定处理器。以及怎么样来制作一个优化的编译器都是值得进一步研究的
相关文章推荐
- arm-linux-gcc 4.3.3 Illegal inst…
- linux 安装ARM-LINUX-GCC
- 2011年09月28日 (arm-linux-gcc3…
- arm-linux-gcc 常用参数讲解 gcc编…
- arm-linux-gcc 常用参数讲解 gcc编…
- linux 安装ARM-LINUX-GCC
- linux .mp3 后台播放(arm)
- ARM Linux中断机制之中断的初始化
- arm-linux-g++; comman…
- arm-linux-gcc & vim
- ARM Linux 3.x的设备树…
- arm-linux-ranlib:command no…
- Linux(ubuntu)+gcc/g++ 升级
- error: command 'x86_64-linux-gnu-gcc' failed with exit status 1” in virtualenv
- ARM Linux中断机制之中断的初始化
- Linux中gcc g++常用编译选项以及ma…
- ARM Linux 3.x的设备树…
- Linux中gcc g++常用编译选项以及ma…
- ARM GCC 内嵌汇编手册
- Arm linux启动分析(1)