我现在阅读动态链接的过程,看到动态链接器也是共享库(ld.linux.so),那么ld.linux.so是怎么链接的呢?是否以静态方式链接?
gudnpqoy1#
是否以静态方式链接?是的,它是一个共享库,它本身不依赖于其他库(也不能有任何依赖,因为没有任何东西可以解决这种依赖)--它必须是完全自包含的。特别是,ld.so包含许多libc例程(malloc、mmap、strcpy等)的副本,您可以在nm /lib64/ld-linux-x86-64.so.2中看到它们(如果您的发行版没有从ld-linux中删除strip符号)。此外,这个特殊的共享库是由内核在随机地址上进行mmap编辑的,它必须在启动时 * 重新定位 * 自己(因为再一次,没有其他东西可以执行这样的重新定位)。在不允许PC相关数据寻址的平台上,可能会涉及这种自重定位。
ld.so
libc
malloc
mmap
strcpy
nm /lib64/ld-linux-x86-64.so.2
ld-linux
strip
avkwfej42#
当内核加载一个可执行文件时,它会查找ELF文件的.interp部分;interpreter* 的缩写。对于动态链接的可执行文件,静态链接器会在构建时将其设置为ld-linux。在运行时,内核会加载此解释器来处理其他库的链接。使用readelf -p .interp <executable>可以看到这一点。例如,在我的系统上运行readelf -p .interp /bin/ls输出
.interp
readelf -p .interp <executable>
readelf -p .interp /bin/ls
String dump of section '.interp': [ 0] /lib64/ld-linux-x86-64.so.2
另请参见ld-linux的manual。
2条答案
按热度按时间gudnpqoy1#
是否以静态方式链接?
是的,它是一个共享库,它本身不依赖于其他库(也不能有任何依赖,因为没有任何东西可以解决这种依赖)--它必须是完全自包含的。
特别是,
ld.so
包含许多libc
例程(malloc
、mmap
、strcpy
等)的副本,您可以在nm /lib64/ld-linux-x86-64.so.2
中看到它们(如果您的发行版没有从ld-linux
中删除strip
符号)。此外,这个特殊的共享库是由内核在随机地址上进行
mmap
编辑的,它必须在启动时 * 重新定位 * 自己(因为再一次,没有其他东西可以执行这样的重新定位)。在不允许PC相关数据寻址的平台上,可能会涉及这种自重定位。
avkwfej42#
当内核加载一个可执行文件时,它会查找ELF文件的
.interp
部分;interpreter* 的缩写。对于动态链接的可执行文件,静态链接器会在构建时将其设置为ld-linux。在运行时,内核会加载此解释器来处理其他库的链接。使用
readelf -p .interp <executable>
可以看到这一点。例如,在我的系统上运行readelf -p .interp /bin/ls
输出另请参见ld-linux的manual。