2017-09-22 115 views
1

我有大量的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文件的最小尺寸。這意味着我只需要符號initshowhide,close取決於。如果我使用-Wl,--whole-archive,那麼*.o文件從*.a文件導出的所有符號都將包含在生成的共享庫*.so文件中。但如何讓鏈接器只包含必需的符號(可能加上來自ad-hoc *.c文件的main符號,如果不能省略)?我可以創建ELF文件,這是矛盾的:它是*.so文件和簡單的ELF可執行文件在同一時間?我可以使用-rdynamic選項來實現嗎?

回答

2

如何使連接器只包括需要的符號

鏈接程序,對靜態庫鏈接時:它只包括解決目前尚未解決的符號的目標文件。

鏈接共享庫時,必須使用外部鏈接導出所有符號(除非使用自定義鏈接描述文件),因爲此時實際使用的符號信息不可用。

如果您希望靜態縮小應用程序文件鏈接的總大小以避免傳送未使用的代碼,否則這些代碼將存在於共享庫中。