这个问题是编译器如何在内存中布局代码 的延续,该问题 发布在堆栈溢出中。
ld
关于Linux 中可用的 (GNU) 实用程序,我几乎没有问题。
每当一个程序在 shell 中运行时,比如说./a.out
,shell 都会使用ld
来加载由 代表的程序a.out
。
shell 怎么知道它必须
ld
用来加载a.out
. 它是否扫描a.out
以检查它是否为 ELF 格式,如果是,则使用ld
?它当然不能使用文件扩展名,因为没有以某种格式命名可执行文件的规则。实用程序可以
ld
加载以除 ELF 之外的任何其他可执行格式表示的程序吗?假设我想出了自己的可执行格式,比如“xyz”,然后我编写了自己的加载程序
abc
来处理这些可执行文件。那么,是否有任何shell命令可以配置:“使用加载程序加载abc
以特定可执行格式“xyz”编译的程序?
外壳不知道,内核知道。请参阅Linux 上存在哪些类型的可执行文件?以及链接的文章以获取详细信息。内核加载器加载二进制文件,如果需要,它的解释器(
ld.so
用于动态二进制文件)。的每个实现
ld.so
都是特定于格式的。是的,可以通过向内核添加二进制加载程序,或者使用
binfmt_misc
. 看看Mono 有多神奇?详情。