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

amd64主机交叉编译shc到ARM时链接报rpl_malloc未定义错误

交叉编译shc到ARM平台时rpl_malloc/rpl_realloc未定义链接错误修复

问题场景

当前操作链路:

  • 主机环境:amd64架构
  • 交叉编译工具链:arm-linux-gnueabi-gcc
  • 初始配置命令:CC=arm-linux-gnueabi-gcc ./configure --host=arm
  • 报错触发时机:执行make进入程序链接阶段
  • 完整报错日志:
Making all in src
make[1]: 进入目录"/shc/src"
arm-linux-gnueabi-gcc  -g -O2   -o shc shc.o  
shc.o: 在函数"eval_shell"中:
/shc/src/shc.c:1010: 对"rpl_malloc"的引用未定义
shc.o: 在函数"make"中:
/shc/src/shc.c:1304: 对"rpl_realloc"的引用未定义
collect2: error: ld returned 1 exit status
Makefile:326: 目标"shc"的指令执行失败
make[1]: *** [shc] Error 1
Makefile:414: "all-recursive"的指令执行失败
make: *** [all-recursive] Errore 1

报错核心原因

该错误是GNU Autotools构建系统在交叉编译场景下的典型适配问题:

  • 本地编译时,configure脚本会在当前主机环境检测系统自带的malloc/realloc实现是否符合POSIX标准,如果判断实现存在缺陷,就会自动给代码中的malloc/realloc调用加rpl_前缀做重命名,同时生成对应的兼容实现文件完成替换
  • 交叉编译时,configure的检测逻辑完全基于x86主机环境运行,不会对目标ARM平台的libc实现做有效校验。当ARM目标平台的libc本身已经提供了标准合规的malloc/realloc实现时,对应的rpl_malloc/rpl_realloc兼容实现文件不会被纳入编译列表,最终链接阶段就会出现未定义符号的报错。

标准修复步骤

  1. 清理之前配置生成的残留中间文件,避免旧配置干扰:
    • 进入shc源码根目录,执行清理命令:make distclean
  2. 重新执行configure配置,手动关闭malloc/realloc的兼容替换检测,从根源规避rpl符号生成逻辑:
    • 执行配置命令:
      CC=arm-linux-gnueabi-gcc ./configure --host=arm ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes
      
    • 新增两个参数的作用:直接告知configure脚本,目标平台的malloc支持传入0参数返回合法指针、realloc支持传入0参数等价于malloc操作,完全符合标准要求,无需额外生成带rpl前缀的兼容实现。
  3. 重新触发编译流程:
    • 直接运行make完成构建,即可通过之前报错的链接环节。

备选快速修改方案:如果已经完成configure配置不想重新执行全流程,可直接手动修改源码目录下的config.h文件,找到#define malloc rpl_malloc、#define realloc rpl_realloc两行宏定义并注释掉,再重新执行make即可完成链接。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 23:57:00