You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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命令检查测试二进制文件:
    nm your_test_binary | grep snprintf
    
    能直接确认snprintf是否确实指向___ieee128_snprintf。

内容的提问来源于stack exchange,提问作者narwahl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 11:15:47