【问题标题】:size of executables from dynamic/static lib来自动态/静态库的可执行文件的大小
【发布时间】:2012-08-24 12:00:19
【问题描述】:

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

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

如果我使用共享库/静态库,我想检查我得到的可执行文件的大小,所以我从文件 file1.c 和 file2.c。

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

我正在使用以下命令:

静态库案例

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 大。我希望这个结果是相反的。有人可以解释一下原因吗?

【问题讨论】:

    标签: shared-libraries static-libraries


    【解决方案1】:

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

    【讨论】:

    • 大小有大约 3 KB 的差异。是的,你是对的......我正在测试的库是微不足道的,并且只包含我正在调用的 2 到 3 个函数。我将尝试使用更大的库,看看我得到了什么。感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2013-06-24
    • 2015-05-14
    • 2015-02-23
    相关资源
    最近更新 更多