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