首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >readelf不显示共享库的版本号

readelf不显示共享库的版本号
EN

Stack Overflow用户
提问于 2012-11-24 03:08:40
回答 1查看 9.1K关注 0票数 4

对于为ARM编译的共享对象,使用-a选项调用readelf会显示不带版本号的库,即libc.so

代码语言:javascript
复制
me@home:~ $ readelf -a shared_object_for_arm | grep "Shared library"
Type:                              DYN (Shared object file)
0x00000001 (NEEDED)                     Shared library: [libc.so]
0x00000001 (NEEDED)                     Shared library: [libm.so]
0x00000001 (NEEDED)                     Shared library: [libGLESv1_CM.so]
0x00000001 (NEEDED)                     Shared library: [libz.so]
0x00000001 (NEEDED)                     Shared library: [liblog.so]

但是,当我为系统中的共享对象重新获取相同的内容时,会显示版本号。对于上述情况,我也使用了arm-linux-gnueabi-readlef,但没有任何变化。我正在x86系统中尝试这一点。

代码语言:javascript
复制
me@home:~ $ readelf -a /usr/lib/libsnmp.so.15 | grep "Shared library"
Type:                              DYN (Shared object file)
0x00000001 (NEEDED)                     Shared library: [libcrypto.so.1.0.0]
0x00000001 (NEEDED)                     Shared library: [libc.so.6]

除了readelf之外,还有没有其他方法可以显示版本号?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-26 09:53:12

您可以尝试使用elfutils中的eu-readelf,但我认为两者都只是将存在的内容转储。如果DT_NEEDED条目不包含带版本的字符串,则没有版本。共享对象的动态部分包含类似的DT_SONAME条目。SONAME或共享对象名称是共享库(动态共享对象)的某种规范名称。

代码语言:javascript
复制
$ readelf -d /lib64/libc.so.6 | grep SONAME
0x000000000000000e (SONAME)             Library soname: [libc.so.6]

$ readelf -d /bin/ls | grep NEEDED
...
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

如果您针对某些库进行编译,则会将其DT_SONAME条目复制到您正在创建二进制或共享对象的DT_NEEDED条目中。在执行时,动态链接器将使用DT_NEEDED条目来查找具有该名称的文件。AFAIK动态链接器不会检查该文件DT_SONAME条目,因此在理论上它根本不需要DT_SONAME,或者它可能会有所不同。您只需确保目标系统上的libc.so指向正确的库。它可能是对libc.so.6的symlik,这无关紧要。

总而言之,如果一个二进制文件链接到libc.so.6,另一个链接到libc.so,那么它仍然可以工作,只要具有这些名称的实际文件是相同的,或者一个是到另一个的符号链接。如果你想检查在运行时实际加载了什么,ldd是你的朋友。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13534630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档