繁体   English   中英

关于C / C ++静态库的推理

[英]reasoning about C/C++ static libraries

我从来没有想过下面的问题,但由于我现在不得不在我的代码中处理一堆依赖项,我认为我最好直接了解我的事实。 让我们将其限制为现代Linux版本,例如ubuntu amd64。

由于静态库不包含动态库引用,如何在静态库中解析未定义的符号? 依赖二进制文件可以动态加载未定义的符号,还是编译时必须由另一个静态库或目标文件解析符号?

编译器是否可以通过链接动态库来解析(依赖于静态库的应用程序)的依赖关系,如果是这样,代码文本会通过静态解析为生成的二进制文件,还是存在动态引用?

例如,静态库L使用来自libc6.so malloc ,它将由应用程序A LA都会动态地使用libc6.so中的malloc吗?

静态库只是一起存档的目标文件列表。

如何在静态库中解析未定义的符号?

它们没有被解析,因为没有未定义的符号。 仅在链接阶段将符号视为未定义,并且在创建静态库时不会进行链接。

将二进制文件与静态库链接时,可能存在未定义的符号。 在这种情况下,静态库被视为程序的一部分,因此所有对该静态库中使用的符号的引用必须在您构建的程序的范围内可用。 比如说,如果程序A链接到使用来自其他库D符号C的静态库B ,则程序A必须与BD链接。

可以依赖二进制动态加载未定义的符号

是的,它可以。 但除非你真的需要懒惰的动态分辨率,否则你不应该这样做。

或者必须在编译时由另一个静态库或目标文件解析符号

对象文件以及静态库不解析任何符号。 它就是连接器。

可能编译器解决了......

编译器不解析任何依赖项。 这是一个链接器的工作。 可以在链接时解析依赖关系,也可以在动态链接器的运行时解析依赖关系。

依赖于(依赖于静态库的应用程序)依赖于动态库,...

链接器可以理解您使用的静态库取决于您链接的动态库中的符号。

如果是这样,代码文本将通过静态解析为生成的二进制文件,还是存在动态引用?

如果您链接到共享库,则程序中的任何内容都不会静态可用。 这就是共享库的重点。 唯一的例外是LTO。 对于您链接的静态库,该静态库中的任何内容都不会动态可用,编译后会被删除,并且会删除那些未使用的符号。

例如,静态库L使用来自libc6.so的malloc,它将由应用程序A使用.L和A是否会动态使用libc6.so中的malloc?

是的,除非malloc()的定义在编译静态库和编译器时可用,因为某种原因只是将malloc()的主体内联到静态库的代码中。 但是使用malloc()它不会发生。 可能会与其他功能发生冲突。

一个静态库(一个foo.a文件) - 实际上是 - 一堆用ar (归档器)打包的目标文件( xoyo ,...)。

此链接时使用此静态库,以满足其他未定义的引用。 链接时不满意的一切(编译时间在这里并不重要),必须在加载时通​​过动态库( bar.so文件)来满足。

在上一个例子中,使用静态库L和程序A,两个(A,L)将使用来自libc6.so的相同malloc,只要你不使用预加载 ,内联mallocs可能来自不同的头文件或其他技巧,你没有提到。

暂无
暂无

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

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