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

标签 linux loading ld elf

我目前正在编写一个动态链接器,但有些事情困扰着我。 为什么 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 必须加载到它链接的地址,并且该地址可能与 a.out 所在的地址冲突。本身是相连的。如果发生此类冲突,内核将在进程启动之前将其终止,或者 mmap a.out “在之上”ld.so ,生成的二进制文件将会崩溃。

您可以移动ld.so打破常规a.out链接地址,但总有人可以链接a.out在不寻常的地址。

如果您链接 ld.soET_DYN ,加载地址为零,那么上述问题都不会发生。

关于linux - 为什么 ld.so 是共享对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57686926/

相关文章:

linux - 如何在 linux 中排序和计算行的出现次数

r - Ubuntu 在 R 中删除 .libPaths()

ios - 在 swift 中实现加载微调器

jquery - 预加载图像并在加载时显示微调器

linker - 为什么链接器会更改共享库名称?

c - 使用 dub2() 将输出重定向到文件 : undefined reference to `dub2'

static-libraries - 从命令行编译适用于 iOS 9 的 C 库,Xcode 7-beta 2

c - Linux 上的 <conio.h> 头文件在哪里?为什么我找不到 <conio.h>?

linux - 由于 armhf 导致的 apt-get 更新错误

AngularJS 页面只有在刷新后才能工作