能否通过GNU ld版本脚本仅暴露指定版本LIB_0的符号?
仅暴露指定版本符号的GNU LD版本脚本配置
完全可以通过调整GNU LD的版本脚本,实现只暴露与LIB_0关联的符号、忽略LIB_1符号的需求,具体配置方式如下:
版本脚本示例
创建如下版本脚本(比如命名为restrict_version.lds):
LIB_0 { global: // 明确列出所有需要对外暴露的LIB_0版本符号 func_old; // 替换为实际的LIB_0符号名 local: *; // 所有未明确声明为global的符号均设为局部,不对外暴露 }; // 即使LIB_1在代码中存在关联符号,也不将其设为全局暴露 LIB_1 { global: // 此处不列出任何符号 local: *; };
关键配置说明
- LIB_0段:通过
global关键字明确指定需要对外暴露的符号,再用local: *兜底,确保所有未被显式声明的符号(包括LIB_1关联的符号)都被设为局部符号,不会出现在动态符号表中。 - LIB_1段:即使保留LIB_1的版本定义,也不在其
global段添加任何符号,彻底阻止该版本的符号对外暴露;如果不需要保留LIB_1的版本信息,也可以直接删除整个LIB_1段。
编译链接命令
编译共享库时,通过-Wl,--version-script参数指定版本脚本:
gcc -shared -fPIC your_source_code.c -Wl,--version-script=restrict_version.lds -o libyourlib.so
验证效果可以用nm -D libyourlib.so命令查看动态符号表,只会看到LIB_0关联的符号。
内容的提问来源于stack exchange,提问作者fusiled
相关产品推荐
相关产品推荐

