对于为ARM编译的共享对象,使用-a选项调用readelf会显示不带版本号的库,即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之外,还有没有其他方法可以显示版本号?
发布于 2012-11-26 09:53:12
您可以尝试使用elfutils中的eu-readelf,但我认为两者都只是将存在的内容转储。如果DT_NEEDED条目不包含带版本的字符串,则没有版本。共享对象的动态部分包含类似的DT_SONAME条目。SONAME或共享对象名称是共享库(动态共享对象)的某种规范名称。
$ 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是你的朋友。
https://stackoverflow.com/questions/13534630
复制相似问题