【问题标题】:Static vs Dynamic Linking静态与动态链接
【发布时间】:2015-12-24 13:38:29
【问题描述】:

我试图了解 ELF 对于静态链接程序与动态链接程序的外观。

我知道这是静态链接的工作原理:

就我而言,我有两个文件,foo.cbar.c。 我也有他们的目标文件; foo.obar.o。 使用objdump 命令,我可以看到每个文件中的重定位。

我如何静态地链接foo.obar.o

我如何动态地链接foo.obar.o

如何查看输出文件的差异?

【问题讨论】:

    标签: c gcc linker static-linking dynamic-linking


    【解决方案1】:

    动态链接是当今大多数链接器的默认模式。如果要静态链接,则必须在链接时使用-static 标志。澄清一下,当我说“动态链接”与“静态链接”时,我指的是与外部库的链接,而不是生成可以反过来链接(动态或静态)的库。

    在传递给链接器的目标文件中看不到差异,因为它与编译器和目标文件生成无关,结果只能在链接后生成的可执行程序中看到,并且最大的区别是可执行文件很可能会更大。

    生成的完全链接的可执行文件会更大,因为所有库(有静态库的库)实际上都将直接链接到可执行程序中。它基本上包括库目标文件和您自己的目标文件。实际上,在 POSIX 平台上,静态库只是目标文件的存档。

    【讨论】:

    • 您的回答有点误导。链接器命令行上的目标文件始终彼此静态链接,-static 标志仅与库操作数有关。如果您可以将其放在问题的上下文中,那就太好了(如何链接foo.obar.o...)。
    • 特别是,main.oswap.o 都不会创建动态加载的共享对象。
    • @FUZxxl 你能给出命令以静态和动态链接源文件吗?链接源文件和库有什么区别?
    • @AdegokeA 当您调用链接器时,目标文件总是彼此静态链接。这就是链接器的作用。动态与静态链接仅适用于库操作数(即-lsomething),然后您根据需要提供-shared-static
    • @AdegokeA 使用静态链接(除非将-r 传递给链接器,在这种情况下,输出再次是目标文件),结果是整个程序。如果foo.cbar.c 没有形成完整的程序,静态链接将失败。我上面错了,-shared 创建一个共享对象-dynamic 进行动态链接。 -shared 有效,因为它创建了一个不需要完整的共享库。
    猜你喜欢
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    相关资源
    最近更新 更多