来自动态/静态库的可执行文件的大小

时间:2012-08-24 12:00:19

标签: shared-libraries static-libraries

我只是试验静态和动态库的东西。我制作了两个.c文件(比如file1.c,file2.c)和两个.h文件,其中包含分别定义和声明的一些函数。

我还创建了一个新的.c,它将调用以上两个描述的.c文件中的函数。

如果我使用共享库/静态库,我想检查我得到的可执行文件的大小,所以我从.os的.os创建了一个静态库(libstat.a)和一个共享库(libshar.so)。 files file1.c和file2.c。

在将这些库链接到我的主.c上时,我发现在动态库的情况下,可执行文件的大小更多。这不是预期的,对吗?在使用共享库的情况下,lib是运行时加载的,为什么它有更大的大小?

我使用以下命令:

静态lib案例

gcc -c file1.c file2.c

ar -cvq libstat.a file1.o file2.o

gcc -o ex1 mainprg.c -L . -lstat

动态/共享库案例

gcc -c -fpic file1.c file2.c

gcc -shared file1.o file2.o -o libshar.so

gcc -o ex2 mainprg.c -L . -lshar

我发现libshar.so的大小比libstat.o大,而ex2的大小超过ex1。我预计这个结果会逆转。有人可以解释一下原因吗?

1 个答案:

答案 0 :(得分:1)

多少/多少?如果库中的东西是微不足道的话,我会发现在动态二进制文件中使用更多的空间而不是静态时,我不会觉得太令人惊讶。动态二进制文件需要包含额外的符号信息和其他元数据以便于运行时链接。静态链接时可以省略大部分元数据,因此如果库中的函数和/或数据相当小,那么可能就是您所看到的。但是,对于更实质的库,有更多的代码和数据,或者当你链接到许多不同的库时,二进制文件应该相当小......