日期:2014-05-16  浏览次数:20758 次

先声明后定义的函数,能运行,但是用nm和readelf命令都看不到!
在一个简单的cpp文件中,main之前定义和实现的函数,用nm/readelf命令都可以看见。
而main之前声明,main之后实现的函数,即使运行时被调用到了,用nm/readelf命令也看不到。就如下面代码当中的myfunction和myscan两个函数----明明都能执行了啊。

我用RHEL6的GCC4.4测试的:

#include<stdio.h>
int f0(){return 2;}
int x;
int y=1;
void f(void);
void g(int){return;}
int  h(int i){return i;}
int  h1(int i){++i;return i;}
int xarry[3];
int yarray[3]={1,2,3};
void p1(){printf("p1\n");}
void p2(int i){printf("%d\n",i);}
void myfunction(int i);//先声明
void myscan();
int main(void){
        int* pi=new int[2];
        pi[1]=5;
        printf("%d\n",pi[1]);
        delete[] pi;
        myfunction(6);
        myscan();
        return 0;
}
void myfunction(int i){++i;printf("%d,%s\n",i,__FUNCTION__);}//再实现
void myscan(){int i;scanf("%d",&i);printf("input %d\n",i);}

编译并运行:
g++ 1.cpp && nm 1.o && echo --------- && readelf -s 1.o
得到的结果是:

0000000a T _Z1gi
0000000f T _Z1hi
00000000 T _Z2f0v
00000017 T _Z2h1i
00000023 T _Z2p1v
00000037 T _Z2p2i
         U __gxx_personality_v0
00000052 T main
         U printf
         U puts
00000000 B x
00000004 B xarry
00000000 D y
00000004 D yarray
---------

Symbol table '.symtab' contains 23 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 00000000     0 FILE    LOCAL  DEFAULT  ABS 1.cpp
     2: 00000000     0 SECTION LOCAL  DEFAULT    1 
     3: 00000000     0 SECTION LOCAL  DEFAULT    3