回文章列表
作者WalkingIce.bbs@ptt.cc (會走路的冰塊) 看板: linux
標題Re: 請問一個奇怪的程式碼...
時間批踢踢實業 (2008/03/02 Sun 17:25:04)
※ 引述《Samu3L (Sid)》之銘言:
: 我不知道這段程式的用意是什麼
: 如果要call function 是應該要把
:          q[2] = (long)foo;
: 改成
:          q[2] = (long)foo();
: ※ 引述《jeremy007 (linux藍海帝國)》之銘言:
: : 以下這段程式碼在 FreeBSD 6.2-RELEASE-p11 系統上執行可以印出 "?????"
: : 但在 linux fedora8 上面執行,卻沒有任何訊息印出
: : linux fc8 OS 做了什麼機制,導致沒有印出訊息呢 ?
: : 謝謝!
: : //--------------------------------------
: : #include<stdio.h>
: : #include<stdlib.h>
: : int foo() {
: :         printf("?????\n");
: :         exit(0);
: : }
: : int main(void) {
: :         long q[1];
: :         q[2] = (long)foo;
: :         return 0;
: : }
: : //--------------------------------------

不知道是不是 gcc 版本的問題?
要不要 show 一下 gcc version 跟 object code ?

我用的 gcc 是 4.1.3,OS 是 Ubuntu 7.10
你 post 的程式碼我執行後也是沒有任何輸出

如果照 Samu3l 板友的修改後就會輸出那些問號


用 objdump 把執行檔反組譯後所看到的結果如下

  (....略..)
80483a4 <foo>:
 80483a4:       55                      push   %ebp
 80483a5:       89 e5                   mov    %esp,%ebp
 80483a7:       83 ec 08                sub    $0x8,%esp
 80483aa:       c7 04 24 ac 84 04 08    movl   $0x80484ac,(%esp)
 80483b1:       e8 42 ff ff ff          call   80482f8 <puts@plt>
 80483b6:       c7 04 24 00 00 00 00    movl   $0x0,(%esp)
 80483bd:       e8 46 ff ff ff          call   8048308 <exit@plt>

080483c2 <main>:
 80483c2:       8d 4c 24 04             lea    0x4(%esp),%ecx
 80483c6:       83 e4 f0                and    $0xfffffff0,%esp
 80483c9:       ff 71 fc                pushl  -0x4(%ecx)
 80483cc:       55                      push   %ebp
 80483cd:       89 e5                   mov    %esp,%ebp
 80483cf:       51                      push   %ecx
 80483d0:       83 ec 10                sub    $0x10,%esp
 80483d3:       b8 a4 83 04 08          mov    $0x80483a4,%eax  HERE!!
 80483d8:       89 45 00                mov    %eax,0x0(%ebp)
 80483db:       83 c4 10                add    $0x10,%esp

把 foo 的 address assign 進去 eax
再把 eax 的值放進 q[2] 裡面
接下來的就是 pop 跟 ret 了  (沒有貼上來)

如果照 Samu3l 板友的修改
就會在 assign address 之前多一行 call 08483a4 <foo>
也就是說先做完 function call,再塞 address into q[2]

q[2] = (long)foo();
             ^^^^^  先做這一段

以上是用 objdump 所作的猜測 :P

我也很好奇原 po dump 出來的結果是啥 XD
--


        我想你會衰成這樣都是我害的
                                        ---- Tizzy Mac

                                                緊張的麥金塔?這是誰(._.?)

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.219.5.210
※ 編輯: WalkingIce      來自: 124.219.5.210        (03/02 17:25)
文章選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻