首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >“int main(){ return(0);}”上的浮点异常( SIGFPE )

“int main(){ return(0);}”上的浮点异常( SIGFPE )
EN

Stack Overflow用户
提问于 2012-09-25 02:02:36
回答 2查看 6.5K关注 0票数 72

我正在尝试为两种不同的Linux环境构建一个简单的C程序。在一个设备上程序运行良好,在另一个设备上程序产生一个浮点异常。程序除了从main返回0之外什么也不做,这让我相信这与启动代码有一些不兼容,也许是ABI?

该程序是用gcc编译的,具有以下构建规格:

使用内置规范的

。目标: i386-redhat-linux配置为:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-thread=posix --enable-checking=release --with-system-zlib --enable-_cxa_atexit--enable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --disable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=i386-redhat-linux线程模型: posix V4.1.2 20080704 (Red Hat 4.1.2-52)

程序源如下所示:

int main()
{
        return(0);
}

在Celeron设备上,此程序在GDB下生成以下内容:

[root@n00200C30AA2F jrn]# /jrn/gdb fail GNU gdb Red Hat Linux (5.3post-0.20021129.18rh) (gdb) run Starting program: /jrn/fail 

Program received signal SIGFPE, Arithmetic exception. 0x40001cce in ?? () (gdb) bt
#0  0x40001cce in ?? ()
#1  0x4000c6b0 in ?? ()
#2  0x40000cb5 in ?? ()

以下是我认为可以收集的详细信息,以帮助了解发生了什么:

CELERON:  ( fails on this device )
2.6.8 #21 Mon Oct 1 11:41:47 PDT 2007 i686 i686 i386 GNU/Linux
============
[root@n00200C30AA2F proc]# cat cpuinfo 
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 9
model name      : Intel(R) Celeron(R) M processor          600MHz
stepping        : 5
cpu MHz         : 599.925
cache size      : 512 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 2
wp              : yes
flags           : fpu vme de pse tsc msr mce cx8 sep mtrr pge mca cmov pat clflush dts acpi mmx fxsr sse sse2 tm pbe
bogomips        : 1179.64

GNU C Library stable release version 2.3.2, by Roland McGrath et al.
Compiled by GNU CC version 3.2.2 20030222 (Red Hat Linux 3.2.2-5).
Compiled on a Linux 2.4.20 system on 2003-03-13.
Available extensions:
        GNU libio by Per Bothner
        crypt add-on version 2.1 by Michael Glad and others
        linuxthreads-0.10 by Xavier Leroy
        BIND-8.2.3-T5B
        libthread_db work sponsored by Alpha Processor Inc
        NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk

ATOM:  ( works fine on this device )
2.6.35 #25 SMP Mon Mar 12 09:02:45 PDT 2012 i686 i686 i386 GNU/Linux
==========
[root@n00E04B36ECE5 ~]# cat /proc/cpuinfo 
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 28
model name      : Genuine Intel(R) CPU N270   @ 1.60GHz
stepping        : 2
cpu MHz         : 1599.874
cache size      : 512 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 10
wp              : yes
flags           : fpu vme de tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx constant_tsc up arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 xtpr pdcm movbe lahf_lm
bogomips        : 3199.74
clflush size    : 64
cache_alignment : 64
address sizes   : 32 bits physical, 32 bits virtual
power management:


GNU C Library stable release version 2.5, by Roland McGrath et al.
Compiled by GNU CC version 4.1.2 20080704 (Red Hat 4.1.2-44).
Compiled on a Linux 2.6.9 system on 2009-09-02.
Available extensions:
        The C stubs add-on version 2.1.2.
        crypt add-on version 2.1 by Michael Glad and others
        GNU Libidn by Simon Josefsson
        GNU libio by Per Bothner
        NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk
        Native POSIX Threads Library by Ulrich Drepper et al
        BIND-8.2.3-T5B
        RT using linux kernel aio
Thread-local storage support included.

我可以做些什么来确定导致此问题的原因?尝试静态链接到某个版本的libc怎么样?

在GDB下发生故障后,我执行:

(gdb) x/1i $eip 0x40001cce: divl 0x164(%ecx)

(gdb) info reg
eax            0x6c994f 7117135
ecx            0x40012858       1073817688
edx            0x0      0
ebx            0x40012680       1073817216
esp            0xbffff740       0xbffff740
ebp            0xbffff898       0xbffff898
esi            0x8049580        134518144
edi            0x400125cc       1073817036
eip            0x40001cce       0x40001cce
eflags         0x10246  66118
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x0      0
(gdb) x/1wx 0x164+$ecx
0x400129bc:     0x00000000
(gdb) 

根据我收到的帮助,由于某种原因,libc启动代码似乎被0除了。

现在的问题是,是什么导致了这种明显的不良行为?一定有什么东西和其他东西不兼容?

程序集输出:

[jrn@localhost ~]$ more fail.s
        .file   "fail.c"
        .text
.globl main
        .type   main, @function
main:
        leal    4(%esp), %ecx
        andl    $-16, %esp
        pushl   -4(%ecx)
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %ecx
        movl    $0, %eax
        popl    %ecx
        popl    %ebp
        leal    -4(%ecx), %esp
        ret
        .size   main, .-main
        .ident  "GCC: (GNU) 4.1.2 20080704 (Red Hat 4.1.2-52)"
        .section        .note.GNU-stack,"",@progbits
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-25 09:22:22

这听起来像是一个很长的shot...but,你能试试下面的吗?

$ readelf -a fail

并寻找GNU_HASH动态标记?我的猜测是,二进制文件使用了GNU_HASH,而您的ld.so太旧了,无法理解它。对GNU散列部分的支持是在2006年左右添加到glibc中的,主线发行版在2007或2008年左右才开始使用GNU散列。你的迅驰的glibc是2003年的,比GNU更早。

如果ld.so不理解GNU hash,它将尝试使用旧的ELF hash部分,该部分为空。特别是,我怀疑您的崩溃发生在this line in elf/do-lookup.h

for (symidx = map->l_buckets[hash % map->l_nbuckets];

由于链接器可能不理解GNU crash,因此l_nbuckets将为0,从而导致崩溃。请注意,map是一个包含大约100个结构元素的大型结构,而在较新的ld.so中,l_nbuckets大约是该结构的第90个成员(0x164 = 4*89,因此在较早的ld.so中可能就是这个成员)。

要查看这是否确实是问题所在,请使用-Wl,--hash-style=sysv-Wl,--hash-style=both进行构建,并查看崩溃是否会消失。

票数 125
EN

Stack Overflow用户

发布于 2012-09-25 06:37:28

因为它在ATOM上工作,而不是在旧的赛扬上,我认为问题可能是编译器优化生成了赛扬不能执行的代码。尝试使用标志-O0进行编译。此外,我建议添加-march=i686来明确说明体系结构。此外,为了帮助隔离问题,我还建议禁用与C++运行时和JAVA的链接。

您是否只构建了一次此测试程序并在每个设备上运行它,还是为每个设备构建了不同的可执行文件?如果您正在构建一个可执行文件,那么在两个设备或设备上的libc、libstdc++的版本可能与您的构建机器上的版本不同。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12570374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档