Gcc 创建精简共享库

Gcc 创建精简共享库,gcc,g++,shared-libraries,ghc,elf,Gcc,G++,Shared Libraries,Ghc,Elf,我有很多lib*.a文件,它们来自GHC Haskell项目。我需要的唯一符号是: extern "C" void init(); extern "C" void show(); extern "C" void hide(); extern "C" void close(); 有很多未定义的符号(我确信它是Haskell特有的)(是CMakeLists.txt的一部分): 如果Haskell项目是独立应用程序,其大小约为5MB,但lib*.a文件大小之和约为70MB 我想使lib*.so文件的

我有很多
lib*.a
文件,它们来自GHC Haskell项目。我需要的唯一符号是:

extern "C" void init();
extern "C" void show();
extern "C" void hide();
extern "C" void close();
有很多未定义的符号(我确信它是Haskell特有的)(是
CMakeLists.txt
的一部分):

如果Haskell项目是独立应用程序,其大小约为5MB,但
lib*.a
文件大小之和约为70MB

我想使
lib*.so
文件的大小最小。这意味着我只需要
init
show
hide
close
依赖的符号。如果我使用
-Wl,--whole archive
,则
*.o
文件从
*.a
文件导出的所有符号都将包含在生成的共享库
*.so
文件中。但是如何使链接器只包含所需的符号(如果不能省略,可以加上ad-hoc
*.c
文件中的
main
符号)?我可以构建ELF文件吗?它是矛盾的:它是
*。所以
文件和简单的ELF可执行文件同时存在吗?我可以使用
-rdynamic
选项实现这一点吗

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

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

链接共享库时,它必须导出具有外部链接的所有符号(除非使用自定义链接器脚本),因为此时无法获得有关实际使用符号的信息

如果您希望最小化应用程序文件的总大小,则静态链接以避免发送未使用的代码,否则这些代码将出现在共享库中

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