c++ 加载使用共享库的可执行文件时,动态链接器如何链接?

wztqucjr  于 2023-02-26  发布在  其他
关注(0)|答案(2)|浏览(117)

我现在阅读动态链接的过程,看到动态链接器也是共享库(ld.linux.so),那么ld.linux.so是怎么链接的呢?
是否以静态方式链接?

gudnpqoy

gudnpqoy1#

是否以静态方式链接?
是的,它是一个共享库,它本身不依赖于其他库(也不能有任何依赖,因为没有任何东西可以解决这种依赖)--它必须是完全自包含的。
特别是,ld.so包含许多libc例程(mallocmmapstrcpy等)的副本,您可以在nm /lib64/ld-linux-x86-64.so.2中看到它们(如果您的发行版没有从ld-linux中删除strip符号)。
此外,这个特殊的共享库是由内核在随机地址上进行mmap编辑的,它必须在启动时 * 重新定位 * 自己(因为再一次,没有其他东西可以执行这样的重新定位)。
在不允许PC相关数据寻址的平台上,可能会涉及这种自重定位。

avkwfej4

avkwfej42#

当内核加载一个可执行文件时,它会查找ELF文件的.interp部分;interpreter* 的缩写。对于动态链接的可执行文件,静态链接器会在构建时将其设置为ld-linux。在运行时,内核会加载此解释器来处理其他库的链接。
使用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

相关问题