Linux下动态链接的步骤与实现详解(4)

很明显,如果指定的用户入口地址是动态链接器本身,那么说明动态链接器是被当可
执行文件在执行。在这种情况下,动态链接器就会解析运行时的参数,并且进行相应的处理_dl_main本身非常的长,主要的工作就是前面提到的对程序所依赖的共享对象进行装载、符号解析和重定位,我们在这里就不再详细展开了,因为它的实现细节又是一个非常大的话题

关于动态链接器本身的细节实现虽然不再展开,但是作为一个非常有特点的,也很特殊的共享对象,关于动态链接器的实现的几个问题还是很值得思考的:

动态链接器本身是动态链接的还是静态链接的?

动态链接器本身应该是静态链接的,它不能依赖于其他共享对象,动态链接器本身是用来帮助其他ELF文件解决共享对象依赖问题的,如果它也依赖于其他共享对象,那么谁来帮它解决依赖问题?所以它本身必须不依赖于其他共享对象。这一点可以使用ldd来判断:
$ ldd /lib/ld-linux so 2
statically linked

动态链接器本身必须是PC的吗?

是不是PC对于动态链接器来说并不关键,动态链接器可以是PC的也可以不是,但往往使用PIC会更加简单一些。一方面,如果不是PC的话,会使得代码段无法共享,浪
费内存:另一方面也会使ldso本身初始化更加复杂,因为自举时还需要对代码段进行重定位。实际上的ld- linux.so.2是PIC的。

动态链接器可以被当作可执行文件运行,那么的装载地址应该是多少?

ld.so的装载地址跟一般的共享对象没区别,即为0x0000这个装载地址是一个无效的装载地址,作为一个共享库,内核在装载它时会为其选择一个合适的装载地址。

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d1529f1940a41c9a7205cdc6c4a42f1c.html