【问题标题】:readelf does not show shared libraries' version numbersreadelf 不显示共享库的版本号
【发布时间】:2012-11-23 19:08:39
【问题描述】:

对于为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还有其他方式显示版本号吗?

【问题讨论】:

    标签: linux dynamic-linking shared-libraries


    【解决方案1】:

    您可以从 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 是您的朋友。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多