作者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)