本文主要是介绍nm、readelf和共享库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
逛论坛时 有人说
现在linux系统里的.so大部分不是用gcc -shared生成的,本身不包含符号表,而符号表是保存在一个.a文件里的,链接时只需要那个.a就可以了,类似Windows那样。
使用方法1:
查看共享库的依赖库(NEEDED)和搜索名(SONAME)。
readelf -d <file_name>
例如:
#readelf -d libuClibc-0.9.30rc2.so
第一次听说这样的事,我也试试:
$nm /usr/lib/libm.so
nm: /usr/lib/libm.so: no symbols
果然如此,上网查了查,有人说是因为/usr/lib/libm.so是符号链接,找到真正的文件一试还是这样,其余符号链接和真实文件读取上没有什么差别。
又找了找,发现了一个不小的问题。
$ readelf -s /usr/lib/libm.so...35: 000092c0 80 FUNC WEAK DEFAULT 12 sin@@GLIBC_2.036: 00010530 125 FUNC WEAK DEFAULT 12 acosf@@GLIBC_2.037: 000094d0 124 FUNC WEAK DEFAULT 12 acosh@@GLIBC_2.038: 00013a00 15 FUNC WEAK DEFAULT 12 fmaf@@GLIBC_2.139: 00017c10 1
这篇关于nm、readelf和共享库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!