Kayan nokta özel durumu ( SIGFPE ) 'int main(){ return(0); }' | Netgez.com
SORU
24 EYLÃœL 2012, PAZARTESÄ°


Kayan nokta özel durumu ( SIGFPE ) 'int main(){ return(0); }'

İki farklı Linux ortamları için basit bir C programı oluşturmak için çalışıyorum. Bir aygıt üzerinde program iyi, Bu program kayan nokta özel durumu oluşturur diğer cihaz üzerinde çalışır. Programı ama hiçbir şey beni uyumsuzluk başlangıç kodu belki de ABİ ile bazı olduğuna inanıyoruz yol açan ana dönüş 0 mı?

Programı aşağıdaki yapı özellikleri ile gcc ile derlenmiş

Kullanarak yerleşik özellikleri. Hedef: i386-redhat-linux ile Yapılandırılmış: ../=/usr --configure --prefix=//share/man mandir usr --infodir=/usr/share/info --enable-shared --enable-threads=posıx --enable-kontrol=serbest ---sistemi-with --enable-__cxa_atexit --disable-libunwind-istisnalar --enable-libgcj-Çoklu dosya --enable-dil=c,c ,objc,N-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/totem --cpu=genel --host=i386-redhat-linux İplik modeli: posıx gcc sürüm 4.1.2 20080704 (Red Hat 4.1.2-52)

Program kaynağı şudur:

int main()
{
        return(0);
}

Pentium cihazda bu programı GDB altında aşağıdaki gibi oluşturur:

[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 ?? ()

Aşağıda neler olup bittiğini öğrenmek için yardım toplamak için aklıma gelen ayrıntılar:

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.

Ben bu soruna neden ne olduğunu belirlemek için ne yapabilirim? Hakkında statik olarak bağlantı kurmaya kütüphanenin belirli bir sürümü karşı?

Başarısızlık GDB altında oluşur, sonra idam ederim:

(gdb) x/1i $eip
0x40001cce:     divl   0x164(ìx)
(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) 

Aldım yardım dayalı nedense kütüphanenin başlangıç kodu 0 ile bölme olduğu görülmektedir.

Şimdi soru, belli ki kötü bu davranışının nedeni nedir? Bir şey başka bir şey ile uyumlu olması gerekir?

Derleme çıktısı:

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

CEVAP
25 EYLÜL 2012, Salı


Bu çok uzak bir ihtimal...ama aşağıdaki deneyebilir misin? gibi gelebilir

$ readelf -a fail

ve GNU_HASH dinamik bir etiket için bakmak? Benim tahminim ikili ld.so bunu anlamak için çok yaşlı ** 15, ve kullanmasıdır. GNU karma bölüm için destek 2007 veya 2008 etrafında 2006 ve ana hat dağıtımları GNU-karma-tek olmaya başladı etrafında abone olarak giriş eklendi. Senin Centrino glibc2003GNU karma öncedir.,

Eğer ld.so GNU karma anlamıyor bile, boş olan eski ELF karma bölüm yerine kullanmayı deneyin. Özellikle, çarpışma this line in elf/do-lookup.h meydana gelen şüpheleniyorum:

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

Beri linker muhtemelen GNU sağlamalarının 0, kaza sonucu olacağını anlamıyor. Not map geniş yapısı ile 100 civarında yapı elemanları ve l_nbuckets yaklaşık 90 üye yapısı, daha yeni ld.so (0x164 = 4*89 çok eski ld.so * * * muhtemelen tam da bu üyesi).

Eğer bu olup olmadığını görmek içinkesin bir şekildesorun, -Wl,--hash-style=sysv -Wl,--hash-style=both ile inşa ve eğer kaza uzağa giderse bakın.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • BurnedInDotCom

    BurnedInDotC

    3 NÄ°SAN 2010
  • krotoflik

    krotoflik

    26 ÅžUBAT 2011
  • The Fashion Sight

    The Fashion

    22 AÄžUSTOS 2011