c - 链接器如何决定要包含库的哪些部分?

标签 c linker

假设库 A 有 a() 和 b()。如果我将我的程序 B 与 A 链接并调用 a(),b() 是否包含在二进制文件中?编译器是否查看程序中是否有任何函数调用 b()(也许 a() 调用 b() 或另一个库调用 b())?如果是这样,编译器如何获得这些信息?如果不是,如果我链接到一个大库但只使用一个次要功能,这不是对最终编译大小的巨大浪费吗?

最佳答案

看看link-time optimization .这必然取决于供应商。它还将取决于您如何构建二进制文件。 MS 编译器(至少从 2005 年起)提供了一种叫做 Function Level Linking 的东西。 -- 这是另一种剥离不需要的符号的方法。 This帖子解释了如何使用 GCC 实现相同的目的(这是旧的,GCC 必须继续前进,但内容与您的问题相关)。

另请查看 LLVM实现(和示例部分)。

我建议你也看看Linkers and Loaders约翰·莱文 (John Levine) 着——非常棒的读物。

关于c - 链接器如何决定要包含库的哪些部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/715502/

相关文章:

c - C 语言中的二进制 IO 发生了什么?

c - 如何清除 C 中带有关系警告的 Signed-unsigned 混合?

c - 结构内部指向动态二维数组的指针

c - C 中使用指针的 for 循环声明

Linux - 有没有办法拥有一个包含资源的简单静态库?

c - MPI_Gather C 中的内存寻址

c++ - 链接 mysqlpp_d.lib 的多个问题

linux - 加载现有库失败

haskell - 如何将自定义对象文件与 Haskell 库链接?

c++ - 导入库创建,C++/VisualStudio2013