【问题标题】:Suspicious static-linked executable file size可疑的静态链接可执行文件大小
【发布时间】:2014-09-24 10:07:40
【问题描述】:

我有一个 BB 10/QNX 应用程序,我需要在其中使用比 BB 10 上的默认版本更新的 SQLite。我想我可以通过将我自己的 SQLite 代码与我的应用程序链接来做到这一点。我意识到在我的 qmake 生成的 Makefile 中,选项 -lsqlite3 被传递给 qcc。在库位置(/opt/bbndk/target_10_2_0_1155/qnx6/armle-v7/usr/lib)我找到了以下文件:

size filename
559386 libsqlite3.a
560662 libsqlite3S.a
15 libsqlite3.so -> libsqlite3.so.1
496503 libsqlite3.so.1

我认为我可以用我自己的从最新的 sqlite3.c(合并)编译的文件替换 libsqlite3.a。让我感到困惑的是,我的应用程序可执行文件的大小仅为 180 kB,因此 libsqlite3.a 中的代码似乎不存在于其中。如果 SQLite 是动态链接的,我希望应用程序存档 (.bar) 包含 libsqlite3.so,这也不正确,因为存档只有 130 kB 大。应用程序怎么可能使用 SQLite(通过 Qt 数据库类),但 SQLite 代码从未进入应用程序存档?

【问题讨论】:

  • 编译器将优化并忽略静态库中不需要/使用的东西,同时构建可执行文件。可执行文件不需要总是包含静态库中的所有代码。
  • 是的,这就是 .a 存档的全部想法。如果这个库做得很好并且真的被分成了非常小的编译单元,那么加载器真的只需要它在最终可执行文件中需要的东西。

标签: c makefile linker blackberry-10 qnx


【解决方案1】:

静态版

将可执行文件链接到静态库时,编译器知道您正在构建“成品”:没有任何东西取决于您的可执行文件。它允许编译器包含未使用的代码。假设您只使用了库中的一个函数,它本身没有使用库中的任何其他函数。编译器将只选择与该特定函数对应的机器码,而忽略其余部分。

动态版

关于酒吧档案和动态库的大小,它归结为真正的酒吧档案。它只是一个 zip 存档(可能添加了一些元数据,不知道详细信息)。两种可能:要么 .so 文件被大大压缩,要么编译器依赖系统库并且没有将其捆绑在 bar 存档中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 2013-06-24
    • 2015-10-24
    • 1970-01-01
    • 2010-12-16
    相关资源
    最近更新 更多