readelf不显示共享库的版本号

时间:2012-11-23 19:08:40

标签: linux dynamic-linking shared-libraries

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

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系统中尝试这个。

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以外还有其他方法可以显示版本号吗?

1 个答案:

答案 0 :(得分:2)

你可以从elfutils尝试eu-readelf,但恕我直言,只是转储任何在那里。如果DT_NEEDED条目不包含带有版本的字符串,则它没有版本。共享对象的动态部分包含类似的DT_SONAME条目。 SONAME或共享对象NAME是共享库(动态共享对象)的某种规范名称。

$ 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是你的朋友。