【问题标题】:Why is ld.so a shared object?为什么 ld.so 是共享对象?
【发布时间】:2020-01-01 08:35:30
【问题描述】:

我目前正在编写一个动态链接器,但有一些问题困扰着我。 为什么 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 机制有一个解释文件的可执行文件。你是在问为什么装载机不采取同样的行动?我想这可能是流程问责制的经济问题......

标签: linux loading ld elf


【解决方案1】:

动态链接器可以是简单的 ELF 可执行文件 (ET_EXEC) 吗?

是的,可以。

但是,ET_EXEC 必须加载到它所链接的地址,并且该地址可能与 a.out 本身所链接的地址冲突。如果发生这种冲突,内核将在进程启动之前将其终止,或者将mmapa.out“置于”ld.so之上,生成的二进制文件将崩溃。

您可以将ld.so 移出通常的a.out 链接地址,但总有人可以将a.out 链接到非通常的地址。

如果您将ld.so 链接为ET_DYN,加载地址为零,则不会发生上述问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 2016-03-20
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    相关资源
    最近更新 更多