我正在尝试了解 ELF 对于静态链接程序与动态链接程序的区别。
在我的例子中,我有两个文件,foo.c
和 bar.c
。
我也有他们的目标文件; foo.o
和 bar.o
。
使用 objdump
命令,我可以看到每个文件中的重定位。
如何静态链接foo.o
和bar.o
?
如何动态链接foo.o
和bar.o
?
如何查看输出文件的差异?
最佳答案
动态链接是当今大多数链接器的默认模式。如果你想静态链接,你必须在链接时使用 -static
标志。澄清一下,当我说“动态链接”与“静态链接”时,我指的是与外部库的链接,而不是生成可以链接(动态或静态)的库。
在你传递给链接器的目标文件中看不出差异,因为它与编译器和目标文件生成无关,结果只能在链接后的结果可执行程序中看到,并且最大的不同是可执行文件很可能会更大。
生成的完全链接的可执行文件会更大,因为所有库(其中有静态库)实际上都将按字面意思链接到可执行程序中。它基本上包括库目标文件和您自己的目标文件。实际上,在 POSIX 平台上,静态库只是目标文件的归档。
关于c - 静态与动态链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34453675/