作者jserv.bbs@bbs.sayya.org (松鼠) 看板: linux
標題Re: 請問一個奇怪的程式碼...
時間SayYA 資訊站 (2008/03/02 Sun 18:12:33)
※ 引述《jeremy007.bbs@ptt.cc (linux藍海帝國)》之銘言:
> 以下這段程式碼在 FreeBSD 6.2-RELEASE-p11 系統上執行可以印出 "?????"
> 但在 linux fedora8 上面執行,卻沒有任何訊息印出
> linux fc8 OS 做了什麼機制,導致沒有印出訊息呢 ?
基本上,這與 compiler optimization 有密切關係。
先試著以 gcc-3.4 來編譯以下的 C 程式碼 (假設為 strange.c)
$ gcc-3.4 -O0 -o strange strange.c
$ ./strange
?????
$
看來符合原發問者的期望,這是 turn off optimization 的狀況,把 order 加強看看:
$ gcc-3.4 -O1 -o strange strange.c
$ ./strange
$
就沒有輸出了 :-)
看看 "-O0" 的行為:
$ objdump -xd strange | grep -A14 "<main>"
0804839a <main>:
804839a: 55 push %ebp
804839b: 89 e5 mov %esp,%ebp
804839d: 83 ec 08 sub $0x8,%esp
80483a0: 83 e4 f0 and $0xfffffff0,%esp
80483a3: b8 00 00 00 00 mov $0x0,%eax
80483a8: 83 c0 0f add $0xf,%eax
80483ab: 83 c0 0f add $0xf,%eax
80483ae: c1 e8 04 shr $0x4,%eax
80483b1: c1 e0 04 shl $0x4,%eax
80483b4: 29 c4 sub %eax,%esp
80483b6: c7 45 04 7c 83 04 08 movl $0x804837c,0x4(%ebp)
80483bd: b8 00 00 00 00 mov $0x0,%eax
80483c2: c9 leave
80483c3: c3 ret
注意到 "$0x804837c",這是癥結,從這個線索去找:
$ objdump -xd strange | grep "0804837c <"
0804837c <foo>:
$
可以對照 "-O0" 與 "-O1" 的輸出分野,即可知曉為何如此了。
至於 gcc4,採用完全不同的 optimization policy,那就另當別論。
> //--------------------------------------
> #include<stdio.h>
> #include<stdlib.h>
> int foo() {
> printf("?????\n");
> exit(0);
> }
> int main(void) {
> long q[1];
> q[2] = (long)foo;
> return 0;
> }
> //--------------------------------------
--
Jim Huang aka "jserv"
Planet OrzLab: http://orzlab.blogspot.com/
website: http://jserv.sayya.org/
blog: http://blog.linux.org.tw/jserv/
--
※ Origin: SayYA 資訊站 <bbs.sayya.org>
◆ From: info.sayya.org