【发布时间】:2017-05-28 06:02:50
【问题描述】:
如果动态链接器/加载器本身是一个共享目标文件,如果它还没有加载到动态链接程序的进程映像空间中,如何正确加载它?这是某种捕捉 22 的东西吗?
【问题讨论】:
-
从您的链接中,发帖人说“库由 ld.so 加载”,但是,我的问题是,如果 ld.so 本身是“库”(共享对象),那么首先如何加载 ld.so文件)...
-
以及讨论的部分'它被声明为所有动态链接ELF二进制文件的“解释器”(INTERP;.interp部分)。因此,当您启动程序时,Linux 会启动一个 ld.so(加载到内存并跳转到其入口点),然后 ld.so 会将您的程序加载到内存中,准备好然后运行它。您也可以使用
/lib/ld-linux.so.2 ./your_program your_prog_params' 启动动态程序,说明内核加载并运行它,然后解释二进制文件,从而避免了 Catch-22,因为内核确实处理了动态加载程序的加载。注意我没有使用 Mjölnir! -
"Linux 将启动一个 ld.so (加载到内存并跳转到它的入口点)", "说明内核加载并运行它" 所以如果我理解正确的话,内核有执行 ld.so 提供的所有功能(例如重定位等)的能力?
-
@John41_,不,内核不支持在用户空间程序中进行 ELF 重定位。它可能只启动静态链接的 ELF 或启动一些特殊编写的二进制文件,如 ld-linux.so,它们是特殊的(不需要过早重定位,自己进行重定位处理)。解释的二进制文件由内核加载,但由 ld-linux.so 处理。
标签: unix linker shared-libraries elf