我是否需要静态库来静态链接?

Lir*_*evi 9 c linux static-libraries static-linking

在'C',Linux,

我是否需要静态链接静态链接,或者我需要的共享库?如果没有,为什么不呢?(它们不包含相同的数据吗?)

eph*_*ent 11

是的,您需要静态库来构建静态链接的可执行文件.

静态库是编译对象的捆绑包.当您静态链接到库时,它实际上与获取该库的编译结果,在当前项目中解压缩它们并使用它们就好像它们是您自己的对象一样.

动态库已经链接.这意味着某些信息(如重定位)已经被修复并丢弃.

此外,必须将动态库编译为与位置无关的代码.这不是对静态库的限制,并且导致某些常见平台(如x86)的性能存在显着差异.

存在像ELF Statifier这样的工具,它们试图将动态链接的库捆绑成动态链接的可执行文件,但是在所有情况下都很难生成正确工作的结果.

  • ELF Statfier加载可执行文件及其所有库,然后获取进程内存的快照.运行输出图像时,任何会导致内存布局更改的内容(例如随机VDSO)都将导致错误操作.任何其他方法都需要重新发明动态链接器. (2认同)
  • 静态(编译时)链接器和动态(运行时)链接器的操作非常不同.静态链接器将对象中符号的引用重写为固定引用 - 要么是同一图像中的重定位符号,要么是跳转到符号表中正确条目的存根.动态链接器打开文件并使用特定规则将它们映射到内存的各个部分,填充符号表,然后跳转到初始化代码. (2认同)

小智 6

没有静态编译,只有静态链接.为此,您需要静态库.静态和动态链接之间的区别在于,对于前者,名称在链接时解析(在编译时之后),对于后者,它们在程序开始运行时被解析.

静态和动态库可能包含也可能不包含相同的信息,具体取决于许多因素.关于是静态还是动态链接代码的决定是一个重要的决定,并且通常会影响应用程序架构.