Fedora36 ppc64le下如何用--wrap处理glibc重定义的snprintf?
解决Fedora36 ppc64le上snprintf Mock失效的问题
问题根源
Fedora36 ppc64le的glibc为了支持128位long double,把标准snprintf符号直接映射到了___ieee128_snprintf,导致你之前用-Wl,--wrap=snprintf设置的包装器根本触发不了。
用--wrap搞定的办法
不用换方案,只要把映射后的符号也一起wrap就行:
- 修改LDFLAGS,同时添加两个wrap选项:
LDFLAGS="-Wl,--wrap=snprintf -Wl,--wrap=___ieee128_snprintf" - 编写包装函数时,两个符号都要处理:
嫌代码重复的话,让// 处理标准snprintf的wrap逻辑 int __wrap_snprintf(char *str, size_t size, const char *format, ...) { va_list args; va_start(args, format); // 这里插入你的Mock逻辑 int ret = __real___ieee128_snprintf(str, size, format, args); va_end(args); return ret; } // 处理ppc64le专属的___ieee128_snprintf的wrap逻辑 int __wrap___ieee128_snprintf(char *str, size_t size, const char *format, va_list args) { // 可以复用上面的Mock逻辑,避免重复代码 va_list args_copy; va_copy(args_copy, args); // 你的Mock代码实现 int ret = __real___ieee128_snprintf(str, size, format, args_copy); va_end(args_copy); return ret; }__wrap_snprintf把参数转成va_list后直接调用__wrap___ieee128_snprintf就行,只写一遍Mock逻辑。
额外注意事项
- 之前Ubuntu上处理
_FORTIFY_SOURCE的操作要保留:在CFLAGS中添加-U_FORTIFY_SOURCE,防止编译器把snprintf替换为__builtin___snprintf_chk导致wrap失效。 - 不确定符号映射情况时,用
nm命令检查测试二进制文件:
能直接确认snprintf是否确实指向nm your_test_binary | grep snprintf___ieee128_snprintf。
内容的提问来源于stack exchange,提问作者narwahl
相关产品推荐
相关产品推荐

