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