Crt.s文件的用途是什么?

时间:2018-08-04 09:20:04

标签: startup riscv

我知道它们是用来调用main()的,但是如果这是唯一的目的,那么拥有不同的crt文件的意义何在。为什么不使用默认的而不是创建自己的呢?

1 个答案:

答案 0 :(得分:0)

CRT文件是C运行时文件。您最可能遇到的一个是crt0.S,这是大多数系统提供的第一个代码的名称,该代码在给定进程中执行。这实际上是在系统ABI(即Linux加载程序提供的内容)和语言ABI(即用户可以更改的代码)之间转换的填充层。这样,实现既与语言运行时(即C库)也与系统运行时(即内核)耦合。结果是,每个内核/ libc对通常只有一个crt0.S

如果这是唯一需要写crt0.S的情况,那么一切都会好起来的,您可能永远不会听说过-就像您可能从未听说过其他任何一个一样工具链的深奥之处。当您考虑嵌入式系统时,所有这些开始成为问题的部分是-具体地说,嵌入式系统上的软件堆栈往往有些自成体系。结果是,系统运行时(可能只是处理器在重置时所做的任何事情)和语言运行时(这是C的某些受限子集)之间很少有标准接口。由于crt0.S是这两者之间的垫片,因此系统的趋向往往有所不同。

作为一个具体示例:在大多数POSIX ABI中,加载程序负责在将控制权转移给ELF之前设置ELF中的所有段。在嵌入式系统中并非如此,因此CRT必须以这样的方式编写,使其可以仅使用已设置的部分子集进行初始化。因此,POSIX crt0.S不必初始化数据段或堆栈指针,而嵌入式crt0.S通常需要初始化。

另一方面,POSIX C运行时倾向于支持许多复杂的功能,例如线程本地存储,动态链接,错误处理和信号。嵌入式运行时往往仅支持这些功能的有限子集(通常出于空间原因),这使POSIX crt0.S无法使用。