RH8下链接时能否将无版本xdr_wrapstring映射至xdr_wrapstring@GLIBC_2.2.5?
解决RH8下静态库xdr_wrapstring符号解析问题
当然可以配置链接器将无版本的xdr_wrapstring解析为xdr_wrapstring@GLIBC_2.2.5,下面提供两种可靠的方案:
方案一:直接用链接器--defsym选项
在你的链接命令中添加如下参数,直接让链接器为符号创建别名:
-Wl,--defsym,xdr_wrapstring=xdr_wrapstring@GLIBC_2.2.5
比如原本的链接命令是:
gcc -o your_app main.o -L./lib -lyour_static_lib
修改后变成:
gcc -o your_app main.o -L./lib -lyour_static_lib -Wl,--defsym,xdr_wrapstring=xdr_wrapstring@GLIBC_2.2.5
这个选项会告诉链接器,把所有对无版本xdr_wrapstring的引用,都重定向到带版本标记的xdr_wrapstring@GLIBC_2.2.5符号上。
方案二:创建符号别名包装文件
如果链接器选项的方式在某些复杂场景下不生效,可以手动写一个小的C文件来实现符号别名:
- 创建
wrap_xdr.c文件,内容如下:
#include <rpc/xdr.h> // 为无版本符号创建别名指向版本化符号 void xdr_wrapstring(XDR *xdrs, char **cpp) __attribute__((alias("xdr_wrapstring@GLIBC_2.2.5")));
- 编译这个文件为目标文件:
gcc -c wrap_xdr.c -o wrap_xdr.o
- 将这个目标文件和你的静态库一起链接:
gcc -o your_app main.o wrap_xdr.o -L./lib -lyour_static_lib
这个方法通过编译器的alias属性,显式将无版本符号映射到系统libc提供的版本化符号上,兼容性更好。
验证方法
你可以先检查静态库中引用的符号类型,确认是无版本的未定义符号:
nm -A your_static_lib.a | grep xdr_wrapstring
如果输出是U xdr_wrapstring(U表示未定义),说明上述方案可以生效。
内容的提问来源于stack exchange,提问作者zrb
相关产品推荐
相关产品推荐

