如何阻止静态链接GLIBC的.so库导出GLIBC、libstdc++相关符号
解决方案
你可以通过以下几种链接阶段的配置阻止非必要符号导出:
方案1:使用符号版本脚本控制导出范围(最推荐)
这是可控性最高的方案,可以精准控制仅导出你需要对外暴露的接口:
- 新建符号规则文件
morpher.map,内容如下:
{ global: # 此处填写所有你需要对外暴露的函数/变量名,示例: morpher_init; morpher_process; morpher_destroy; local: *; };
- 在原链接命令末尾添加参数
-Wl,--version-script=morpher.map即可。
该规则会将所有未显式列入
global的符号全部标记为隐藏,无论符号来自你自己的代码还是静态链接的libstdc++、libgcc库,完全覆盖编译阶段visibility配置的生效范围。
方案2:使用exclude-libs参数隐藏所有静态库符号
如果不想手动罗列导出接口,可以直接让链接器隐藏所有来自静态库的符号:
修改你的链接命令,添加-Wl,--exclude-libs=ALL参数:
g++ -shared -o morpher.so -static-libstdc++ -static-libgcc -Wl,-L. \ -Wl,--whole-archive -l:hello.o -l:libmorpher.a -Wl,--no-whole-archive \ -Wl,--exclude-libs=ALL
如果需要仅隐藏特定静态库的符号,可以把
ALL替换为库名列表,用冒号分隔,例如-Wl,--exclude-libs=libstdc++.a:libgcc.a
验证效果
修改完成后执行以下命令查看动态导出符号表,确认仅保留你需要的公开接口:
nm -D morpher.so
内容的提问来源于stack exchange,提问作者Sergey Slepov
相关产品推荐
相关产品推荐

