当前位置:  技术问答>linux和unix

先声明后定义的函数,能运行,但是用nm和readelf命令都看不到!

    来源: 互联网  发布时间:2017-04-18

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

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

我用RHEL6的GCC4.4测试的:

#include
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("p1n");}
void p2(int i){printf("%dn",i);}
void myfunction(int i);//先声明
void myscan();
int main(void){
        int* pi=new int[2];
        pi[1]=5;
        printf("%dn",pi[1]);
        delete[] pi;
        myfunction(6);
        myscan();
        return 0;
}
void myfunction(int i){++i;printf("%d,%sn",i,__FUNCTION__);}//再实现
void myscan(){int i;scanf("%d",&i);printf("input %dn",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 
     4: 00000000     0 SECTION LOCAL  DEFAULT    4 
     5: 00000000     0 SECTION LOCAL  DEFAULT    5 
     6: 00000000     0 SECTION LOCAL  DEFAULT    7 
     7: 00000000     0 SECTION LOCAL  DEFAULT    8 
     8: 00000000     0 SECTION LOCAL  DEFAULT    6 
     9: 00000000    10 FUNC    GLOBAL DEFAULT    1 _Z2f0v
    10: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND __gxx_personality_v0
    11: 00000000     4 OBJECT  GLOBAL DEFAULT    4 x
    12: 00000000     4 OBJECT  GLOBAL DEFAULT    3 y
    13: 0000000a     5 FUNC    GLOBAL DEFAULT    1 _Z1gi
    14: 0000000f     8 FUNC    GLOBAL DEFAULT    1 _Z1hi
    15: 00000017    12 FUNC    GLOBAL DEFAULT    1 _Z2h1i
    16: 00000004    12 OBJECT  GLOBAL DEFAULT    4 xarry
    17: 00000004    12 OBJECT  GLOBAL DEFAULT    3 yarray
    18: 00000023    20 FUNC    GLOBAL DEFAULT    1 _Z2p1v
    19: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND puts
    20: 00000037    27 FUNC    GLOBAL DEFAULT    1 _Z2p2i
    21: 00000000     0 NOTYPE  GLOBAL DEFAULT  UND printf
    22: 00000052    10 FUNC    GLOBAL DEFAULT    1 main


奇怪了,怎么就没有myfunction和myscan呢? 如果我运行a.out是有输入和输出的。还请大侠解释一下哈!

# ./a.out
5
7,myfunction
99                        #这里是我的输入。
input 99

|
可能被优化掉弄成内联的了,-O0试试

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,