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

8
我目前正在编写一个动态链接器,有一些问题困扰着我。为什么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堆栈交换上。 如果我的问题很愚蠢,我也很抱歉,但是没有答案让我感到疯狂。


设计选择的哲学?She-bang机制有一个可执行文件解释器。您是否在问为什么加载程序不会采取同样的方式?我猜这可能是一个进程责任经济的问题... - Ale
1个回答

5
动态链接器可以是简单的ELF可执行文件(ET_EXEC)吗?
是的,它可以。
但是,ET_EXEC必须加载到它链接的地址上,而该地址可能与a.out本身链接的地址冲突。如果发生这样的冲突,内核将在进程启动之前杀死该进程,或者它将在ld.so上面“mmap”a.out,并导致二进制文件崩溃。
您可以将ld.so移出通常的a.out链接地址的位置,但有人总是可以将a.out链接到不寻常的地址。
相反,如果将ld.so作为ET_DYN链接,并将其加载地址设置为零,则上述问题都不会发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接