链接器(用于执行编译后的链接)和加载器(用于执行可执行文件)的存在是否不依赖于Linux等操作系统? (我曾经认为Linux中的链接器和加载器要么由操作系统提供,要么像其他应用程序一样由软件提供。现在我认为它们非常特殊且不同。无论安装哪个操作系统,它们都可能是相同的。)
链接器和加载器是否存在于机器语言(即 ISA 级别)? (在该级别,没有操作系统。)还是汇编语言级别?
从编程软件的角度来看,将操作系统视为编程库是否正确?
谢谢。
我想知道将链接器和加载器安装到计算机系统的级别/层中的位置。
有关计算机系统的层次/级别,请参阅 Nisan 的《计算机系统要素》:
有关链接和加载,请参阅计算机系统:程序员的视角
答案1
链接器(用于执行编译后的链接)和加载器(用于执行可执行文件)的存在是否不依赖于Linux等操作系统? (我曾经认为Linux中的链接器和加载器要么由操作系统提供,要么像其他应用程序一样由软件提供。现在我认为它们非常特殊和不同。)
与任何其他应用程序一样,链接器和加载器都有特定的用途。它们对于构建静态程序以及构建和加载动态程序很重要,但它们是“普通”应用程序(或库,在运行时加载程序的情况下) -IE虽然它们很复杂,但可以说它们并不依赖操作系统的特殊支持。
因此可以将一个操作系统的程序链接到另一个操作系统上(例如在 Linux 上构建 Windows 程序,反之亦然),并在另一个系统上加载为一个系统构建的动态链接程序(请参阅 Wine)。对操作系统的主要要求是它提供某种加载新可执行内容的方法(IE允许正在运行的程序向自身添加可执行内存),并且允许对虚拟地址空间进行足够的控制以满足程序的要求(特别是用于加载可执行文件和库的基地址)。
链接器和加载器是否存在于机器语言(即 ISA 级别)? (在该级别,没有操作系统。)还是汇编语言级别?
我不确定是什么导致了这些问题,但链接器对符号和地址进行操作。它们使用包含导入和导出符号表的目标文件,以及填充链接器计算的值的重定位条目。
将操作系统视为编程库是否正确?
这是非常有限的。操作系统为在其上运行的应用程序提供一些服务,但它的作用远不止于此,即使是非常简单的操作系统(8 位微处理器、MS-DOS 等);例如,它处理硬件中断、调度进程(对于多任务系统)、控制访问权限(对于具有访问控制的多用户系统)......
我的印象是,您所指的图表作为书籍地图比作为理解计算机体系结构的方式更有用。