【发布时间】:2016-02-06 08:36:05
【问题描述】:
我了解 C 编译过程的每一点(如何链接目标文件以创建可执行文件)。但是关于加载程序本身(启动程序运行)我有一些疑问。
加载器是内核的一部分吗?
./firefox或类似的命令究竟是如何加载的?我的意思是你通常在终端中输入这样的命令来加载我认为的可执行文件。那么loader是shell的一个组件吗?
我想我也对终端/shell 适合所有这些以及它的作用感到困惑。
【问题讨论】:
-
Q1:否;加载器通常是一个名为
ld的常规程序;它不是内核的一部分。它也被称为链接器(但名称仍然是ld)。它收集目标文件和库并从中创建一个可执行文件——或者如果您使用正确的选项调用它,则创建一个共享库,如果您有足够的知识,您还可以生成一两个其他东西。 Q2:您的意思是 Firefox 是如何运行的,或者它是如何链接的?运行程序不是编译过程的一部分,但有时称为“加载程序”。该代码在内核中。 -
Q2(续):嗯,有些代码在内核中;另一个主要块是动态加载器,它通常具有诸如
ld.so.1之类的名称。对于您想要了解的内容,我们确实需要更多背景信息。不过,对于 SO,这个问题可能过于宽泛。 -
我认为 OP 正在讨论加载未链接的过程映像。但他可能会提出他的问题……
-
+Jonathan Leffler 谢谢。我相当了解链接过程。我只是想了解从创建可执行文件到实际执行可执行文件的过程。如果确实如此,那么 shell 适合所有这些吗?
-
在被链接的可执行文件的结尾和它被执行之间没有任何事情发生——除非它被复制(安装)到新的地方。当您运行可执行文件时,无论是通过 shell 命令行还是其他机制(例如单击图标),内核都会参与其中(通过
exec()系列系统调用 - 通常也是fork()),启动程序。然后动态加载器整理出共享库,程序开始运行。这是一个很大的话题;您应该找到一本教科书并详细阅读其中的内容。
标签: c linux linker system-calls loader