Ahm*_*awy 1 c libraries executable
可执行文件应该是机器代码。
因此,将在不需要 c 库的情况下进行系统调用。
但是,我不明白这张图片是什么意思?
它只是一种抽象方法吗?
Gil*_*il' 10
您有一个调用库函数的程序。在这种情况下,它是系统标准库,也称为“C 库”(但还有许多其他库可以从 C 代码中调用,这只是一个名称)。“库函数”是指函数的代码作为库的一部分分发。程序在运行时可以通过两种方式调用库函数。
如果库是静态链接到程序中的,这意味着当程序构建时,结果是一个可执行文件,其中包括编译程序源代码(程序中的main
函数和任何其他函数)的结果,以及函数来自诸如printf
(链接器在名为/lib/libc.a
或某个类似位置的文件中找到)的库中。这意味着在构建程序时完全执行了“链接器”步骤。所有“(Lib ref)”位都被库中的代码替换。程序运行时,不需要任何库文件。的代码printf
在程序可执行文件中。由于write
是系统调用而不是库函数²,因此其代码位于内核内部。
如果库是动态链接的,那么图片中的链接器步骤不包括可执行文件中的库代码。它所做的只是填写一些指令,以便在程序启动时从库中加载某些函数:可执行文件仍然包含“(Lib ref)”位。当可执行文件被执行时,它做的第一件事就是加载共享库文件(/lib/libc.so
或一些类似的文件)并将程序所需的函数名与库提供的函数名相匹配。
“抽象方法”这个术语相当模糊。不要执着于它。您可以说动态链接抽象了库,因为可以使用库的不同实现来运行相同的可执行文件。
该图似乎在解释静态链接。在现实生活中,动态链接在多道程序系统中最为常见。静态链接有两个主要缺点:如果不升级使用它的所有程序,您就无法升级库(例如修复错误),并且如果许多程序使用同一个库,那么您必须存储尽可能多的代码副本。静态链接适用于只运行单个程序并且只能通过替换整个代码映像来升级的低端嵌入式系统,但动态链接对于运行许多不同程序的系统来说是常态。
¹文件名可能比您系统上的更复杂,但这与此答案无关。
²其实,有一个库函数叫做write
,但它所做的只是进行系统调用。在我的回答中,我指的是该名称的系统调用。