阅读Ulrich Dreppers的“ Shared Lib Howto”时,我遇到了一个奇怪的事实(据我了解),使用共享库的应用程序分两个步骤加载。首先,内核加载应用程序映像,然后将动态链接程序加载器二进制文件添加到地址空间,并将控制权传递给它。动态链接加载程序在用户空间中运行,可能在应用程序的时间片内运行,并提取其余代码或将引用链接到已加载的共享对象。这是一个想法(即限制运行时消耗),为什么选择了这样一个复杂的方案?
为什么选择了这么复杂的方案?
因为它没有其他方法那么复杂。
特别是,它允许开发GLIBC和动态加载器而无需重新启动,它允许多个版本的GLIBC加载器在同一系统上共存,并且允许GLIBC与其他libc实现(将具有自己的动态加载器)共存。
为什么要让内核首先加载主映像?
内核必须找到并读取主映像才能从中提取PT_INTERP
。我猜想,将其保留在内存中的工作要比卸载并让解释器重新执行工作少,而且显然也更快。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句