【发布时间】: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 文件。这意味着我只需要 init、show、hide、close 所依赖的符号。如果我使用-Wl,--whole-archive,那么*.o 文件从*.a 文件导出的所有符号都将包含在生成的共享库*.so 文件中。但是如何使链接器仅包含必需的符号(如果不能省略,则可能加上临时 *.c 文件中的 main 符号)?我可以构建矛盾的 ELF 文件吗:它是 *.so 文件和简单的 ELF 可执行文件?我可以使用-rdynamic 选项来实现这一点吗?
【问题讨论】:
标签: gcc g++ shared-libraries ghc elf