【问题标题】:Make thin shared library制作瘦共享库
【发布时间】:2017-09-22 09:33:40
【问题描述】:

我有很多 lib*.a 文件,它们来自 GHC Haskell 项目。只有我需要的符号是:

extern "C" void init();
extern "C" void show();
extern "C" void hide();
extern "C" void close();

有很多未定义的符号(我确定它是 Haskell 特有的)(CMakeLists.txt 的一部分):

list(APPEND LINKER_UNDEF "-Wl,-u,hs_atomic_or8")
list(APPEND LINKER_UNDEF "-Wl,-u,hs_atomic_or16")
list(APPEND LINKER_UNDEF "-Wl,-u,hs_atomic_or32")
list(APPEND LINKER_UNDEF "-Wl,-u,hs_atomic_or64")
list(APPEND LINKER_UNDEF "-Wl,-u,hs_atomic_xor8")
list(APPEND LINKER_UNDEF "-Wl,-u,hs_atomic_xor16")
list(APPEND LINKER_UNDEF "-Wl,-u,hs_atomic_xor32")
list(APPEND LINKER_UNDEF "-Wl,-u,hs_atomic_xor64")
... # plenty of them

如果 Haskell 项目是独立应用程序,它的大小约为 5MB,但 lib*.a 文件大小的总和约为 70MB。

我想制作最小尺寸的lib*.so 文件。这意味着我只需要 initshowhideclose 所依赖的符号。如果我使用-Wl,--whole-archive,那么*.o 文件从*.a 文件导出的所有符号都将包含在生成的共享库*.so 文件中。但是如何使链接器仅包含必需的符号(如果不能省略,则可能加上临时 *.c 文件中的 main 符号)?我可以构建矛盾的 ELF 文件吗:它是 *.so 文件和简单的 ELF 可执行文件?我可以使用-rdynamic 选项来实现这一点吗?

【问题讨论】:

    标签: gcc g++ shared-libraries ghc elf


    【解决方案1】:

    如何使链接器只包含必需的符号

    链接器在链接静态库时会这样做:它只包括那些解析当前未解析符号的目标文件。

    链接共享库时,它必须导出所有带有外部链接的符号(除非您使用自定义链接器脚本),因为此时无法获得有关实际使用符号的信息。

    如果您想以静态方式最小化应用程序文件链接的总大小以避免传送未使用的代码,否则这些代码将出现在共享库中。

    【讨论】:

      猜你喜欢
      • 2021-09-24
      • 2021-02-27
      • 2021-08-27
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      相关资源
      最近更新 更多