我目前正在编写一个动态链接器,但有些事情困扰着我。 为什么 ld.so (我系统的动态链接器)是共享对象? 为什么它不能只是一个静态可执行文件(ET_EXEC)?
我尝试在 linux 内核的 binfmt_elf.c 中寻找答案,但据我了解,它清楚地表明您的 ELF 解释器可能是静态可执行文件。
编辑:我认为我的想法总结为:动态链接器可以是一个简单的 ELF 可执行文件(ET_EXEC)吗?
/* 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.so
如ET_DYN
,加载地址为零,那么上述问题都不会发生。
关于linux - 为什么 ld.so 是共享对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57686926/