我有大量的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
選項來實現嗎?