4

对于为 编译的共享对象,使用选项ARM调用,显示没有版本号的库,即readelf-alibc.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除了显示版本号还有其他方法吗?

4

1 回答 1

5

您可以尝试来自 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 的符号,没关系。

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

于 2012-11-26T01:53:12.403 回答