回文章列表
作者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
文章選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻