码迷,mamicode.com
首页 > 其他好文 > 详细

nm和readelf命令的区别

时间:2014-11-17 11:58:02      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:http   io   os   使用   sp   文件   on   问题   bs   

其实问题的本质是对elf格式的理解问题,因为是查看so库的符号表发现的问题。

 

事情起因是这样的,由于我的一个程序编译的时候出现了undefined reference to “XXX”的错误,需要链接特定的so库,发现用nm [file]找不到“XXX”函数符号,结果用readelf -s [file] 就找到了。其实问题是我对so理解的不深刻。

 

一般来说,对于一个so库有两个符号表,一个是“正常的”(在.symtab和.strtab节中)。一个是动态的(.dynsym和.dynstr节中)。如果这个两个表被移除,那么so库就完全没有用了。动态符号表的符号只被用于动态加载器运行时的加载。而“正常”的符号表,一般是用来调试的,里面的函数符号,是没有被导出的(一般是一些静态函数),所以不可能被外部程序使用。“正常”的符号表里面的函数符号,也不会在动态符号表中。

 

可以用 nm -D 和 readelf -s这两个命令来显示一个so文件的动态符号表信息。链接器去查找的也是动态符号表中的函数符号.

 

 

references:

http://stackoverflow.com/questions/9961473/nm-vs-readelf-s

http://osily.lofter.com/post/161c56_3dfd53

nm和readelf命令的区别

标签:http   io   os   使用   sp   文件   on   问题   bs   

原文地址:http://www.cnblogs.com/foohack/p/4103074.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!