静态与动态链接

时间:2015-12-24 13:38:30

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

我试图理解ELF对静态与动态链接程序的看法。

我理解这是静态链接的工作原理: enter image description here

就我而言,我有两个文件if(DEBUG) { ... } foo.c。 我也有他们的目标文件; bar.cfoo.o。 使用bar.o命令,我可以在每个文件中看到重定位。

如何静态关联objdumpfoo.o

如何动态关联bar.ofoo.o

如何查看输出文件的区别?

1 个答案:

答案 0 :(得分:3)

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

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

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