Linux上的共享库:为什么动态链接器在用户上下文中运行?

Linux上的共享库:为什么动态链接器在用户上下文中运行?,linux,linker,shared-libraries,Linux,Linker,Shared Libraries,在阅读过程中,我发现了一个奇怪的事实,即使用共享库的应用程序是分两步加载的。首先,内核加载应用程序映像,然后将动态链接器加载程序二进制文件添加到地址空间,并将控制权传递给它。动态链接器加载器在用户空间中运行,假定在应用程序的时间段内运行,并提取其余代码或将引用链接到已加载的共享对象。这就是为什么选择如此复杂的方案,即限制运行时消耗的想法吗 为什么选择如此复杂的方案 因为它没有其他选择那么复杂 特别是,它允许在不重新启动的情况下开发GLIBC和dynamic loader,允许GLIBC load

在阅读过程中,我发现了一个奇怪的事实,即使用共享库的应用程序是分两步加载的。首先,内核加载应用程序映像,然后将动态链接器加载程序二进制文件添加到地址空间,并将控制权传递给它。动态链接器加载器在用户空间中运行,假定在应用程序的时间段内运行,并提取其余代码或将引用链接到已加载的共享对象。这就是为什么选择如此复杂的方案,即限制运行时消耗的想法吗

为什么选择如此复杂的方案

因为它没有其他选择那么复杂

特别是,它允许在不重新启动的情况下开发GLIBC和dynamic loader,允许GLIBC loader的多个版本在同一系统上共存,并允许GLIBC与其他具有自己的dynamic loader的libc实现共存

为什么首先让内核加载主映像


内核必须找到并读取主映像,以便从中提取PT_INTERP。我猜想,将它留在内存中比卸载并让解释器重新执行工作要省力,而且显然也更快。

它还能在哪里运行?在内核中?如果在内核中运行会带来包括更多安全问题在内的负面影响,那么好处是什么呢?是的,有好处也有坏处——我问为什么会这样,而不是你能提出多少问题;