gpt4 book ai didi

linux - readelf 不显示共享库的版本号

转载 作者:太空狗 更新时间:2023-10-29 11:15:29 25 4
gpt4 key购买 nike

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

最佳答案

您可以尝试使用 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,只要具有这些名称的实际文件相同或者一个是另一个的符号链接(symbolic link),它仍然可以工作。如果您想检查运行时实际加载的内容,ldd 是您的 friend 。

关于linux - readelf 不显示共享库的版本号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13534630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com