Shu*_*eng 14 linux file-command dynamic-linking shared-library
考虑 的共享对象依赖项/bin/bash,其中包括/lib64/ld-linux-x86-64.so.2(动态链接器/加载器):
ldd /bin/bash
linux-vdso.so.1 (0x00007fffd0887000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f57a04e3000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f57a04de000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f57a031d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f57a0652000)
Run Code Online (Sandbox Code Playgroud)
检查/lib64/ld-linux-x86-64.so.2表明它是一个符号链接/lib/x86_64-linux-gnu/ld-2.28.so:
ls -la /lib64/ld-linux-x86-64.so.2
lrwxrwxrwx 1 root root 32 May 1 19:24 /lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.28.so
Run Code Online (Sandbox Code Playgroud)
此外,file报告/lib/x86_64-linux-gnu/ld-2.28.so本身是动态链接的:
file -L /lib64/ld-linux-x86-64.so.2
/lib64/ld-linux-x86-64.so.2: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
Run Code Online (Sandbox Code Playgroud)
我想知道:
/lib64/ld-linux-x86-64.so.2) 本身如何动态链接?它在运行时链接自己吗?/lib/x86_64-linux-gnu/ld-2.28.so记录在案以处理 a.out 二进制文件 ( man ld.so),但是/bin/bashELF 可执行文件吗?程序 ld.so 处理 a.out 二进制文件,这是一种很久以前使用的格式;ld-linux.so*(libc5 为 /lib/ld-linux.so.1,glibc2 为 /lib/ld-linux.so.2) 好吗?dles ELF,大家多年来一直在使用它。
Ste*_*itt 20
是的,它在初始化时链接自己。从技术上讲,动态链接器本身不需要对象解析和重定位,因为它完全按原样解析,但它确实定义了符号,并且在解析它“解释”的二进制文件时必须处理这些符号,并且这些符号被更新指向它们在加载的库中的实现。特别是,这会影响malloc- 链接器具有内置的最小版本,带有相应的符号,但是一旦加载和重新定位(或者甚至是插入的版本,如果有的话),它就会被 C 库的版本替换,请小心采取措施确保这不会发生在可能破坏链接器的地方。
血腥的细节在rtld.c, 在dl_main函数中。
但是请注意,ld.so它没有外部依赖项。您可以看到与nm -D; 相关的符号。它们都不是未定义的。
联机帮助页仅指直接在 下的条目/lib,即 /lib/ld.so(支持 ELF的 libc 5 动态链接器a.out)和/lib*/ld-linux*.so*(支持 ELF 的 libc 6 动态链接器)。联机帮助页非常具体,而ld.so不是ld-2.28.so.
在绝大多数当前系统上找到的动态链接器不包括a.out支持。
file并ldd为动态链接器报告不同的内容,因为它们对构成静态链接的二进制文件有不同的定义。对于ldd,如果二进制文件没有DT_NEEDED符号,即没有未定义的符号,则它是静态链接的。对于file,如果 ELF 二进制文件没有PT_DYNAMIC节,则它是静态链接的(这将在file以下 5.37的版本中更改;它现在使用PT_INTERP节的存在作为动态链接二进制文件的指示符,它与编码)。
GNU C 库动态链接器没有任何DT_NEEDED符号,但它有一个PT_DYNAMIC部分(因为它在技术上是一个共享库)。结果,ldd(这是动态链接器)表明它是静态链接的,但file表明它是动态链接的。它没有PT_INTERP节,所以下一个版本也file将表明它是静态链接的。
$ ldd /lib64/ld-linux-x86-64.so.2
statically linked
$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
Run Code Online (Sandbox Code Playgroud)
(与file5.35)
$ file $(readlink /lib64/ld-linux-x86-64.so.2)
/lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
Run Code Online (Sandbox Code Playgroud)
(使用当前正在开发的版本file)。
| 归档时间: |
|
| 查看次数: |
1841 次 |
| 最近记录: |