为什么 ld.so 是共享对象?

Why is ld.so a shared object?

我目前正在编写一个动态链接器,但有一些问题困扰着我。 为什么 ld.so (我系统的动态链接器)是一个共享对象? 为什么它不能只是静态可执行文件 (ET_EXEC)?

我试图在 linux 内核的 binfmt_elf.c 中寻找答案,但据我了解,它清楚地表明您的 ELF 解释器可能是静态可执行文件。

编辑:我认为我的想法可以总结为:动态链接器可以是简单的 ELF 可执行文件 (ET_EXEC) 吗?

binfmt_elf.c.559:

/* First of all, some simple consistency checks */
    if (interp_elf_ex->e_type != ET_EXEC &&
        interp_elf_ex->e_type != ET_DYN)
        goto out;

PS:我希望这是正确的地方,我不知道我应该把它放在这里还是放在 Unix 堆栈交换上。 如果我的问题很愚蠢但没有答案让我发疯,我也很抱歉。

Can a dynamic linker be a simple ELF executable (ET_EXEC) ?

是的,可以。

但是,ET_EXEC 必须 加载到它被 link 编辑的地址,并且该地址可能与 a.out 本身是 linked。如果发生此类冲突,内核将在进程启动之前终止该进程,或者它将 mmap a.out "on top of" ld.so,并且生成的二进制文件将崩溃。

您可以将 ld.so 移出常用 a.out link 地址,但有人总是可以 link a.out 在不常用的地址.

如果您 link ld.soET_DYN,加载地址为零,则上述问题中的 none 可能会发生。