制作瘦共享库
问题描述:
我有大量的lib*.a
文件,其起源于GHC Haskell项目。只有我需要的符号是:制作瘦共享库
extern "C" void init();
extern "C" void show();
extern "C" void hide();
extern "C" void close();
这里有很多不确定的符号(我相信这是哈斯克尔专用)(中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
文件中。但如何让链接器只包含必需的符号(可能加上来自ad-hoc *.c
文件的main
符号,如果不能省略)?我可以创建ELF文件,这是矛盾的:它是*.so
文件和简单的ELF可执行文件在同一时间?我可以使用-rdynamic
选项来实现吗?
答
如何使连接器只包括需要的符号
链接程序,对静态库链接时:它只包括解决目前尚未解决的符号的目标文件。
链接共享库时,必须使用外部链接导出所有符号(除非使用自定义链接描述文件),因为此时实际使用的符号信息不可用。
如果您希望静态缩小应用程序文件链接的总大小以避免传送未使用的代码,否则这些代码将存在于共享库中。