Bazel linkshared生成过大共享库:如何仅链接必要符号?
解决Bazel构建共享库体积过大的问题
当使用cc_binary搭配linkshared=1构建共享库时,Bazel默认会将所有依赖的符号全部纳入,而普通二进制文件会通过链接阶段的垃圾回收优化剔除未使用的符号,这是两者体积差距悬殊的核心原因。以下是具体的优化方案:
改用
cc_library配合linkshared构建共享库
避免直接用cc_binary编译并链接共享库,拆分编译与链接步骤:先用cc_library编译核心代码,再通过cc_binary链接成共享库。示例BUILD配置:cc_library( name = "core_lib", srcs = ["server.cc"], deps = [...], visibility = ["//visibility:private"], ) cc_binary( name = "libs.so", deps = [":core_lib"], linkshared = 1, linkopts = ["-Wl,--as-needed", "-Wl,--gc-sections"], )添加链接器优化参数
在linkopts中加入以下参数,强制剔除未使用的符号与冗余依赖:--gc-sections:让链接器回收未被引用的代码段和数据段--as-needed:仅链接实际被用到的依赖库,避免拉入未使用的依赖
限制符号可见性
通过编译选项默认隐藏所有符号,仅导出必要的对外接口:
在BUILD规则中添加编译选项:copts = [ "-fvisibility=hidden", "-DEXPORT_SYMBOL=__attribute__((visibility(\"default\")))", ]然后在代码中,仅对需要对外暴露的函数/变量添加
EXPORT_SYMBOL标记:EXPORT_SYMBOL void public_api_function();启用优化编译模式
构建时使用bazel build --compilation_mode=opt //path/to:libs.so,开启编译级别的优化(如死代码消除),配合链接优化进一步缩小体积。
内容的提问来源于stack exchange,提问作者song xs
相关产品推荐
相关产品推荐

