繁体   English   中英

static库的链接和加载

[英]Linking and Loading of static library

我的问题是 linker 究竟是如何工作的。

  • 我正在将一个可执行文件与多个第三方 static 库链接。 在这些 static 库中,可执行文件仅使用其中的几个。 在上述情况下,linker 是否仅链接到其函数在可执行文件中引用的库?
  • 如果 static 库有多个 object 文件并且只有一个被可执行文件使用,它是否只链接到该 object 文件? 或者它指向整个 static 库的链接,但只加载使用的 object 文件?

对于您的第一个问题,如果没有使用给定库中的符号,它通常不会包含在最终产品中。 Regarding object files the linker likely won't even include full object files but only symbols that are actually referenced, though your linker may have flags that change this behavior and cause the entire library to be included.

... linker 究竟是如何工作的。

a)... linker 是否仅链接到可执行文件中引用其功能的库?

b)... static 库有多个 object 文件,并且只有一个由可执行文件使用,它是否只链接到该 object 文件?

这取决于...在 Linux 上,有两种库...“.so”和 the.a(存档)。

例子:

 /usr/lib/x86_64-linux-gnu/libgmpxx.a
 /usr/lib/x86_64-linux-gnu/libgmpxx.so

如果您在构建命令的链接部分指定 .a,则只会链接您的应用程序引用的 object 文件(而不是整个库)。 这个可执行文件是“独立的”,每个运行的副本都有它自己使用的任何功能的副本。

如果您在构建命令的链接部分指定.so,并且您的应用程序是第一个使用特定“.so”库的应用程序,我相信您的应用程序将在启动期间短暂暂停,而整个“.so” “ lib 已加载。

如果您在构建命令的链接部分指定了.so,并且您的应用程序不是第一个使用此特定.so 的,那么加载器将向您的应用程序添加到已经加载的-'.so 的映射' 在系统 memory 中。 (更快的连接)

Executable的using.so依赖系统将.so库加载到memory中,并将库内存映射到app memory中,完成app到所需功能的链接。

我相信您的“静态库”对应于“.a”(存档)库的使用。

a) 是的 - 当没有更多未解析的引用(对象或函数)时,linker(有时是链接加载器)“完成”。

b) 是的 - 见 a)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM