制作薄的共享库



我有很多 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,则将*.a文件从CC_11文件导出的所有符号都将包含在结果的共享库*.so文件中。但是,如何使链接器仅包括所需的符号(如果无法省略,也许是临时*.c文件中的main符号)?我可以构建矛盾的精灵文件:它是*.so文件和简单的精灵可执行吗?我可以使用-rdynamic选项实现此目标吗?

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

链接器在针对静态库链接时这样做:它仅包括那些解析当前未解决符号的对象文件。

链接共享库时,它必须将所有符号带入外部链接(除非您使用自定义链接器脚本),因为有关实际使用的符号的信息在此时间点不可用。

如果要最大程度地减少应用程序文件的总大小,以避免运送未使用的代码,否则将存在于共享库中。

相关内容

  • 没有找到相关文章

最新更新