打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
gcc除法问题

 关于使用gcc4.3.2-eabi 实现除法指令出现Illegal instruction的问题

我使用的硬件为Micro2440开发板
内核    Linux 2.6.32.2 for mini2440/micro2440
工具连  ARM-Linux GCC 4.3.2
编译内核时已打开对eabi 的支持
但是在运行带除法的程序时出现错误提示Illegal instruction
程序如下
#include <stdio.h>
#include <math.h>
int main(void)
{ int i=25,j=4,k;
   char h=6;
   printf("welcome to my rootfs step a! \n");
   k=i /j;
   printf("welcome to my rootfs step b! k=%d \n",k);
   return 0;
}

运行结果如下
welcome to my rootfs step a!
Illegal instruction


但是使用ARM-Linux GCC 3.3.4 编译运用程序时为
welcome to my rootfs step a!
welcome to my rootfs step b! k=8

看汇编指令时发现如下不同
ARM-Linux GCC 4.3.2 下除法为
bl    __aeabi_idiv

ARM-Linux GCC 3.3.4 下除法为
bl    __divsi3

请问是什么问题?

mindee2010-07-04 15:35
暂时你可以使用4.1.2编译器,我们本月内会更新新版本的软件,将会解决此类问题

 

arm-linux-gcc 4.3.3 Illegal instruction 及制作文件系统

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 (at91rm9200也是ARM920T的)

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  命令可以看到很多有用的信息,如指定软硬浮点,指定处理器。以及怎么样来制作一个优化的编译器都是值得进一步研究的

The fix is to change ARM920T to -march=armv4t (armv4 with thumb)
as this is the correct mode for any ARM9 cpu with the T suffix.

affixed is a patch to change -march=armv4 to -march=armv4t for
ARM920T and ARM922T.

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
移植bootloader到UP-ARM2410-S开发板之U-boot的编译
用buildroot来建立交叉编译工具链
arm
EABI技术编译器
armel和armhf区别
arm交叉编译valgrind
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服