为什么 ld.so 是共享对象?
Why is ld.so a shared object?
我目前正在编写一个动态链接器,但有一些问题困扰着我。
为什么 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
必须 加载到它被 link 编辑的地址,并且该地址可能与 a.out
本身是 linked。如果发生此类冲突,内核将在进程启动之前终止该进程,或者它将 mmap
a.out
"on top of" ld.so
,并且生成的二进制文件将崩溃。
您可以将 ld.so
移出常用 a.out
link 地址,但有人总是可以 link a.out
在不常用的地址.
如果您 link ld.so
为 ET_DYN
,加载地址为零,则上述问题中的 none 可能会发生。
我目前正在编写一个动态链接器,但有一些问题困扰着我。 为什么 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
必须 加载到它被 link 编辑的地址,并且该地址可能与 a.out
本身是 linked。如果发生此类冲突,内核将在进程启动之前终止该进程,或者它将 mmap
a.out
"on top of" ld.so
,并且生成的二进制文件将崩溃。
您可以将 ld.so
移出常用 a.out
link 地址,但有人总是可以 link a.out
在不常用的地址.
如果您 link ld.so
为 ET_DYN
,加载地址为零,则上述问题中的 none 可能会发生。