'int main(){return(0); }'의 부동소수점 예외(SIGFPE)
저는 두 가지 다른 Linux 환경을 위한 간단한 C 프로그램을 만들려고 합니다.한 장치에서는 프로그램이 정상적으로 실행되고 다른 장치에서는 프로그램이 부동 소수점 예외를 생성합니다.이 프로그램은 메인에서 0을 반환하는 것 외에는 아무것도 하지 않습니다.그 때문에, 기동 코드와 호환성이 없는 것 같습니다만, ABI는 아닐까요?
이 프로그램은 다음과 같은 빌드 사양의 gcc를 사용하여 컴파일됩니다.
빌트인 사양 사용.대상: 구성된 i386-redhat-linux: ../configure --syslog=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-syslog=pix --enable-check=release --with-with-zlib --enable-zlib --enable-t --ename-t --enable-t --ename-wind-t --engthat_xa-lib --d --disc-engtht --va-awt=gtk --disable-dssi --disable-dssi --with-disable-home=/usr/lib/jvm/dvm-1.4.2-disablej-1.4.2.0/jre --with-cpu=host=i386-redhat-linux 스레드 모델: posix gcc 버전 4.1.2.0704.1.
프로그램 소스는 다음과 같습니다.
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 I에서 장애가 발생한 후 다음 작업을 수행합니다.
(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
이건 정말 승산이 없는 일처럼 들리겠지만...하지만 다음을 시도해 볼 수 있나요?
$ readelf -a fail
GNU_HASH 다이내믹 태그를 찾습니다.내 추측으로는 이진이GNU_HASH
, 및 당신의ld.so
너무 늙어서 이해할 수 없어요.GNU 해시 섹션의 지원은 2006년경 glibc에 추가되었으며 메인라인 디스트로는 2007년 또는 2008년경부터 GNU 해시 전용이 되기 시작했습니다.Centrino의glibc
는 GNU 해시보다 이전인 2003년 버전입니다.
경우,ld.so
GNU 해시를 이해하지 못하고 대신 비어 있는 오래된 ELF 해시 섹션을 사용하려고 합니다.특히 크래시는 의 다음 행에서 발생하고 있는 것으로 생각됩니다.
for (symidx = map->l_buckets[hash % map->l_nbuckets];
GNU못할 에 GNU 해시는 이해하지 못할 입니다.l_nbuckets
0으로 하다:map
는 약 요소를 큰 이며, 100개의 구조 요소가 .l_nbuckets
구조체의 90번째 구성원은 90번째 구성원의 90번째 구성원은 다음과 같습니다.ld.so
)0x164 = 4*89
에는 '''가 있었어요ld.so
아마 이 멤버일 것이다.)
이것이 최종적인 문제인지 아닌지를 확인하려면-Wl,--hash-style=sysv
★★★★★★★★★★★★★★★★★」-Wl,--hash-style=both
추락이 사라졌는지 봐야지
ATOM에서는 동작하지만 오래된 Celeron에서는 동작하지 않기 때문에 Celeron에서는 실행할 수 없는 컴파일러 최적화 코드 생성에 문제가 있을 수 있습니다.O0 플래그를 사용하여 컴파일해 보십시오.또한 아키텍처에 대해 명확하게 기술하기 위해 -march=i686을 추가하는 것이 좋습니다.또한 문제를 분리하기 위해 C++ 런타임 및 JAVA에 대한 링크를 비활성화할 것을 권장합니다.
이 테스트 프로그램을 한 번 작성하여 각 디바이스에서 실행했습니까?아니면 디바이스별로 다른 실행 파일을 구축했습니까?하나의 실행 파일을 빌드하는 경우 두 디바이스 또는 디바이스와 빌드 머신에 다른 버전의 libc, libstdc+가 있을 수 있습니다.
언급URL : https://stackoverflow.com/questions/12570374/floating-point-exception-sigfpe-on-int-main-return0
'IT이야기' 카테고리의 다른 글
스태틱 함수에 C의 프로토타입에 static 키워드가 필요합니까? (0) | 2022.07.24 |
---|---|
후드 아래에서 예외는 어떻게 구현됩니까? (0) | 2022.07.23 |
Vue: 새로운 사후 대응 속성을 추가하기 위한 다른 옵션? (0) | 2022.07.23 |
v-model에서 입력 유형="file"을 지원하지 않습니다. (0) | 2022.07.23 |
vue.js에서 개체를 포함하는 데이터 어레이를 표시하는 방법 (0) | 2022.07.23 |