c - 静态与动态链接

标签 c gcc linker static-linking dynamic-linking

我正在尝试了解 ELF 对于静态链接程序与动态链接程序的区别。

我知道静态链接是这样工作的: enter image description here

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

如何静态链接foo.obar.o

如何动态链接foo.obar.o

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

最佳答案

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

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

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

关于c - 静态与动态链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34453675/

相关文章:

c - pthread_create 给出一个段错误

c - 返回c中的缓冲区

c - 从 C 中的控制台输出中获取先前打印的行

C-创建一个文件

c++ - 如何定义从何处加载库

c++如何在运行时链接函数声明?

gcc - libav 将音频持续时间设为负数

C++:元组列表 C++11/1y

c - 在 STM32 中从 RAM 执行代码

gcc - 在 Linux 上编译/链接电子文本编辑器时出错