我试图理解ELF对静态与动态链接程序的看法。
就我而言,我有两个文件if(DEBUG) { ... }
和foo.c
。
我也有他们的目标文件; bar.c
和foo.o
。
使用bar.o
命令,我可以在每个文件中看到重定位。
如何静态关联objdump
和foo.o
?
如何动态关联bar.o
和foo.o
?
如何查看输出文件的区别?
答案 0 :(得分:3)
动态链接是目前大多数链接器的默认模式。如果要静态链接,则必须在链接时使用-static
标记。澄清的是,当我说“动态链接”与“静态链接”时,我指的是与外部库的链接,而不是生成一个库,而这个库又可以链接(动态或静态)。
在传递给链接器的目标文件中无法看到差异,因为它与编译器和目标文件生成无关,结果只能在链接后生成的可执行程序中看到,并且最大的区别是可执行文件很可能会更大。
生成的和完全链接的可执行文件将更大,因为所有库(其中都有静态库)实际上将完全链接到可执行程序中。它基本上包括库对象文件和您自己的目标文件。实际上,在POSIX平台上,静态库只是目标文件的归档。