【问题标题】:Do I need static libraries to statically link?我需要静态库来静态链接吗?
【发布时间】:2009-06-20 17:54:19
【问题描述】:

在“C”,Linux,

我需要静态库来静态链接,还是我拥有的共享库就足够了? 如果不是,为什么不呢? (它们不是包含相同的数据吗?)

【问题讨论】:

    标签: c linux static-libraries static-linking


    【解决方案1】:

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

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

    动态库已链接。这意味着像搬迁这样的一些信息已经被修复并丢弃了。

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

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

    【讨论】:

    • 感谢您的精彩回答。但是为什么这么难呢?
    • ELF Statfier 加载可执行文件及其所有库,然后拍摄进程内存的快照。当输出图像运行时,任何会导致内存布局改变的事情(例如随机 VDSO)都会导致不正确的操作。任何其他方法都需要重新发明动态链接器。
    • 为什么很难重新实现动态链接器?不就是图书馆的进出口只有两张表,要搬迁吗?它是链接器,所以它已经实现了一个静态链接器,它知道可执行文件和动态库的文件格式等。
    • 静态(编译时)链接器和动态(运行时)链接器的操作非常不同。静态链接器将对对象中的符号的引用重写为固定引用——要么是同一图像中重新定位的符号,要么是跳转到符号表中正确条目的存根。动态链接器打开文件并使用特定规则将它们映射到内存的各个部分,填充符号表,然后跳转到初始化代码。
    • 当 -bstatic 生效时,共享对象被静态链接到输出文件中。当 -bdynamic 生效时,共享对象是动态链接的。 (aix)ibm.com/support/knowledgecenter/SSGH4D_14.1.0/…
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您链接到静态链接程序的所有库都必须是静态变体。虽然动态 (libfoo.so) 和静态 (libfoo.a) 库具有相同的功能,但它们是不同的格式文件,因此您需要与程序匹配的类型。

      【讨论】:

        【解决方案4】:

        另一个选择是 Ermine (http://magicErmine.com) 它类似于 statifier,但能够处理内存随机化。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多