当前位置: 技术问答>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测试的:
编译并运行:
g++ 1.cpp && nm 1.o && echo --------- && readelf -s 1.o
得到的结果是:
奇怪了,怎么就没有myfunction和myscan呢? 如果我运行a.out是有输入和输出的。还请大侠解释一下哈!
而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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。