制作瘦共享库

时间:2017-09-22 09:33:41

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

我有很多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文件中。但是如何使链接器只包含必需的符号(如果不能省略,则可能来自ad-hoc main文件加*.c符号)?我可以构建一个矛盾的ELF文件:它同时是*.so文件和简单的ELF可执行文件吗?我可以使用-rdynamic选项实现此目的吗?

1 个答案:

答案 0 :(得分:2)

  

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

链接器在链接静态库时执行此操作:它仅包含解析当前未解析符号的那些目标文件。

链接共享库时,必须使用外部链接导出所有符号(除非使用自定义链接描述文件),因为此时实际使用的符号信息不可用。

如果要静态地最小化应用程序文件链接的总大小,以避免发送未使用的代码,否则将出现在共享库中。